本文已参与「新人创作礼」活动,一起开启掘金创作之路。
-
Bean的创建的生命周期
UserService类 -> 无参构造方法(推断构造方法)->普通对象->依赖注入-> 初始化前(@PostConstruct)-> 初始化(InitializingBean) -> 初始化后(AOP)-->代理对象-->放入单例池Map --> Bean
a) @Autowired,-》 类型,注入优先by Type, 多个情况then by name -> 找不到异常。
b) 默认无参构造。只有一个构造方法也是可以。只有多个有参构造,有异常。 @Autowired 用于一个构造方法,则可以指定使用哪个构造方法。
c) 代理对象在单例池,普通对象不在单例池
d) UserServiceProxy代理对象 -> UserService对象 -> UserService代理对象的.target = 普通对象 --> 完成
AOP eg:
class UserServiceProxy extends UserService {
UserService target;
public void test() {
// @Before 切面逻辑
// target.test();
}
}
-
@Transactional 失效的场景
class UserServiceProxy extends UserService { UserService target; public void test() { // @Transactional // 事务管理器新建一个数据库连接conn, ThreadLocal<Map<DataSource,conn>> // conn.autocommit = false; // target.test(); sql1, sql2, sql3. // conn.commit(); conn.rollback(); } }- 普通对象调用不生效,保证是代理对象在调用方法。
-
什么是单例池?作用是什么?
- singletonObjects Map.
-
Bean初始化前,做一些事情。
- @PostConstruct 注解于init method. 获取所有method, 判断注解是否存在,反射调用
- 实现InitializingBean, 重写方法(afterPropertiesSet()), 实例化后判断类型, 是的话,调用方法。
-
Bean的实例化和初始化区别是什么?
- 初始化就是实例化后执行指定的方法。
-
推断构造方法是什么?
- 多个构造方法,有无参使用无参,有唯一@Autowired注解的构造方法,使用该构造方法。
-
Spring AOP 底层是怎么工作的?
-
Spring 十五底层是怎么工作的?
-
@Configuration注解的作用
- 同样会生成代理对象,当实例化对象的时候,检查对象是否在容器中,在的话用,不在的话先实例化放到容器中,下次再用的时候就可以直接从容器拿到。
- 代理对象中,super.test();
-
Spring 为什么要用三级缓存来解决循环依赖?
- singletonObjects
- earlySingletonObjects
- 三级缓存 singletonFactories lambda , 真正 打破循环的
不考虑AOP,代理对象的二级缓存可以满足,考虑代理对象,二级缓存是有问题的。