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
    InstanceClass.ClassA@928763c
    null
    InstanceClass.ClassB@15f47664
    It is B's destory

    然后是@Lazy注解,它的参数是ture或者false,表示是否 预初始化被@Lazy注解修饰的bean,当然啦,如果这个bean是被其他bean的@DependsOn的注解的参数的话,它也会被初始化的。

  5. 这是我看李刚编著的《轻量级javaEE企业应用实战(第五版)-Struts2+Spring5+Hibernate5/JAP2》后总结出来的。

猜你喜欢

转载自blog.csdn.net/weixin_39452731/article/details/84894512