(15) Aware接口的作用
① aware接口的注释信息:
一个标记superinterface,指示bean有资格通过回调样式的方法被Spring容器通知特定的框架对象
通过回调方法,可以获得当前容器里所有组件对象。
② 当获取到当前对象的时候,已获取了当前容器的所有对象
③ 获取容器创建时使用的名字: A implements BeanNameAware
applicationContext.get~ 方法也可获取其他信息
④ 填充属性
AbstractAutowireCapableBeanFactory类中 ---> initializeBean() 方法 --> invokeAwareMethods() 判断bean是否实现各种Aware接口,给bean set响应值
⑤ 当spring容器创建的bean对象在进行具体操作的时候,如果需要容器的其他对象,此时可将对象实现Aware接口,来满足当前需求。
很少用Aware接口,若二次开发,则使用Aware
(16) springbean
springBean分为普通对象和容器对象 ,普通对象是我们自定义的对象;容器对象是内置对象(源码中new的对象),Spring需要的对象。
AbstractApplicationContext.java --> invokeBeanFactoryPostProcessors()方法上的注解
invoke [ɪnˈvəʊk] 调用
(17) 观察者模式
初始化的顺序为什么是这样的? BeanFactory接口定义时,已经定义好了:
(beanFactory接口中的注释)
在不同的阶段要处理不同的工作,怎么办?----
观察者模式:监听器、监听事件、多播器(广播器)
比如:AbstractApplicationContext.java中refresh()方法中:
initApplicationEventMulticaster(); init初始化;Application应用;event事件;
初始化应用程序事件多播器
registerListeners() 注册监听器
(18) 接口
①Environment 实现类-StandardEnvironment: System.getEnv(); System.getProperties()
standard [ˈstændəd]标准
自动注入(@Autowired)的Map,注入的一些环境的属性值是 System.getEnv() 和System.getProperties() 设置进去的。
启动类中 --- ClassPathXmlApplicationCoontext 构造函数-- 点击this方法-- setConfigLoations() --- resolvePath()---- getEnvironment() 获取当前环境的变量
在容器还未启动时,就已经准备环境对象了
abstractApplicationContext类中有environment(ConfigurableEnvironment)变量,可以直接获取
mutable [ˈmjuːtəbl] 可变的 resolve [rɪˈzɒlv]决定
② BeanFactory Aware BeanDefinition(BeanDefinitionRegistry 对beanDefinition的增删改查操作) BeanDefinitionReader BeanFactoryPostProcessor BeanPostProcessor Environment FactoryBean
registry [ˈredʒɪstri] 登记处
③ 面试题:BeanFactory和FactoryBean的区别
都是用来创建对象。当使用BeanFactory的时候必须遵循完整的创建过程,这个过程由spring来管理控制。 FactoryBean只需要调用getObgect就可以返回具体的对象,整个对象的创建过程是由用户自己来控制的,更加灵活,不需要遵循bean的生命周期
FactoryBean中有三个方法:isSingleton getObgect getObgectType
<bean id="aFactoryBean" class="....">
A aFactoryBean = (A)context.getBean("aFactoryBean"); -- 返回对象是A
context.getBean("&aFactoryBean") -- 返回对象是aFactoryBean
getobject是源码中默认调用的。
FactoryBeanRegistrySupport类中--- object = factory.getObject()
support [səˈpɔːt] 支持
当IOC框架完成整个容器创建好后,即bean都创建完成后(new ClassPathXmlApplicationContext 完成以后),有没有A对象? --- 没有
context.getBean("aFactoryBean") 执行时,一级缓存中没有A对象,后面代码才执行object = factory.getObject()代码,得到A对象。