使用注解定义Bean
import org.springframework.stereotype.Component;
/**
* 用户dao类,实现UserDao接口,负责User类的持久化操作
*/
//通过注释定义了一个dao
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
System.out.println("保存用户信息到数据库");
}
}
以上代码通过注解定义了一个名为userDao的Bean。@Component("userDao")的作用在applicationcontext.xml配置文件中编写的<bean id="useDao" class="dao.impl.UserDaoImpl" />等效。除了@Component,Spring还提供了3个特殊的注解。
@Repository:用于标注Dao类
@Service:用于标注业务类
@Controller:用于标注控制器类
使用特定的注解使组件的用途更加清晰,并且Spring在以后的版本中可能会为它们添加特殊的功能,所以推荐使用特定的注解来标注特定的实现类。
使用注解实现Bean组件装配
Spring提供了@Autowired注解实现Bean的装配。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 用户业务类,实现对User功能的业务管理
*/
@Service("userService")
public class UserServiceImpl implements UserService {
//声明接口类型的引用,和具体实现类解耦合
@Autowired
private UserDao userDao;
}
以上代码通过@Service标注了一个业务的Bean,并使用@Autowried为dao属性注入所依赖的对象,Spring将直接对dao属性进行赋值,此时类中可以省略属性相关的setter方法。
@Autowried采用按类型配置的方式为属性自动装配合适的依赖对象,即容器会查找和属性类型想匹配的Bean组件,并自动为属性注入。
若容器中有一个以上类型匹配的Bean时,则可以使用@Qualifier指定所需的Bean名称。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/**
* 用户业务类,实现对User功能的业务管理
*/
@Service("userService")
public class UserServiceImpl implements UserService {
//声明接口类型的引用,和具体实现类解耦合
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
加载注解定义的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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.smbms.service"/>
</beans>
首先在Spring配置文件中添加对context命名空间的声明,然后使用context命名空间下的component-scan标签扫描注解标注的类。base-package属性制定了需要扫描的基准包(多个包名可用逗号隔开)。Spring会扫描这些包中所有的类,获取Bean的定义信息。
使用Java标准注解完成装配
除了提供@Autowried注解,Spring还支持使用JSR-250中定义的@Resource注解实现组件装配。该标准注解也能对类的成员变量或方法入参提供注入功能。
@Resource有一个name属性,默认情况下,Spring将这个属性的值解释为要注入的Bean的名称。
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户业务类,实现对User功能的业务管理
*/
@Service("userService")
public class UserServiceImpl implements UserService {
//为dao属性注入名的userDao的Bean
@Resource(name = "userDao")
private UserDao userDao;
}
如果没有显示地指定Bean的名称,@Resource注解将根据字段名或者setter方法名产生默认的名称:如果注解应用于字段,将使用字段名作为Bean的名称;如果注解应用于setter方法,Bean的名称就是通过setter方法得到的属性名。
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户业务类,实现对User功能的业务管理
*/
@Service("userService")
public class UserServiceImpl implements UserService {
//查找名为dao的Bean,并注入给dao属性
@Resource
private UserDao userDao;
}
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 用户业务类,实现对User功能的业务管理
*/
@Service("userService")
public class UserServiceImpl implements UserService {
private UserDao userDao;
//查找名为userDao的Bean,并注入给setter方法
@Resource
public void setUserDao(UserDao userDao) {
this.userDao=userDao;
}
}
如果没有显示地指定Bean的名称,且无法找到于默认Bean名称匹配的Bean组件,@Resource注解会由按名称查找的方法自动变为按类型匹配的方式进行装配。