[봄] 콩 라이프 사이클 및 응용 프로그램 시나리오 (주석 판)

머리말

우리가 더 나은 요구에 따라보다 합리적인 디자인을 개발하는 데 도움이 시스템 확장 성 및 효율성을 향상시킬 콩 스프링 컨테이너 관리 프로세스를 명확히.

콩 라이프 사이클

아래는 간단한 예에 의해 콩 스프링 컨테이너 라이프 사이클을 정렬합니다.

우리 전체에서 세부 사항에, 무엇보다도 그것은 전체 프로세스의 컨테이너가 Bean을로드 시작하는 것입니다.

/**
 * 测试 Spring Bean 生命周期
 * @author zyj
 */
public class LifeCycleTest {
    @Test
    public void testLifeCycle() {
        // 通过注解开启容器,并加载Bean
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(GlobalConfig.class);
        // 关闭容器
        context.close();
    }
}

@Configuration
public class GlobalConfig {
    @Bean
    public Calculator calculator() {
        return new Calculator();
    }
    /**
     * @Order:加载到容器的优先级,越小代表优先级越高
     * @return
     */
    @Order(0)
    @Bean
    public FullyBeanPostProcessor fullyBeanPostProcessor() {
        return new FullyBeanPostProcessor();
    }
}

그런 다음 컨테이너가 빈 어떤 치료를 수행 한로드 될 때를보십시오.

우리는 이러한 인터페이스는 개발자 로딩하는 과정에서 개입으로 콩의 입구를 볼 수 있습니다, 콩 봄 특정 인터페이스에 가입해야합니다.

public class Calculator implements BeanNameAware, ApplicationContextAware {

    public Calculator() {
        System.out.println("<<<构造器执行>>>");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("<<<BeanNameAware.setBeanName执行>>>");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("<<<ApplicationContextAware.setApplicationContext执行>>>");
    }

    @PostConstruct
    public void init() {
        System.out.println("<<<@PostConstruct执行>>>");
    }

	@PreDestroy
    public void destroy() {
        System.out.println("<<<@PreDestroy执行>>>");
    }
}

여기에서 코드는 다음과 같은 인터페이스와 노트를 가지고 볼 수 있습니다 :

  • BeanNameAware: 컨테이너 콩에 현재의 이름을 가져옵니다
  • ApplicationContextAware: 현재는 빈 용기에 주입
  • @PostConstruct: 초기화 방법 (초기화 메소드 Spring 설정 파일에 대응하는 인터페이스 InitializingBean)
  • @PreDestroy: 파괴의 방법 (인터페이스, Spring 설정 파일-방법을 파괴 해당 DisposableBean)

실행 순서

三月 06, 2020 3:09:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4f47d241: startup date [Fri Mar 06 15:09:52 CST 2020]; root of context hierarchy
三月 06, 2020 3:09:52 下午 org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker postProcessAfterInitialization
信息: Bean 'globalConfig' of type [class com.zyj.spring.config.GlobalConfig$$EnhancerBySpringCGLIB$$5aa1013d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

<<<构造器执行>>>
<<<BeanNameAware.setBeanName执行>>>
<<<ApplicationContextAware.setApplicationContext执行>>>
<<<BeanPostProcessor.postProcessBeforeInitialization执行>>>
<<<@PostConstruct执行>>>
<<<BeanPostProcessor.postProcessAfterInitialization执行>>>

三月 06, 2020 3:09:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@4f47d241: startup date [Fri Mar 06 15:09:52 CST 2020]; root of context hierarchy

<<<@PreDestroy执行>>>

Process finished with exit code 0

주의 작은 파트너가주의해야합니다 BeanPostProcessor실행을, 내가 Calculator이 인터페이스를 구현하지 않은,로드 왜 때를 인쇄 할 것인가?

첫째 I의 각 콩에 의해 구현 될 마땅 생각했다 BeanPostProcessor당신이 할 수 그래서, @PostConstruct전과 실행 후 처리 될 수있다.

하지만 현재 콩이 달성 일을하지 않았다로드 할 때 결과의 유효성을 검사 잘못이었다 BeanPostProcessor.

몇 가지 정보를 검토 한 결과, 몰랐다 BeanPostProcessor사용합니다.

위의 구성 클래스에서 봐, 당신은되지 않았을 수 있습니다 GlobalConfigFullyBeanPostProcessor.

public class FullyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Calculator) {
            System.out.println("<<<BeanPostProcessor.postProcessBeforeInitialization执行>>>");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Calculator) {
            System.out.println("<<<BeanPostProcessor.postProcessAfterInitialization执行>>>");
        }
        return bean;
    }
}

BeanPostProcessor별도의 클래스에 의해 수행 될 프로세스에 의해 통합 클래스의 Bean을 결정하기 위해 수행.

시나리오

ApplicationContextAware

조치 : 용기가 봄을 얻을 수있는

시나리오 : 봄 관리 인스턴스가 아니라, 우리가 주입 자동으로 사용할 수없는 경우. 예 유틸 다오를 사용할 경우,이 시간 다오 얻을 수있다 조립체 Spring 컨테이너를 가졌다.

@Component
public class SpringJobBeanFactory implements ApplicationContextAware {

    private static ApplicationContext applicationContext;
        
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringJobBeanFactory.applicationContext=applicationContext;    
    }
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
    }
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
		if (applicationContext == null){
			return null;
		}
		return (T)applicationContext.getBean(name);
	}
}

使用:

TypeDao typeDao = SpringJobBeanFactory.getBean("typeDao");
게시 된 107 개 원래 기사 · 원의 찬양 (88) · 전망 260 000 +

추천

출처blog.csdn.net/Code_shadow/article/details/104696923