注解@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