Spring中@PostConstruct、@Predestroy、InitializingBean、Dispsable Bean、init Method、des
3533 ワード
今回のブログはSpring中@PostConstruct、@Presstry、InitializingBen、Dispsable Bean、init Method、destoryMethodの実行順を比較します.
便宜上、今回はxmlファイルを使用しないでbeanを定義します.完全に注釈構成を採用して、全部で3種類です.全部annotationsに入れます.
以下は定義された二つのbeanです.Beann 2は直接に@Component注解を加えて、ioc容器に入れます.
ビーン1は、注入属性、1つの普通属性、1つのコンストラクタ、3つの初期化方法、3つの破壊方法があります.
なぜビーン1がioc容器に入っていないのか不思議に思わないでください.私達はすぐに行います.
印刷結果は
したがって、実行順序は以下の通りです.
初期化時:コンストラクタコンストラクタ -> 属性注入 -> @PostConstruct -> インターフェース -> bean定義のinit Method
廃棄時:@Predestroy -> DispposableBeanインターフェース-> bean定義のdestoryMethod
When you work directly in Java,you can do anything you like with your objecs and do not always need to rely on the container lifecycle!
便宜上、今回はxmlファイルを使用しないでbeanを定義します.完全に注釈構成を採用して、全部で3種類です.全部annotationsに入れます.
以下は定義された二つのbeanです.Beann 2は直接に@Component注解を加えて、ioc容器に入れます.
ビーン1は、注入属性、1つの普通属性、1つのコンストラクタ、3つの初期化方法、3つの破壊方法があります.
public class Bean1 implements InitializingBean, DisposableBean{
@Autowired
public Bean2 bean2;
public String state;
public Bean1 (){
state = "construct!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
public void init_method (){
state = "init-method!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
public void destory_method (){
state = "destory-method!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
@PostConstruct
public void postConstruct (){
state = "postConstruct!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
@PreDestroy
public void preDestory (){
state = "preDestory!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
@Override
public void destroy() throws Exception {
state = "destory!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
@Override
public void afterPropertiesSet() throws Exception {
state = "afterPropertiesSet!";
System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2);
}
}
@Component
public class Bean2 {
}
なぜビーン1がioc容器に入っていないのか不思議に思わないでください.私達はすぐに行います.
@Configuration
@org.springframework.context.annotation.ComponentScan(basePackages = "annotations")
public class ComponentScan {
@Bean(initMethod = "init_method", destroyMethod = "destory_method")
public Bean1 bean1 (){
return new Bean1();
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(ComponentScan.class);
ctx.refresh();
ctx.registerShutdownHook();
}
}
beanは@Configrationで登録できます.xmlと同じ効果です.印刷結果は
bean1 -> construct!...bean2: null
bean1 -> postConstruct!...bean2: annotations.Bean2@35fc6dc4
bean1 -> afterPropertiesSet!...bean2: annotations.Bean2@35fc6dc4
bean1 -> init-method!...bean2: annotations.Bean2@35fc6dc4
bean1 -> preDestory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory!...bean2: annotations.Bean2@35fc6dc4
bean1 -> destory-method!...bean2: annotations.Bean2@35fc6dc4
したがって、実行順序は以下の通りです.
初期化時:コンストラクタコンストラクタ -> 属性注入 -> @PostConstruct -> インターフェース -> bean定義のinit Method
廃棄時:@Predestroy -> DispposableBeanインターフェース-> bean定義のdestoryMethod
When you work directly in Java,you can do anything you like with your objecs and do not always need to rely on the container lifecycle!