Spring IOC个人理解

spring

1.手动注入方式

构造器注入  
setter注入:  
  方法+@Autowired 
  实现BeanFactoryPostProcessor    接口并逐个添加类(无法统一配置)后置处理器,当扫描完成后调用
  setAutowireMode方法完成依赖的注入自身需要是个bean

2.自动注入模型

xml配置
  no
  bytype
  byname
  constructor

3.抽象@Autowired @Resource

	I. AutowiredAnnotationBeanPostProcessor 先通过type找没有的话      然后通过name找
		先通过type找到2个         通过name找
		使用field.set
		属于setter的变体
	II.CommonAnnotationBeanPostProcessor先通过name找 再通过type找

4.spring一个对象被spring初始化就执行某些逻辑 生命周期回调

//单例      先构造器
	I.  @PostConstruct注解  
	II. 实现初始化bean接口  重写方法
	III.xml方式配置的init-method方法
	//原型      需要使用getbean方法  顺序和前面一样
	//单例懒加载  效果与原型一致
	顺序基于spring生命周期 -> 先拿到后置处理器处理注解 -> init-method方法 方法里面依次调用接口方法和xml配置

5.factoryBean和普通Bean

	I. 初始化时机不同
	II.存放位置不同
	III.factoryBean既可以生成Bean放到spring容器中,同时自己也是个bean  factoryMethod所在的类不是bean

6.如何将一个对象放到spring中

	I.	实现factoryBean接口
	II.	使用@Bean注解
	III.ac.getBeanFactory().registerSingleton(xxxx);//鸡肋
		仅仅把一个裸对象放到spring容器中没有意义
		无法依赖ac.register(xx)对象,除非先注册自己的bean后注册configuration Bean
		该对象被其他对象引用才会放到spring容器中->其他对象 1.本身就存在于spring容器中 2.

7.使用@Configuration
获取的对象变成代理对象,用来保证里面的bean是单例

8.beanDefination

	手动添加bd:
				实现BeanDefinationRegistryPostProcessor
				获取BeanDefinationRegistry对象setBeanClass 
	存放bean属性的对象 
	RootBeanDefinition:作为父bd、真实bd出现、不能作为子bd出现	
						通过可更改bean属性 
	ChildBeanDefinition:不能作为直接父、普通bd出现  如果属性相同可继承父bd
						 会继承父bd的属性
	GenericBeanDefinition:可以替代Childrenbd
						   不能替代root?

9.生命周期

	I. 	 扫描:将spring自身需要的bean实例化 (reader方法)
			   环境初始化
			   解析类(spring内部后置处理器)      解析成beanDefination 放入 beanDefinationMap 
	II.	 执行后置处理器(spring的、自定义的)修改beandefination属性  然后更新:
				调用beanfactory后置处理器实现自定义的后置处理器
	III. 验证	 判断哪些能实例化(lazy,prototype,dependson注解->先实例化需要的对象)
	IV.	 推断构造方法		--推断构造方法委托给kotlin  
				都满足 == 都不满足  ->返回空,调用无参
	V.	 反射通过反射实例化一个对象
	VI.  缓存注解信息,解析合并后的bd对象
	VII. 提前暴露一个工厂
	VIII.判断是否需要完成属性注入
	IX.	 完成属性注入
	X.	 回调Aware接口
	XI.	 调用生命周期回调方法
	XII. 完成aop代理
	XIII.实例化可以实例化的bean到单例池
	XIV. 手动实例化bean(getBean)
	XV.	 销毁该对象

10.容器关闭之前调用某个方法

	I.	 @PreDestroy
	II.  后置处理器 设置destory方法(close) 

11.新老mybatis对比

	老:通过mapperscan扫描出接口生成代理对象  将代理对象解析成beandefinition 通过spring的后置处理器 放到spring beandefinationmap中
	新:实现bd注册后置处理器后,把MapperScannerConfigurer放到bdMap中该类实现了bd注册后置处理器-->new了一个mapper扫描类(实例化扫描器)->通过扫描器扫描mapper转换成bd

12.循环依赖

	默认支持循环依赖--判断是否支持循环依赖(AbstractAutowireCapableFactory)--
	必须是单例
	可以关闭循环依赖setAllowCircularReferences(false)
	流程:	A依赖B  B依赖A  以A为例
			spring先扫描是否支持循环依赖,把循环依赖的对象
			A创建bean时发现依赖B(需要注入),此时去创建B,创建B时发现需要注入A,于是调用getSingleton方法开始去单例池中获取A,此时单例池中不存在A,也不是正在被创建,返回空。
			dogetbean() 得到空的bean,进行一系列验证(原型、单例、依赖),调用一个重载的getSingleton方法,此时一个ObjectFactory接口传到了getsingleton方法中,再从单例池中获取,获取为空开始创建,往一个集合中表示正在创建
			此时getsingleton的createbean --docreatebean  此时A在三级缓存  暴露一个工厂让AOP提前完成代理,B不存在 --populatebean--执行bean实例化后置感知器,A在二级缓存--判断注入模型--将B放入单例池中,B获得了一个simpleA,A处于二级缓存--B又去循环填充,当populate完成时B循环填充完成          --执行到getBean--getsingleton--此时发现A正在被创建,通过暴露工厂,给B一个简单A,将B放入容器,注入到A,
			注册一次性bean
			A初始话过后,将A从二级缓存转移到一级缓存,此时B已经实例化好了   B直接getBean  单例bean实例化完成

13.设计模式

	代理模式
	工厂模式
	策略模式:调用bean工厂后置处理器 判断我们提供的是父接口还是子接口,根据不同的接口执行不同的方法 
  执行bean后置处理器--属性注入时获取所有bean后置处理器

14.抽象类
提供模板让子类继承,符合其规约

15.扩展点

	BeanFactoryPostProcessor       	用来包装bd属性  bd需要已经存在
	BeanDefinitionResgistryPostProcessor(接口)可用来添加bd	 还有BeanDefinitionRegistry对象
	ImportBeanDefinitionRegistrar

16.beanPostProcessor bean后置处理器

	beanfactoryPostProcessor干预初始化过程,包括注册bd,修改bd属性
	beanPostProcessor干预实例化过程
	InstantiationAwareBeanPostProcessor管理bean要不要实例化:
					ApplicationContextAwareProcessor
					ConfigurationClassPostProcessor
					PostProcessorRegistrationDelegate
					CommonAnnotationBeanPostProcessor
					ApplicationListenerDetector
					AutowireAnnotationBeanPostProcessor
					AnnotationAwareAspectjAutoProxyCreator

17.AOP

什么时候产生代理:
初始化
实例化:
实例化之前--doCreateBean之前--resolveBeforeInstantiation--判断要不要做代理	
实例化中 --createBeanInstance--determineConstructorsFromBeanPostProcessors--第二次
        --doCreateBean--applyMergedBeanDefinitionPostProcessors--第三次
       --addSingletonFactory -> getEarlyBeanReference; 第四次 通过上面bean后置处理器完成属性注入
  1. 代理
AOP中使用了代理
	在使用@Configuration 用来判断是否是一个全注解类,如果是全注解类将会使用cglib对该类进行代理(保证单例核心思想)
	静态代理:
				继承
				聚合
	动态代理:	动态生成java类  然后编译加载
				jdk代理:接口代理	 产生代理快,执行慢	
				cglib代理:继承代理	 产生代理慢,执行快	

容器流程

初始化各种集合
reader 读取AnnotationConfigApplicationContext
初始化beanFactory
scanner 
register(Class<?>... annotatedClasses) 读取componentscan注解的类  扫描出了AppConfig
refresh方法
进入时获得6个bd,包括appConfig
// 准备刷新的上下文
prepareRefresh()  
//进行了一次cas操作判断dean工厂创建成功没有,并序列化id
obtainFreshBeanFactory 
//感觉啥也没干
prepareBeanFactory(beanFactory) 
//子类覆盖实现  感觉啥也没干    //扫描出@Component注解属性
postProcessBeanFactory(beanFactory);
//找到实现BeanFactoryPostProcessor接口的方法,并将相关BeanFactory(Registry)PostProcessor的实现类放入单例池
invokeBeanFactoryPostProcessors   
//初始化单例									
finishBeanFactoryInitialization(beanFactory);
{
    //初始化非延迟加载的单例
    preInstantiateSingletons();
    {
        //DefaultListableBeanFactory
        getBean;
        {
            //AbstractBeanFactory getBean doGetBean
            第二个getsingleton执行创建
            //AbstractAutowireCapableBeanFactory -- createBean --doCreateBean --	
            createBeanInstance
            {
             推断构造方法
             determineConstructorsFromBeanPostProcessors
            }
            //获取实例对象
            instanceWrapper.getWrappedInstance()
            //判断是不是单例并是否支持循环依赖
            //第四次调用后置处理器   暴露工厂 获取一个简单A(介于BeanDefinition 和 bean之间)
            addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
            //获取依赖对象,进入对象填充
            //将A放入单例池(一级缓存),删除3级(没有),删除2级,放入注册单例
            populateBean(beanName, mbd, instanceWrapper);
            //主要是aop代理装配对象
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }     
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值