Spring系列技术开发之Bean
程序员文章站
2022-03-22 10:58:52
这篇文章接着上篇的初入继续往下讲,首先我们讲一下Spring的Bean。文章目录Spring BeanSpring Bean中的作用域有哪些Spring 中的单例 bean 的线程安全问题@Component 和 @Bean 的区别@Bean使用示例将一个类声明为Spring的 bean 的注解有哪些Spring中的Bean生命周期Spring BeanSpring Bean中的作用域有哪些singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。prototy...
这篇文章小宋接着上篇的初入继续往下讲,首先我们讲一下Spring的Bean。
文章目录
Spring Bean
Spring Bean中的作用域有哪些
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
- session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
- global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话
Spring 中的单例 bean 的线程安全问题
大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
常见的有两种解决办法:
1: 在Bean对象中尽量避免定义可变的成员变量(不太现实)。
2:在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在
ThreadLocal 中(推荐的一种方式)。
@Component 和 @Bean 的区别
1:作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。
2:@Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中
(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配
的类自动装配到 Spring 的 bean 容器中)。
@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,
@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
3:@Bean 注解比 Component 注解的自定义性更强,
而且很多地方我们只能通过 @Bean 注解来注册bean。
比如当我们引用第三方库中的类需要装配到 Spring容器时,
则只能通过 @Bean来实现。
@Bean使用示例
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
相当于下面的xml配置:
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
接着下面的这个例子是通过@Component无法实现的
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
将一个类声明为Spring的 bean 的注解有哪些
我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,采用以下注解可实现:
@Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
@Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
@Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。
@Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
Spring中的Bean生命周期
- Bean 容器找到配置文件中 Spring Bean 的定义。
- Bean 容器利用 Java Reflection API 创建一个Bean的实例。
- 如果涉及到一些属性值 利用 set()方法设置一些属性值。
- 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。
- 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
- 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
- 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
- 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
- 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
- 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
- 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
- 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。
如图所示:
和上图差不多的中文版本如下:
ok,本我就讲到这里,基本上Bean的知识点也讲的差不多了,Spring的更多知识会在后续的系列文章中展现出来,谢谢大家的观看,希望能给各位同学带来帮助。如果觉得博主写的还可以的,可以点赞关注。 ????
本文地址:https://blog.csdn.net/weixin_42236165/article/details/110132687
上一篇: Java 求解盛最多水的容器