1. 程式人生 > >Spring 進階(6) 使用註解配置bean(2)

Spring 進階(6) 使用註解配置bean(2)

  1. 太長了,分開寫吧,到使用註解定製宣告週期了。
  2. 和前面使用init-method和destory-method方法來指定初始化之後使用那個方法和銷燬前使用哪個方法一樣,使用@PostConstruct和@PreDestory註解也可以達到同樣的效果。
  3. 這裡是在上個例子的基礎上修改的。
    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();
        }
    }
    

     

  4. 接下來是關於預初始化的兩個註解,第一個@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的註解的引數的話,它也會被初始化的。

  5. 這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。