使用注解实现Ioc的配置
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
1.使用注解定义Bean
1 /** 2 * 用户DAO类,实现UserDao接口,负责User类的持久化操作 3 */ 4 @Repository("userDao") 5 public class UserDaoImpl implements UserDao { 6 7 public void save(User user) { 8 // 这里并未实现完整的数据库操作,仅为说明问题 9 System.out.println("保存用户信息到数据库"); 10 } 11 }
@Repository("userDao")的作用与在XML配置文件中编写<bean id="userDao" class="dao.impl.UserDaoImpl"/>等效。
2.使用注解实现Bean组件装配
1 /** 2 * 用户业务类,实现对User功能的业务管理 3 */ 4 @Service("userService") 5 public class UserServiceImpl implements UserService { 6 7 @Autowired // 默认按类型匹配 8 @Qualifier("userDao") // 按指定名称匹配 9 private UserDao dao; 10 11 // 使用@Autowired直接为属性注入,可以省略setter方法 12 /*public void setDao(UserDao dao) { 13 this.dao = dao; 14 }*/ 15 16 public void addNewUser(User user) { 17 // 调用用户DAO的方法保存用户信息 18 dao.save(user); 19 } 20 }
Spring提供了@Autowired注解实现Bean的装配。
通过@Service标注了一个业务Bean,并使用@Autowired为dao属性注入所依赖的对象,Spring将直接对到属性进行赋值,此时类中可以省略属相相关的setter方法。
若容器中有一个以上类型相匹配的Bean时,则可以使用@Qualifier指定所需的Bean的名称。
使用@Autowired注解进行装配时,如果找不到相匹配的Bean组件,Spring容器会抛出异常。此时如果依赖不是必须的,为避免抛出异常,可以将required属性设置为false(默认为true)。
@Autowired也可以对方法的入参进行标注,也可用于构造方法,实现构造注入。
3.加载注解定义的Bean
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 9 <!-- 扫描包中注解标注的类 --> 10 <context:component-scan base-package="service,dao" /> 11 </beans>
首先在Spring配置文件中添加对context命名空间的声明,然后使用context命名空间下的component-scan标签扫描注解标注的类。base-package属性指定了需要扫描的基准包(多个包名用逗号隔开)。Spring会扫描这些包中所有的类,获取Bean的定义信息。
4.使用Java标准注解完成装配
除了提供@Autowired注解,Spring还支持使用JSR-250中定义的@Resource注解实现组件装配,该注解也能对类的成员变量或方法入参提供注入功能。
1 /** 2 * 用户业务类,实现对User功能的业务管理 3 */ 4 @Service("userService") 5 public class UserServiceImpl implements UserService { 6 //为dao属性注入名为userDao的Bean 7 @Resource(name = "userDao") 8 //@Resource 9 private UserDao dao; 10 11 public void addNewUser(User user) { 12 // 调用用户DAO的方法保存用户信息 13 dao.save(user); 14 } 15 }
@Resource有一个name属性,默认情况下,Spring将这个属性的值解释为要注入的Bean的名称。
如果没有显式地指定Bean名称,@Resource注解将根据字段名或者setter方法名产生默认的名称。