Spring 進階(6) 使用註解配置bean(2)
阿新 • • 發佈:2018-12-10
- 太長了,分開寫吧,到使用註解定製宣告週期了。
- 和前面使用init-method和destory-method方法來指定初始化之後使用那個方法和銷燬前使用哪個方法一樣,使用@PostConstruct和@PreDestory註解也可以達到同樣的效果。
- 這裡是在上個例子的基礎上修改的。
package InstanceClass; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; //同上 @Component public class ClassB { private String name; void setName(String name) { this.name = "ok1"; } public void thisIsMyName(){ System.out.println("B' s name is " + name); } @PostConstruct public void init(){ System.out.println("It is B's init"); } @PreDestroy public void destory(){ System.out.println("It is B's destory"); } }
測試類
package TestPackage; import InstanceClass.ClassA; import InstanceClass.ClassB; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; //測試類 public class SpringTest { public static void main(String []args){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); ClassA classA = applicationContext.getBean("classA", ClassA.class); System.out.println(classA.toString()); classA = applicationContext.getBean("classA", ClassA.class); System.out.println(classA.getClassB().toString()); ClassB classB = applicationContext.getBean("classB", ClassB.class); System.out.println(classB.toString()); ((ClassPathXmlApplicationContext) applicationContext).registerShutdownHook(); } }
-
接下來是關於預初始化的兩個註解,第一個@DependsOn可以指定在初始化被@DependsOn修飾的bean之前初始化@DependsOn引數的bean,程式碼
@DependsOn({"classB"}) @Scope("prototype") @Component("classA") public class ClassA { ... }
測試類
package TestPackage; import InstanceClass.ClassA; import InstanceClass.ClassB; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; //測試類 public class SpringTest { public static void main(String []args){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); ClassA classA = applicationContext.getBean("classA", ClassA.class); System.out.println(classA.toString()); classA = applicationContext.getBean("classA", ClassA.class); System.out.println(classA.getClassB().getName()); ClassB classB = applicationContext.getBean("classB", ClassB.class); System.out.println(classB.toString()); ((ClassPathXmlApplicationContext) applicationContext).registerShutdownHook(); } }
可以看到輸出,說明B的的確在A之前 被初始化了
It is B's init [email protected] null [email protected] It is B's destory
然後是@Lazy註解,它的引數是ture或者false,表示是否 預初始化被@Lazy註解修飾的bean,當然啦,如果這個bean是被其他bean的@DependsOn的註解的引數的話,它也會被初始化的。
-
這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。