三、 @Resource( 重要、推荐)
还是需要在 xml 文件中配置 bean
(一) JSR-250
JCP: Java Community Process 是由多个厂家出人来构成的 J2EE 组织,主要是用于定 Java 的一些新的标准
而每一个标签都可以称之为一个 JSR
而每一个新的 JSR 都会加一个数字是区别什么 JSR ,可以到官方网看看具体 JSR 定了哪些新的标准。
(二) @Resource
代码:
import javax.annotation.Resource;
public class UserService {
private UserDao userDao = new UserDaoImpl ();
public UserDao getUserDao() {
return userDao ;
}
// 在这里引用了一个资源,这个资源的名称和这个 setter 方法后面的成员属性名称一致 (userDao)
// 注意这个 @Resource 是 J2EE 的 (import javax.annotation.Resource)
@Resource
public void setUserDao(UserDao userDao) {
this . userDao = userDao;
}
public void add(User u){ userDao .save(u);}
}
说明: 在这里引用了一个资源,这个资源的名称和这个 setter 方法后面的成员属性名称一致 (userDao)
注意这个 @Resource 是 J2EE 的 (import javax.annotation.Resource)
@Resource 默认是根据 byName 来的,如果没有找到相同的名称再根据 byTyp e ,当然也可以指定 bean 的 name 如下:
@Resource (name= "u2" )
public void setUserDao(UserDao userDao) {
this . userDao = userDao;
}
注意 : 一般使用 @Resource 而不会使用 @Autowired
不足:如果没有源码,就无法使用 annotation ,只能使用 xml
四、 @Componet
以上使用 @Autowired 、 @Resource 注解时,还是需要在 xml 文件配置 bean ,这样就达不到完全使用 annotation 进行注解。因此现在引用 @Component 在那个 bean 前进行注解,表示那个类是需要的 bean
有了 @Componet 注解,这样就不需要在 xml 文件中配置 bean 了。
注意: @Componet 是 Spring 的注解 ( org.springframework.stereotype.Component; )
例如:
前缀部分见上面代码,以此略。。。
< context:annotation-config />
< context:component-scan base-package = "com.wjt276" />
</ beans ><!— 不需要配置 bean 了 -->
bean 类中需要使用 @Componet (或 @Service 、 @Repository 、 @Controller )注解这个类是 bean 。
代码:
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
// @Componet 注解默认 bean 的名称是类名首字母小写
// 也可以利用 value 属性指定 bean 的名称
@Component (value= "userService" )
public class UserService {
private UserDao userDao = new UserDaoImpl();
public UserDao getUserDao() { return userDao ;}
// 在这里引用了一个资源,这个资源的名称和这个 setter 方法后面的成员属性名称一致 (userDao)
// 注意这个 @Resource 是 J2EE 的 (import javax.annotation.Resource)
@Resource
public void setUserDao(UserDao userDao) { this . userDao = userDao;}
public void add(User u){ userDao .save(u);}}
注意: @Componet 注解,默认 bean 的名称是类的首字母小写,当然也可以利用 value 属性指定 bean 名称(在 annotation 中属性为 value 可以不写,直接写值)
一般建议 @Componet 注解后面都指定名称。
说明: 当 Spring 在加载配置文件时, 发现有 < context:component-scan base-package = "com.wjt276" /> 标签, 并且后面的 base-package 属性指定了包名 ,就会在这个指定的包名下面搜索灰,看哪个类用 @Componet 进行了注解,如果有 Spring 就将其初始化到容器中,认为是一个 bean
五、 @Scope 、@PostConstruct 、@PreDestroy
@Scope 对应于 xml 配置文件的 scope 属性
@PostConstruct 对应于 xml 配置文件中的 init-method 属性
@PreDestroy 对于应于 xml 配置文件中的 destroy-method 属性
例如如下:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component (value= "userService" )
@Scope ( "singleton" )
public class UserService {
@PostConstruct
public void init(){System. out .println( " 现在开始初始化 UserService" );}
private UserDao userDao = new UserDaoImpl();
public UserDao getUserDao() { return userDao ;}
@Resource
public void setUserDao(UserDao userDao) { this . userDao = userDao;}
public void add(User u){ userDao .save(u);}
@PreDestroy
public void destroy(){System. out .println( "destory" ); }
六、 注解对应的jar 包
1 、 @Autowired org.springframework.beans.factory.annotation.Autowired;
2 、 @Qualifier org.springframework.beans.factory.annotation.Qualifier;
3 、 @Componet org.springframework.stereotype.Component;
4 、 @Resource javax.annotation.Resource;
5 、 @Scope org.springframework.context.annotation.Scope;
6 、 @PostConstruct javax.annotation.PreDestroy;
7 、 @PreDestroy javax.annotation.PreDestroy;