一、注解定义Bean组件
Spring从2.0版本开始引入注解的配置方式,将Bean的配置信息和Bean实现类结合在一起,进一步减少了配置文件的代码量。
@Component("userDao") public class UserDaoImpl implements UserDao{ //省略 }
@Component("userDao")的作用与在XML配置文件中编写<bean id="userDao" class="edu.cn.dao.Impl.UserDaoImpl"/>等效。
除了@Component,Spring还提供了3个特殊的注解,如下
- @Repository 用于标注DAO类
- @Service 用于标注业务类
- @Controller 用于标注控制器类
二、注解装配Bean组件
1、@Autowired注解
Spring提供了@Autowired注解实现Bean的装配,如下
import org.springframework.stereotype.Service import org.springframework.beans.factory.annotation.Autowired @Service("userService") public class UserServiceImpl implements UserService{ @Autowired private UserDao dao; }
@Autowired为dao属性注入所依赖的对象,Spring将直接对dao属性进行赋值,此时类中可以省略属性相关的setter方法。
@Autowired采用按类型匹配的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型相匹配的Bean组件,并自动为属性注入。若容器中有一个以上类型相匹配的Bean时,则可以使用@Qualifier指定所需的Bean的名称。
import org.springframework.stereotype.Service import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Qualifier @Service("userService") public class UserServiceImpl implements UserService{ //为dao属性注入名为userDao的Bean @Autowired @Qualifier("userDao") private UserDao dao; }
1.1、@Autowired注解扩展
- @Autowired也可以对方法的入参进行标注,如下
@Service("userService") public class UserServiceImpl implements UserService{ private UserDao dao; @Autowired public void setDao(@Qualifier("userDao") UserDao dao){ this.dao = dao; } }
- @Autowired也可用于构造方法,实现构造注入,如下
@Service("userService") public class UserServiceImpl implements UserService{ private UserDao dao; @Autowired public UserServiceImpl(@Qualifier("userDao") UserDao dao){ this.dao = dao; } }
- 使用@Autowired注解进行装配时,如果找不到相匹配的Bean组件,Spring容器会抛出异常。此时如果依赖不是必需的,为避免抛出异常,可以将required属性设置为false。默认为true,如下
@Service("userService") public class UserServiceImpl implements UserService{ @Autowired(required = false) private UserDao dao; }
- 如果对类中集合类型的成员变量或方法入参使用@Autowired注解,Spring会将容器中所有和集合中元素类型匹配的Bean组件都注入进来,如下
@Component public class TaskQueue{ @Autowired(required = false) private List<Job> toDoList; }
在上述代码中,Spring会将Job类型的Bean组件都注入给toDoList属性。
2、@Resource注解
Spring还支持使用JSR-250中定义的@Resource注解实现组件装配,该注解也能对类的成员变量或方法入参提供注入功能。
JSR全称是Java Specification Requests,即Java规范提案。Java的版本及其功能在不断的更新和扩展,JSR就是用来规范这些功能及其接口的标准,已经成为Java业界的一个重要标准。
@Resource有一个name属性,默认情况下,Spring将这个属性的值解释为要注入的Bean的名称,如下
@Service("userService") public class UserServiceImpl implements UserService{ @Resource(name = "userDao") private UserDao dao; }
如果没有显示的指定Bean的名称,@Resource注解将根据字段名或者setter方法名产生默认的名称。如果注解应用于字段,将使用字段名作为Bean的名称;如果注解应用于setter方法,Bean的名称就是通过setter方法得到的属性名,如下
@Service("userService") public class UserServiceImpl implements UserService{ //查找名为dao的Bean,并注入给dao属性 @Resource private UserDao dao; }
@Service("userService") public class UserServiceImpl implements UserService{ //查找名为userDao的Bean,并注入给setter方法 private UserDao dao; @Resource public void setUserDao(UserDao userDao){ this.dao = userDao; } }
如果没有显示的指定Bean的名称,且无法找到与默认Bean名称匹配的Bean组件,@Resource注解会由按名称查找的方式自动变为按类型匹配的方式进行装配。
三、加载注解定义的Bean组件
在XML配置文件中使用context命名空间下的component-scan标签扫描注解标注的类。bace-package属性指定了需要扫描的基准包(多个包可用逗号隔开)。Spring会扫描这些包中所有的类,获取Bean的定义信息。
<?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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="service,dao"/> </beans>