Spring源码阅读过程遇到的知识点整理

1. spring 类的实例化顺序问题:

如果希望一个类中@bean注入的类在外部类初始化之前初始化可以用static修饰

2. bean实例化操作:

BeanFactoryPostProcessor在bean实例化之前执行,之后实例化bean(调用构造函数,并调用set方法注入属性值),然后在调用两个初始化方法前后,执行了BeanPostProcessor。初始化方法的执行顺序是,先执行afterPropertiesSet,再执行init-method

BeanFactoryPostProcessor:容器的扩展点方法,可以在这个扩展点修改beanddfinition的定义(此时bean还有实例化)比如修改bean的作用域(单例,原型),修改bean的元信息。

BeanPostProcessor:提供bean初始化前后的扩展点;

3. spring注入的几种方式:

    1.beandifinition(spring内部对象)
    2.单例(注册外部对象),如果找到了就不走be'an'di'fin
    3.@value,只能注入外部资源比如配置文件的属性或者配置文件,对象
    4.resloveDependance 只能根据类型注入xx.class,比如注入一个string
    这边因为再applicationcontext.refresh()方法才会实例化对象,所以此时容器还没有value这个注入,所以可以在addBeanFactoryPostProcessor注册一个回调,当执行invokeBeanFactoryPostProcessor()会执行注入value的操作,然后后续执行实例化类就没问题了


4. 具体如何注入一个bean呢?

可以通过注解,xml,配置文件resource三种方式注入一个类(依赖于beandefinition):
做法就是通过XXXBeanDefinitionReader.register注入 比如通过注解实现;

beanDefinitionReader.register(XXX.class);

5.BeanDfinition介绍:

BeanDefinition是通过BeanDefinitionRegister注入的,会进行合并操作(子类childUser,父user,实例化childuser会向上递归先实例化user,合并他的属性到childUser);

BeanDfinition作用:我们一般获取对象的方式有两种,一种是手动直接 new;另一种是交给 Spring 管理,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition。

BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。


6. @Configuration和@Component的区别

@Configuration标注在类上,该类会被CGLIB动态代理生成子类,可以达到这样的效果:在某@Bean方法下调用另一个标注了@Bean的方法,得到的会是同一个Bean对象;

@Component标注的类会产生多个

注解注意点:

1.可以作为Component标签使用;  

2.标注的类不能是final类型的(final类无法动态代理生成子类);

3.注解类里的@Bean对象的id默认是方法名,如果设置了@Bean的name或者value属性,取第一个作为beanId,name中其他的作为别名使用;

4. 标注了@Configuration的类不能是普通内部类,如果非要是个内部类,那就静态内部类也是可以的; 因为普通内部类依赖于外部类的存在;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值