1-什么是Spring Bean
2024-05-09 19:40:04 0 举报
AI智能生成
登录查看完整内容
什么是Spring Bean
作者其他创作
大纲/内容
Spring 帮助程序员管理对象的创建和依赖关系,使组件之间的耦合度降低
右图主要详解Spring 创建对象的过程
扫描配置类
创建Bean定义
第一种情况:有无参构造方法
只有一个构造方法
使用@Autowired指定
否则会报错
有多个构造方法
第二种情况:没有无参构造方法
构造方法(推断)
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
如果该方法返回非 null,则该 Bean 不会继续进行默认的实例化过程,直接使用返回的对象作为 Bean 实例。如果返回 null,则会继续正常的实例化过程。
实例化前(扩展点)
实例化(普通对象)
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
属性缓存、预处理合并后的定义
处理合并后的Bean定义(扩展点)
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
实例化后(扩展点)
InstantiationAwareBeanPostProcessor#postProcessProperties
加在字段上
加在有参的构造方法上
只找到一个
先根据类型找
找不到会报错
找到多个,再根据参数名字去找有没有对应的bean
怎么找?
比如spring实现这个接口,处理@Autowired
属性填充(扩展点)
BeanPostProcessor#postProcessBeforeInitialization
实现:判断方法上是否有注解
应用场景:比如某些属性赋值需要去查数据库
比如spring实现这个接口,处理@PostConstruct
初始化前(扩展点)
如何判断:对象 instance of InitializingBean
如果真,对象类型强制转换(InitializingBean),执行接口方法
实现 InitializingBean
初始化
BeanPostProcessor#postProcessAfterInitialization
查找所有的切面bean
遍历
遍历方法
方法是否匹配UserService,并缓存。回头创建代理对象时,从缓存中直接取被代理的方法,以及代理方法
是否创建代理对象
创建代理对象时,target会赋值为UserService的bean对象
cglib原理:生成代理类继承父类
如果需要创建代理对象
AOP 代理对象通常就是在这个方法中创建的
生成代理类,创建代理对象
如果使用@Transactional
Propagation.NEVER 指的是如果存在事务就抛异常,但是调用a方法时并没有抛出异常。因为调用a方法是target对象调用的,所以在a方法调用b方法时,是感知不到事务的。只有通过代理对象调用b方法,才会抛异常。
第一种方式:将b方法写到一个新的类中,然后UserService中自动注入新类,使用新类的代理对象调用b方法
第二种方式:自己注入自己,使用的就是代理对象
怎么解决?
事务失效原理:
如果不加这个注解,事务管理器和JdbcTemplate调用dataSource方法创建的都是新的。但是如果加了这个注解,spring会先容器找,找不到才调用方法去创建。
@Configuration 作用
spring 实现事务原理
初始化后(扩展点)
spring bean 创建完成,放入单例池
xx.class
0 条评论
回复 删除
下一页