수명주기의 콩 Spring5 소스 코드 분석

라이프 사이클

  만들기 ----> 초기화 ---> 파괴

1. 객체의 예로

2. 세터 주입 실행 콩 의존성 주입 특성

인터페이스 메소드가 실행되는 setBeanName 달성하는 경우 3. setBeanName ()를 BeanNameAware

인터페이스 메소드가 실행되는 setBeanFactory 달성되면)합니다 (setBeanFactory를 4.BeanFactoryAware

프로세서에 연결된 경우 5. BeanPostProcessor processBeforeInitialization (), 이는 본 예 processBeforeInitialization 콩 초기화하기 전에 실행될 것이다 () 메소드

인터페이스가 afterPropertiesSet ()를 실행하는 경우에 달성된다 6. afterPropertiesSet ()를 InitializingBean 표시. 초기화 메소드에 정의 된 Bean 정의 파일

연관된 프로세서가 있다면 processAfterInitialization ()의 7.BeanPostProcessors는, 그 빈 초기화 전에이 인스턴스 processAfterInitialization을 수행한다 () 메소드

32 파괴의 8.DisposeablebBean () 컨테이너가 닫힐 때 콩이 인터페이스를 구현하는 경우, 그 32 파괴를 수행 () 메소드

제 정의 파일 컨테이너가 닫힐 때, 정의 파일에 정의 된 방법 콩 "32 파괴 - 방법"을 사용할 수있다 콩 파괴 메소드를 정의

 

참고 :

 케리을 사랑 할 때 컨테이너의 기본 1. 싱글의 경우는 초기화

 객체의 각각의 경우 2 때 콩이 초기화 얻을 것이다

 


 

 

 모든 설정 방법이 구현 된 내부의 객체가 생성 된에 콩 초기화 의미합니다. 특정 실행에있어서

   @Bean (initMethod, 32 파괴)는 빈에서의 이러한 두 가지 방법을 만드는 동시에 초기화 파괴 방법을 지정

   초기화 전이나 생성자 후 실행? 인수가없는 생성자! 오브젝트는 처음으로 초기화 이후에 생성! 인수가없는 생성자의 첫 번째 구현 그래서!

 

위의 과정을 보충 :

  > 초기화 (사용자 정의 init 메소드) - -> 파괴 콩 (생성자 실행) 생성

  싱글 톤 객체를 파괴하기 close () 메소드를 호출  

   참고 : IOC 컨테이너 스토리지를 사용지도 객체와 함께, 분명 () 클리어 객체

   원본을 봐 :

보기 입력 :

보기를 계속 클릭

첫 번째보기 :

지속적인 추적 관찰 후 명확한 방법은의 모음입니다

 

 우리는 특정 클래스를 달성하기 위해 초기화 작업을 통해 갈 수 있습니다!

 

사용하는 방법을 개발 :


방법 A는 : @Bean에 의해 초기화 메소드와 32 파괴-방법을 지정합니다

방법 2 : 콩 구현 InitializingBean 표시 (정의 초기화 로직), DisposableBean 표시를 (정의 된 로직을 파괴) 시켜서

방법 세 : 초기화 방법을 수행하기 위해, 콩에서 생성 및 할당이 완료 : @PostConstructo 다음 JSR250 (자바 사양이 아닌 봄)를 사용합니다. @PreDestory : 컨테이너가 Bean을 파괴하기 전에 우리가 청소 작업 할 수


 

방법 2 :

콩:

@Component
public class LifeBean implements InitializingBean, DisposableBean {

    //构造函数
    public LifeBean() {
        System.out.println("LifeBean Constructor");
    }

    /** 接口InitializingBean的方法
     *  //解释 对象有创建 肯定也有给属相赋值的过程!,对象赋值完毕以后才执行该方法  即: (afterPropertiesSet)中文:set方法都走完了时候执行该方法
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        //等同于 @Bean(init =" ")
        //解释 对象有创建 肯定也有给属相赋值的过程!,对象赋值完毕以后才执行该方法
        System.out.println("LifeBean ********> 【InitializingBean.afterPropertiesSet】 ");
    }

    /**
     * 接口DisposableBean 的方法
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        System.out.println("LifeBean ********>【DisposableBean.destroy】");
    }
}

配置和扫包

@Configuration
@ComponentScan("com.toov5.config.beanTest.entity")
public class MyConfig {

}

启动测试:

public class test {
    public test(){

    }
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext("com.toov5.config");
        applicationContext1.close();
//        System.out.println(applicationContext1);
    }
}

 

方法三

  注解代替了接口:

Bean:

@Component
public class LifeBean {

    //构造函数
    public LifeBean() {
        System.out.println("LifeBean Constructor");
    }
    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        //等同于 @Bean(init =" ")
        //解释 对象有创建 肯定也有给属相赋值的过程!,对象赋值完毕以后才执行该方法
        System.out.println("LifeBean ********> 【InitializingBean.afterPropertiesSet】 ");
    }

   @PreDestroy
    public void destroy() throws Exception {
        System.out.println("LifeBean ********>【DisposableBean.destroy】");
    }
}

效果是一样的:

 

  

 Spring Bean生命周期中的后置处理器:  BeanPostProcessor接口


过滤器中,不可以使用注解方式获取Bean对象。 做法: 单独获取上下文ApplicationContext

后置处理器,实现对Bean初始化增强功能

@Component
public class MyApplicationContext implements ApplicationContextAware {
    //开发时候经常做成全局的 进行使用
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        LifeBean lifeBean = applicationContext.getBean("lifeBean", LifeBean.class);
        System.out.println("result————————————————————"+lifeBean.toString());
    }
}

运行后:结果是没问题的

 

추천

출처www.cnblogs.com/toov5/p/11257106.html