1.spring如何创建一个bean对象
类→推断构造方法→普通对象→依赖注入→初始化前(调用@PostConstruct方法)→初始化(initializingbean)→初始化后(AOP)→代理对象→放入map单例池→bean对象
(有aop才会把代理对象装入map 代理对象里面没有依赖注入 没有值 但是会调用普通对象 进去就有值了,没有aop的把普通对象装入map
2 什么是单例池,单例bean
底层用Map<beanName,Bean对象> 多个相同bean是一个实体
多例bean不需要map
3.Bean与pojo区别
区别就是bean经历过依赖注入等
4.@PostConstruct
初始化前(调用方法)用@PostConstruct 反射方法
5.bean实例化与从初始化的区别
实例化是无参构造到对象
初始化是实行实例化的调用initializingbean方法中的afterPropertiesSet
6.bean存在多个构造方法运行哪个
先运行无参构造,如果有写的构造方法 无默认构造方法。
如果有多个有参方法,则报错
可通过@Autowired告诉bean用那个构造方法
7.先bytype 在byname
bean里面传入bean 需要先根据实体类型从map中找到n个类型 再从n个中找到名字一样的。 单例bean可以有多个类型一样的bean 名字不同
8.@Transactional
多个方法都在同一个类中,其中第一个方法中调用了本类中的第二个和第三个方法,这就是自调用。
那么自调用为什么会导致事务失效呢?我们知道Spring中事务的实现是依赖于AOP的,当容器在创建Service这个Bean时,发现这个类中存在了被@Transactional标注的方法(修饰符为public)那么就需要为这个类创建一个代理对象并放入到容器中。由于方法实际上是由Service也就是目标类自己调用的,所以在方法的前后并不会执行事务的相关操作。这也是自调用带来问题的根本原因:自调用时,调用的是目标类中的方法而不是代理类中的方法。
解决办法 在实体类中注册自己实体类
9.@configurattion
进入代理模式 调用一个bean
10.spring为什么用三级缓存来解决循环依赖问题
1.单例池 singletonObjects 完整的bean生命周期
2.第二级缓存 earlySingletonOject 判断出现循环依赖以后aop制作出来的不完整生命周期的bean用来填充循环依赖的属性
3.第三级缓存 singletonFactories 用于提前储存普通对象 lambda 以便于aop创造二级缓存 (lambda里面包括aop 和普通bean 就是跳过属性内的全部内容,打破了依赖循环)