学习spring注解的详细笔记

给容器中注册组件的方式:

1.包扫描(@ComponentScan)+标注注解(@Controller/@Service/...等等)[局限于自己写的类]
2.@Bean 在被注释的方法中返回组件对象即可[导入的第三方包里边的组件]
3.@Import[快速的给容器中导入一个组件]
    1.@Import(要导入到容器中的组件): 容器中就会自动注入这个组件,id默认是全限定名
    2.ImportSelector:返回需要导入的组件全限定名数组
    3.ImportBeanDefinitionRegistrar:手动注册bean到容器中
4.使用sping提供的FactoryBean(工厂bean)
    1.让自定义的工厂实现FactoryBean<T>接口,默认从容器中获取到的对象是工厂生产的bean
    2.要获取工厂bean的本身需要在bean名称前面加上&符号

bean的生命周期:

bean的创建---初始化---销毁过程
容器管理bean的生命周期:
我们自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
创建对象
    单实例:在容器启动的时候创建
    多实例:在每次获取的时候创建
初始化:
    对象创建完成,并赋值好,调用初始化方法
销毁:
    单实例:容器销毁的时候
    多实例:容器不会管理这个bean,容器不会调用销毁方法
自定义bean的生命周期有4种方法
1.指定初始化方法和销毁方法:通过@Bean注解指定initMethod和destroyMethod
2.通过让Bean实现InitializingBean(定义初始化逻辑),和DisposableBean(定义销毁逻辑)
3.可以使用JSR250的注解
    @PostConstruct:对象创建完成并且属性赋值完成,来执行初始化
    @PreDestroy:在容器销毁之前通知其进行清理工作
4.BeanPostProcessor接口:bean的后置处理器:在bean初始化前后进行一些处理工作
    postProcessBeforeInitializtion方法:在任何初始化之前调用
    postProcessAfterInitializtion方法:在初始化之后调用

BeanPostProcessor原理(源码分析)

通过断点跟踪分析:
在spring的doCreateBean方法中调用栈里边发现initializeBean方法的实现大致流程:
populateBean(beanName, mbd, instanceWrapper);//装填bean(属性装填)
initializeBean{
    applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//得到容器中所有BeanPostProcessor挨个执行postProcessBeforeInitialization,直到其中有方法回null
    invokeInitMethods(beanName, wrappedBean, mbd);//执行自定义初始化方法
    applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//得到容器中所有BeanPostProcessor挨个执行postProcessAfterInitialization,直到其中有方法回null
}

Spring底层对BeanPostProcessor的使用

查看BeanPostProcessor的继承关系可以发现spring源码中有非常多的类实现了此接口:
    比如AsyncAnnotationBeanPostProcessor类(处理@Async注解)、
    ApplicationContextAwareProcessor类(可以帮我们自己的组件注入ioc容器:Test12有示例)等等


bean的赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx

自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFatory,xxx),
自定义组件实现xxxAware,在创建对象的时候,会调用接口规定的方法注入相关组件,
xxxAware的功能是用xxxProcessor实现的
    ApplicationContextAware---------->ApplicationContextAwareProcessor

SpringAop原理【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么】

1.@EnableAspectJAutoProxy:
    @Import(AspectJAutoProxyRegistrar.class):利用AspectJAutoProxyRegistrar自定义给容器中注册bean
        beanName:internalAutoProxyCreator----bean:AnnotationAwareAspectJAutoProxyCreator
    给容器中注册一个叫AnnotationAwareAspectJAutoProxyCreator
2.AnnotationAwareAspectJAutoProxyCreator
    AnnotationAwareAspectJAutoProxyCreator
        ->AspectJAwareAdvisorAutoProxyCreator
            ->AbstractAdvisorAutoProxyCreator
                ->AbstractAutoProxyCreator
                    implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
    关注后置处理器(在bean初始化完成前后做事情)、自动注入beanFactory
    AbstractAutoProxyCreator.setBeanFactory()
    AbstractAutoProxyCreator.有后置处理器

    AbstractAdvisorAutoProxyCreator.setBeanFactory()->initBeanFactory():override

    AnnotationAwareAspectJAutoProxyCreator.initBeanFactory

    断点以上流程:
    1.传入配置类,创建ioc容器
    2.注册配置类,调用refresh(),刷新容器
    3.registerBeanPostProcessors(beanFactory) : 注册bean的后置处理器,用来拦截bean的创建
        1.先获取ioc容器已经定义的需要创建对象的所有beanPostProcessor
        2.给容器中添加别的BeanPostProcessor
        3.优先注册实现了PriorityOrdered接口的BeanPostProcessor
        4.再给容器中注册实现了Ordered接口的BeanPostProcessor
        5.最后注册没有实现优先级接口的BeanPostProcessor
        6.注册BeanPostProcessor,实际上就是创建BeanPostProcessor对象,保存在容器中
            创建org.springframework.aop.config.internalAutoProxyCreator的BeanPostProcessor[AnnotationAwareAspectJAutoProxyCreator]
                1.创建bean的实例
                2.populateBean 给bean的各个属性赋值
                3.initializeBean 初始化bean
                    1.invokeAwareMethods 处理Aware接口方法的回调
                    2.applyBeanPostProcessorsBeforeInitialization 应用后置处理器的postProcessorBeforeInitialization
                    3.invokeInitMethods 执行自定义的初始化方法
                    4.applyBeanPostProcessorsAfterInitialization 执行后置处理器的postProcessorAfterInitialization
                4.BeanPostProcessor[AnnotationAwareAspectJAutoProxyCreator] 创建成功 -->aspectJAdvisorFactory
        7.把BeanPostProcessor注册到BeanFactory中
            beanFactory.addBeanPostProcessor(postProcessor)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值