Spring的几种常用注解
Spring几种常用的注解
注解 |
说明 |
@Component
|
可以使用此注解描述Spring中的Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用的任何层次。使用时只需将该注解标注在相应类上即可。 |
@Repository
|
用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同。 |
@Service
|
通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller
|
通常作用在控制层(如Spring MVC的Controller),用于将控制层的类标识为Spring中的Bean其功能与@Component相同。 |
@Autowired
|
用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。
|
@Resource
|
其作用与@Autowired一样。其区别在于@Autowired默认按Bean类型装配,而@Resource默认按照Bean实例名称进行装配。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则先按Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException异常 |
@Qualifier
|
与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。
|
测试demo1
1)创建一个dao接口,并在接口内定义一个方法
public interface UserDao { public void save(); } |
实现这个dao接口
//使用@Repository注解将UserDaoPmpl标识为Spring中的Bean, //其相当于 <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/> @Repository("userDao") public class UserDaoImpl implements UserDao{ @Override public void save() { // TODO Auto-generated method stub System.out.println("userDao.save"); } } |
其中@Repository注解相当于在spring容器中创建一个bean实例,即如下
<bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/> |
@Repository("userDao")注解中的userDao相当于<bean/>中的id的值。@Repository注解一般用于dao层,即数据访问层。在实现类UserDaoImpl中的save方法中添加一个打印输出。
2)创建一个service接口,并在接口内定义一个方法
public interface UserService { public void save(); } |
实现这个service接口
**使用@Service注解将UserServiceImpl类标识为Spring中的Bean * 其相当于 <bean id="userService" class="org.lyl.annotation.UserServiceImpl"/> */ @Service("userService") public class UserServiceImpl implements UserService{ //使用Resource注解注入,按userDao实例名称进行注入 //相当于<property name="useDao" ref="userDao"></property> @Resource(name="userDao") private UserDao userDao; public void save() { // TODO Auto-generated method stub this.userDao.save(); System.out.println("执行UserServic.save"); } } |
其中@Service注解相当于在spring容器中创建一个bean实例,即如下
<bean id="userService" class="org.lyl.annotation.UserServiceImpl"/> |
@Service("userService")中的userService与bean对应关系同上,@Service注解一般用于service层,即业务逻辑层,一般业务逻辑就是在service层处理的;在实现类UserServiceImpl中的save方法中添加一个打印输出。
@Resourc注解<bean/>中的子元素<property/>,name相当于property中的name, @Service("userService")注解加@Resource(name="userDao")一起使用,等同于如下
<bean id="userService" class="org.lyl.annotation.UserServiceImpl"> <property name="useDao" ref="userDao"></property> </bean> |
@Resource(name="userDao")注解按名称类型注入dao的实现类UserDaoImpl,即注解@Repository("userDao")中的实例化的bean
3)创建一个controller类
@Controller("userController") public class UserController { @Resource(name="userService") private UserService userService; public void save() { this.userService.save(); System.out.println("运行UserController.save"); } } |
@Controller注解将UserController标识为Spring中的bean
@Resource(name="userService")按名称将userService注入到controller中等同于
<bean id=" userController " class="org.lyl.annotation. UserController "> <property name=" userService " ref=" userService "></property> </bean> |
4)创建一个配置文件beans.xml配置文件
<?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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- 将指定类配置给spring,让spring创建其对象的实例 --> <!-- 使用context命名空间在配置文件中开启相应的注解处理器 --> <context:annotation-config></context:annotation-config> <!-- 分别定义3个实例 --> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean> <bean id="userController" class="org.lyl.annotation.UserController"></bean>
<!-- 使用context命名空间通知spring扫描指定包下所有Bean类,进行注解解析 --> <!-- <context:component-scan base-package="org.lyl.annotation"></context:component-scan> -->
</beans> |
通过配置 <context:annotation-config/>开启注解处理器
5)创建一个测试类
public class AnnotationTest { public static void main(String[] args) { String xmlPath="org/lyl/annotation/beans.xml"; ApplicationContext context=new ClassPathXmlApplicationContext(xmlPath); UserController controller=(UserController) context.getBean("userController"); controller.save(); } } |
运行结果如图
结果显示spring注解调用成功
6)当文件中的注解很多时xml定义的实例会有很多
<context:annotation-config></context:annotation-config> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean> <bean id="userController" class="org.lyl.annotation.UserController"></bean> … …
|
会显得xml配置文件很臃肿,这时可以开启注解注解扫描器,自动扫描包下的所有注解
<!-- 使用context命名空间通知spring扫描指定包下所有Bean类,进行注解解析 --> <context:component-scan base-package="org.lyl.annotation"/> |
一行可以替上代面多行
7)注解在一定程度上减少代码量,一些公司在不使用注解时要减少代码量,可以使用自动装配,Spring的<bean/>标签中有一个autowire的属性,可以设置autowire属性值来自动装配bean,所谓的自动装配,就是将bean注入到其他bean子元素的<property/>中,autowire属性有5个值,
defaul:根据上级标签的<beans/>的属性值而定,
byName:根据属性名自动装配,容器将根据名称自动查找与属性完全一致的bean,并将其属性自动装配,
byType:根据属性类型type自动装配,如果一个Bean的数据类型兼容另一个Bean的数据类型,则自动装配,
constructor:根据构造器参数类型进行byType自动装配,
no:默认情况下不使用自动装配,bean依赖必须通过ref元素定义;
demo步骤
删除dao实现类,service实现类,controler类的中的注解,使用setter()方自动装配bean实例
a.在UserServiceImpl类中创建setUserService方法
public void setUserService(UserService userService) { this.userService = userService; } |
b.在controller类中创建setUserService方法
public void setUserService(UserService userService) { this.userService = userService; } |
c.修改配置文件,设置<bean/>标签的autowire属性值
<?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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- 将指定类配置给spring,让spring创建其对象的实例 --> <!-- 使用context命名空间在配置文件中开启相应的注解处理器 --> <!-- 分别定义3个实例 --> <!-- 使用bean元素的autowired属性完成自动装配 --> <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean> <bean id="userService" class="org.lyl.annotation.UserServiceImpl" autowire="byName"></bean> <bean id="userController" class="org.lyl.annotation.UserController" autowire="byName"></bean> </beans> |
运行测试结果和5)中的测试结果一样