1. 程式人生 > >Spring基礎總結一

Spring基礎總結一

des con ans bsp process ebean 修改 b- efault

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

}
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

Spring基礎總結一