@Resource在没有指定name属性的情况下首先将根据setter方法对于的字段名查找资源,如果找不到再根据类型查找;
@Resource首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,因此如果JNDI环境中有和Spring容器同名的资源时需要注意。
二、@PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义;
1、在测试类TestBean41中添加如下代码:
Java代码
1. @PostConstruct
2. public void init() {
3. System.out.println("==========init");
4. }
5. @PreDestroy
6. public void destroy() {
7. System.out.println("==========destroy");
8. }
@PostConstruct
public void init() {
System.out.println("==========init");
}
@PreDestroy
public void destroy() {
System.out.println("==========destroy");
}
2、修改测试方法如下:
Java代码
1. @Test
2. public void resourceInjectTest1() {
3. ((ClassPathXmlApplicationContext) ctx).registerShutdownHook();
4. TestBean41 testBean41 = ctx.getBean("testBean41", TestBean41.class);
5. Assert.assertEquals("hello", testBean41.getMessage());
6. }
@Test
public void resourceInjectTest1() {
((ClassPathXmlApplicationContext) ctx).registerShutdownHook();
TestBean41 testBean41 = ctx.getBean("testBean41", TestBean41.class);
Assert.assertEquals("hello", testBean41.getMessage());
}
类似于通过
12.2.4 JSR-330注解
在测试之前需要准备JSR-330注解所需要的jar包,到spring-framework-3.0.5.RELEASE-dependencies.zip中拷贝如下jar包到类路径:
com.springsource.javax.inject-1.0.0.jar
一、@Inject:等价于默认的@Autowired,只是没有required属性;
二、@Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况;
三、@Qualifier:只对应于Spring自带@Qualifier中的扩展@Qualifier限定描述符注解,即只能扩展使用,没有value属性。
1、首先扩展@Qualifier限定描述符注解来表示Mysql数据源
Java代码
1. package cn.javass.spring.chapter12.qualifier;
2. //省略部分import
3. import javax.inject.Qualifier;
4. @Target({ElementType.FIELD, ElementType.PARAMETER})
5. @Retention(RetentionPolicy.RUNTIME)
6. @Qualifier
7. public @interface JSR330Mysql {
8. }
9.
package cn.javass.spring.chapter12.qualifier;
//省略部分import
import javax.inject.Qualifier;
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface JSR330Mysql {
}
2、准备测试Bean:
Java代码
1. package cn.javass.spring.chapter12;
2. import javax.inject.Inject;
3. import javax.inject.Named;
4. import javax.sql.DataSource;
5. import cn.javass.spring.chapter12.qualifier.JSR330Mysql;
6. public class TestBean51 {
7. private DataSource mysqlDataSource;
8. private DataSource oracleDataSource;
9. @Inject
10. public void initDataSoruce(
11. @JSR330Mysql DataSource mysqlDataSource,
12. @Named("oracleDataSource") DataSource oracleDataSource) {
13. this.mysqlDataSource = mysqlDataSource;
14. this.oracleDataSource = oracleDataSource;
15.
16. }
17. //省略getter
18. }
package cn.javass.spring.chapter12;
import javax.inject.Inject;
import javax.inject.Named;
import javax.sql.DataSource;
import cn.javass.spring.chapter12.qualifier.JSR330Mysql;
public class TestBean51 {
private DataSource mysqlDataSource;
private DataSource oracleDataSource;
@Inject
public void initDataSoruce(
@JSR330Mysql DataSource mysqlDataSource,