spring简单介绍Bean的生命周期

Bean创建的生命周期

class(用类里面的构造方法反射)–>实例化–>对象—>属性填充(依赖注入)---->初始化afterPropertiesSet—>AOP---->代理对象---->Bean

实例化是得到一个对象的,初始化是执行afterPropertiesSet这个方法的。
就是把这个InitializingBean这个方法强制转换为bean方法

((InitializingBean)bean.afterPropertiesSert());
//强制转换调用afterPropertiesSet()这个方法。
//afterPropertiesSet就是调用自己的方法的一个逻辑
protected Object wrapIfNecessary(Object bean,String beanName,Object cachekey){
    
    
//在当前targetSourcedBeans中存在的bean,表示在实例化之前就产生了代理对象
if (Stringutils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)){
    
    
return bean;
//当前这个bean不用被代理
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))){
    
    
return bean;
}
//先判断当前bean是不是要进行AOP,比如当前bean的类型是Pointcut、Advice、Advisor等那就不需要进行AOP
if(isInfrastructureClass(bean.getClass())|| shouldSkip(bean.getClass(),beanName)){
    
    
this.advisedBeans.put(cacheKey,Boolean.FALSE);
return bean;

aop

1、找出所有的切面
2、UserService—>切点
//判断有切点是和他匹配的,如果有匹配的就是说明它是需要进行aop的
根据类去找切点,切面

//获取当前beanClass所匹配的advisors
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(),beanName,
//根据类去找切点,切面

判断当前这个bean要不要进行aop
之前就去找到所有的切面,然后把找的切面缓存起来,后续在找的话就直接从缓存去找。

整体步骤

spring在扫描的时候发现有一个@Component注解然就知道要基于你这个类去生成一个对象,然后就执行这个bean创造的生命周期
用你的构造方法去实例化一个对象然后再对对象里面的属性填充(赋值)这就是说的依赖注入,把依赖注入的属性都填充完成后,然后就调用对象里面的初始化方法(在你自己定义情况下),然后spring就会去观察你当前这个方法有没有切点切面,有的话就生成一个代理对象,最后把这个代理对象放到spring容器中去,让他成为bean对象,如果你这个对象不用进行aop的话就把你自己实例化出来的对象放到spring容器中去。让他成为bean
最后调用方法的不是代理对象在调用这个方法而是被代理对象在调用这个方法 //基于类里面的构造方法去实例化得到一个对象的
class(用类里面的构造方法反射)—>推断构造方法—>实例化–>对象—>属性填充(依赖注入)---->初始化afterPropertiesSet—>AOP---->代理对象---->Beana 根据Bytype byName 去spring容器中寻找 到这个bean

Guess you like

Origin blog.csdn.net/weixin_44459831/article/details/119268296