Spring基础总结一(生命周期,Aware接口,Resources)

一、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
* ②.BeanClassLoaderAware的setBeanClassLoader
* ③.调用BeanFactoryAware的setBeanFactory方法,Bean中得到Bean所在的IOC容器,从而直接在Bean中使用IOC容器的服务
* ④.调用ApplicationContextAware的setApplicationContext()方法
* ⑤.执行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());
    }

}
View Code

三、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());
    }


}
View Code

 

posted @ 2018-04-06 21:11  NoYone  阅读(280)  评论(0编辑  收藏  举报