一、Spring生命周期
* 容器级别生命周期接口方法
* ①.实例化BeanFactoryPostProcessor实现类
::若实现该接口,在Spring容器加载bean的定义文件之后,实例化bean之前,可以修改bean的定义属性。
* ②.执行BeanFactoryPostProcessor的postProcessBeanFactory方法
* ③.实例化BeanPostProcessor实现类(后处理器)
::在Bean的注入过程中会用到,在实例化bean之后,可以在bean的初始化方法前后添加一些自己的处理逻辑。
两个方法:①postProcessBeforeInitialization会在所以bean的init-method和InitializingBean的afterPropertiesSet方法之前执行。
②postProcessAfterInitialization在上述方法之后执行。
后面的Bean注入过程有展示
* ④.实例化InstantiationAwareBeanPostProcessorAdapter实现类(后处理器)
* ⑤.执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
* 执行Bean的构造器
* ①.执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues
* Bean注入过程
* ①.调用BeanNameAware的setBeanName设置Bean的name
* ②.调用BeanFactoryAware的setBeanFactory方法,Bean中得到Bean所在的IOC容器,从而直接在Bean中使用IOC容器的服务
* ③.执行BeanPostProcessor的postProcessBeforeInitialization方法
* ④.调用InitializingBean的afterPropertiesSet方法
* ⑤.调用配置文件中的default-init-method或者init-method
* ⑥.执行BeanPostProcessor的postProcessAfterInitialization方法
* 销毁过程
* ①.调用DisposableBean的destroy方法
* ②.调用配置文件中的destroy-method或default-destroy-method属性指定的初始化方法
二、Spring的各种Aware接口,实现对IOC容器的感知
BeanNameAware,可以在Bean中得到它在IOC容器中的Bean的实例的名字。
BeanFactoryAware,可以在Bean中得到Bean所在的IOC容器,从而直接在Bean中使用IOC容器的服务。
ApplicationContextAware,可以在Bean中得到Bean所在的应用上下文,从而直接在Bean中使用上下文的服务。
MessageSourceAware,在Bean中可以得到消息源。
ApplicationEventPublisherAware,在bean中可以得到应用上下文的事件发布器,从而可以在Bean中发布应用上下文的事件。
ResourceLoaderAware,在Bean中可以得到ResourceLoader,从而在bean中使用ResourceLoader加载外部对应的Resource资源。
代码示例:
public class TestBeanName implements BeanNameAware, ApplicationContextAware { private String beanName; //通过BeanNameAware得到Bean的name @Override public void setBeanName(String name) { this.beanName = name; System.out.println("BeanName : " + name); } //通过ApplicationContextAware得到Bean的上下文信息 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("setApplicationContext : " + applicationContext.getBean(this.beanName).hashCode()); } }
三、Spring getResource
可以用ApplicationContextAware中的ApplicationContext或者或ResourceLoaderAware中的ResourceLoader。
代码示例:
//两个接口都可以,选其一 public class TestResource implements ApplicationContextAware,ResourceLoaderAware { private ApplicationContext applicationContext; private ResourceLoader resourceLoader; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public void resource() throws IOException { // Resource resource = applicationContext.getResource("classpath:config.txt"); // Resource resource = applicationContext.getResource("config.txt"); // Resource resource = applicationContext.getResource("file:E:\\\\JAVA\\\\Spring\\\\545040d70001107900000000\\\\Spring\\\\src\\\\main\\\\resources\\\\config.txt"); Resource resource = applicationContext.getResource("url:https://avatar.csdn.net/1/0/E/3_u013076044.jpg"); System.out.println(resource.getFilename()); System.out.println(resource.contentLength()); } }