还是需要在 xml 文件中配置 bean
JCP: Java Community Process 是由多个厂家出人来构成的 J2EE 组织,主要是用于定 Java 的一些新的标准
而每一个标签都可以称之为一个 JSR
而每一个新的 JSR 都会加一个数字是区别什么 JSR ,可以到官方网看看具体 JSR 定了哪些新的标准。
代码:
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
以上使用 @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 对应于 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" ); }
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;