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