欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 【JavaWeb后端学习笔记】Spring框架下的Bean管理

【JavaWeb后端学习笔记】Spring框架下的Bean管理

2024/12/22 1:17:52 来源:https://blog.csdn.net/wrjwww/article/details/144373477  浏览:    关键词:【JavaWeb后端学习笔记】Spring框架下的Bean管理

Bean

  • 1、Bean的获取
  • 2、Bean的作用域
  • 3、第三方Bean

1、Bean的获取

默认情况下,Spring项目启动时,会把Bean创建好交给IOC容器管理。当需要使用时,通过@Autowired注解注入或者通过构造方法注入即可。

除此之外还可以通过Spring提供的ApplicationContext类对象获取需要的Bean。
第一步:注入ApplicationContext对象

@Autowired
private ApplicationContext applicationContext;

第二步:在需要使用Bean的地方调用getBean()方法,获取Bean对象

// 方式1:传入Bean对象名,这里返回的是Object对象,因此需要强转
Bean类 bean1 = (Bean)applicationContext.getBean(Bean对象名);
// 方式2:传入Bean的类型。类名.class
Bean类 bean2 = applicationContext.getBean(类名.class);
// 方式3:传入Bean对象名与Bean的类型
Bean类 bean3 = applicationContext.getBean(Bean对象名, 类名.class);

Spring在创建Bean对象时,Bean对象名称默认是类名首字母小写。

2、Bean的作用域

Bean有五种作用域:

作用域说明
singleton容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中)
session每个会话范围内会创建新的实例(web环境中)
application每个应用范围内会创建新的实例(web环境中)

通过@Scope注解设置Bean的作用域。

@Scope("prototype") // 将Bean作用域修改为prototype
@RestController // 将该类注册成Bean,交给IOC容器管理
@RequestMapping("/demo")
@Slf4j
public class DemoController {@GetMappingpublic String demo1() {System.out.println("demo1接口执行...");return "执行结束";}@GetMappingpublic String demo() {System.out.println("demo接口执行...");return "执行结束";}
}

Bean默认是在Spring项目启动时自动创建并交给IOC容器管理的。但是可以通过加@Lazy注解,延缓其创建时间。
当在Bean上加了@Lazy注解后,只有在第一次使用该Bean对象时调用。

3、第三方Bean

在使用第三方包中的工具类时,无法修改其代码,不能在类上加@Component注解以及其衍生注解将其工具类注册成Bean。此时可以通过其他方式注册。步骤为:

  1. 首先定义一个配置类。配置类上加@Configuration注解,声明此类是配置类。配置类最好是放在一个单独的包下管理。
  2. 在类中编写一个方法。方法的返回值类型是要注册的工具类;方法名任意,一般为类名首字母小写;在方法上加@Bean注解。
@Configuration // 声明配置类
public class CommonConfig {@Bean // 注册Beanpublic SAXReader saxReader() { // 方法返回值类型为注册的类return new SAXReader();}
}

如果需要在第三方Bean中注入Bean对象,可以通过@Autowired直接注入,或者在方法中加入形参:

@Bean
public SAXReader saxReader(DeptService deptService) { // 在方法中加入DeptService类型的形参,注入DeptService Bean对象return new SAXReader();
}

第三方Bean名称默认是方法名。

有时候在使用第三方Bean时,发现已经加了相关注解, 但是项目启动时,并没有自动注册这些Bean对象。这可能是因为扫描组件没有扫描到相关包,启动类@SpringBootApplication注解的扫描范围是所在包及其子包。要扫描其他包则需要加@ComponentScan注解,在注解中指定要扫描的包。

给@ComponentScan注解的value属性设置要扫描的包,value属性是一个数组。

注意需要把当前启动类所在的包也传入,因为使用@ComponentScan注解后,会覆盖@SpringBootApplication注解扫描范围。

@ComponentScan({"com.wrj", "com.example"})
@SpringBootApplication
@ServletComponentScan // 使用Filter过滤器时在启动类上加该注解,开启Servlet组件支持
public class TestAliossApplication {public static void main(String[] args) {SpringApplication.run(TestAliossApplication.class, args);}
}

另一种方案是使用@Import注解导入类,导入的类会被Spring加载到IOC容器。
可以导入普通类、配置类、接口实现类
格式:

@Import({"类名.class"}) // 通过@Import注解导入类,交给IOC容器管理
@SpringBootApplication
public class TestAliossApplication {public static void main(String[] args) {SpringApplication.run(TestAliossApplication.class, args);}
}

通常在第三方工具包中都会提供@EnableXxx注解。该注解封装了@Import注解。
可以直接使用@EnableXxx注解完成导入。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com