1

注解@Resource @PostConstruct 和@PreDestory例子

本文讲解JSR250中的注解。这些注解在Spring 2.5中引入Spring,包括@Resource ,@PostConstruct 和 @PreDestroy三个注解。

@Resource和@Autowired

@Resource和@Autowired这两个注解在功能上相似。@Autowired是spring的注解,@Resource是JSR-250的注解。但是@Autowired是可以放在构造器上的。
默认情况下spring按照对象类型来进行自动装配。如果你一个类在容器中实例了两个bean,这样就会导致spring无法决定使用哪一个了。这个时候,就需要@Qualifier注解来帮忙,它来解决这种冲突。使用@Resource时,你可以将bean的名字作为属性放在注解里。

@PostConstruct 和 @PreDestroy

这两个注解修饰的方法会在bean初始化和销毁的时候调用。可以参考[spring callback method][1]

例子

package com.javabeat.jsrannotations;

 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;

 public class Product {
     private Integer price;
     private String name;

     @Resource(name = "typeB")
     private Type type;

     public Integer getPrice() {
         return price;
     }

     public void setPrice(Integer price) {
         this.price = price;
     }

     public Type getType() {
         return type;
     }

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     @PostConstruct
     public void init() {
         System.out.println("In init block of Product");
     }

     @PreDestroy
     public void destroy() {
         System.out.println("In destroy block of Product");
     }
}
这个类中,我们使用了@Resource注解。@PostConstruct 和 @PreDestroy使用在bean各自的生命周期事件回调方法上。
package com.javabeat.jsrannotations;

 public class Type {

      private String productType;

     public String getProductType() {
         return productType;
     }

     public void setProductType(String productType) {
         this.productType = productType;
     }

 }
package com.javabeat.jsrannotations;

 import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;

 public class MainApp {
     public static void main(String[] args) {
         AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                 "BeansJSRAnnotation.xml");

         Product product = (Product) context.getBean("product");

         System.out.println("Product Name : " + product.getName());
         System.out.println("Price : " + product.getPrice());

         Type productType = product.getType();

         System.out.println(product.getName() + " is of type:"
                 + productType.getProductType());
         context.registerShutdownHook();
     }
}
在MainApp中,使用registerShutdownHook()来注册一个关闭的钩子方法。这会保证优雅关闭和调用相关的销毁方法。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <context:annotation-config />

    <!-- Definition for Product bean -->
    <bean id="product" class="com.javabeat.jsrannotations.Product" init-method="init" destroy-method="destroy">
        <property name="name" value="ProductA" />
        <property name="price" value="400" />
    </bean>
    <bean id="typeA" class="com.javabeat.jsrannotations.Type">
         <property name="productType" value="Export" />
    </bean>
    <bean id="typeB" class="com.javabeat.jsrannotations.Type">
         <property name="productType" value="Import" />
    </bean>
</beans>
如你所见,对同一个类型有两个bean。在Product.java中使用了@Resource(“typeB”)意味着需要执行自动注入Product类型的,并且bean名字是typeB的实例。
 执行结果如下:
    In init block of Product
    Product Name : ProductA
    Price : 400
    ProductA is of type:Import
    In destroy block of Product     

沈子平
183 声望17 粉丝

慢慢积累,一切都不会太晚.