[春]豆のライフサイクルとアプリケーションシナリオ(注釈付き版)

序文

明確豆春のコンテナ管理プロセスは、システムの拡張性と効率性を改善し、より良いニーズに基づいた、より合理的な設計を開発するために私たちを助けます。

Beanのライフサイクル

簡単な例で豆Springコンテナのライフサイクルを並べ替えるには、以下。

我々全体から細部まで、すべての最初は、それは全体のプロセスだ、コンテナは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();
    }
}

その後、コンテナがビーンは何の治療を行っているロードされたときに見てみましょう。

私たちは、これらのインタフェースは、開発者への負荷のプロセスに介入するようBeanの入り口を見ることができ、豆春特有のインターフェイスに参加する必要があります。

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(INIT-方法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ロードされたときにそれを印刷しますなぜ、このインターフェースを実現していませんか?

最初に私には各ビーンによって実装されるに値すると思った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別のクラスによって実行することが、プロセスによって統一クラスは、豆を決定するために行わ。

シナリオ

ApplicationContextAware

処置:コンテナは春を得ることができることにより、

シナリオ:ときインスタンスとSpring管理のために、我々は、自動注入さを使用することはできませんではありません。例えばUtilsのはダオを使用し、この時間は、アセンブリ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
おすすめ