小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
11. Spring IOC 的加载过程
概念态到定义态
- 实例化一个Applicationcontext的对象
- 调用bean土厂后置处理器完成扫描;
- 循环解析扫描出来的类信息,
- 实例化一个BeanDefiniti。n对象来存储解析出来的信息;
- 把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来以便后面实例化bean;
- 再次调用其他bean工厂后置处理器;
定义态到纯净态
-
当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用finishBeanFactorylnitialization方法来实例化单例的beam实例化之前spring要做验证,需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototypej是否abstract等等
-
如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法,
-
推断完构造方法之后spring调用构造方氵去反射实例化一个对象,注意我这里说的是对象、对象、对象,这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean。 从纯净态到成熟态
-
spring处理合并后的beanDefinition
-
判断是否需要完成属性注入
-
如果需要完成属性注入,则开始注入属性 初始化
-
判断bean的类型回调Aware接口
-
调用生命周期回调方法
-
如果需要代理则完成代理 创建完成
-
put到单例池 -> bean完成 -> 存在spring容器中
12.什么是Spring bean? javaBean 和 SpringBean的对象区别
由Spring IOC 容器管理的对象就是Bean。
//对象 bean
UserService bean = applicationContext.getBean(UserService.class);
//对象 JAVA的类就是javaBean
UserService javaBean = new UserService();
13.Spring配置bean的方式
- xml: <bean class="com.tuling. Userservice" id=,"">
- 注解: @Component、@Controller、@Service、 @Repostory)前提:需要配置扫描包
- javaConfig: @Bean
- @import
15.Spring Bean 的几种作用域?
Spring 中 Bean 的作用域通常有下面几种:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的,对单例设计模式的应用。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
- global-session : 全局 session 作用域,仅仅在基于 portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
- application : 全局
xml 方式:
<bean id="..." class="..." scope="singleton"></bean>
注解方式:
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
return new Person();
}
14. Spring的bean是线程安全的吗?
如果在类中声明变量,且有读写(状态改变),则是不安全的。声明在方法中生明则是安全的。
15. Spring如何处理线程并发问题?
- 设置为多例
- 将成员变量放在ThreadLocal中
- 同步锁,在方法上加上synchronized
16. Spring的生命周期回调方法执行顺序
初始化顺序
| 执行顺序 | 实现方式 | 方法 |
|---|---|---|
| 1 | @PostConstruct | 被注解的方法 |
| 2 | initialzingBean | afterPropertiesSet |
| 3 | init-method | 通过配置指定的方法 |
关闭容器时调用顺序
| 执行顺序 | 实现方式 | 方法 |
|---|---|---|
| 1 | @PreDestroy | 被注解的方法 |
| 2 | DisposableBean | destroy |
| 3 | destroy-method | 通过配置指定的方法 |
总结:注解排头method最后