通过在classpath自动扫描方式把组件纳入spring容器中管理
通常情况下我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如
果这些这组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。
spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component、@Service、
@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使
用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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
>
</beans>
给类使用的注解的名字及其作用:
注解名字 | 作用 |
---|---|
@Service | 用于标注业务层组件 |
@Controller | 用于标注控制层组件(如struts中的action、Servlet层) |
@Repository | 用于标注数据访问组件,即DAO组件。 |
@Component | 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 |
例子:
@Repository
public class UserDao {
public void addUser()
{
//方法体
}
}
给依赖属性使用的注解
- @Autowired
- @Resource
@Autowired
- @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。
- @Autowired采取的策略为按照类型注入。
例如:
public class UserService {
@Autowired
private UserDao userDao;
}
如上代码所示,这样装配回去spring容器中找到类型为UserDao的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。
@Qualifier告诉spring具体去装配哪个对象
这个时候我们就可以通过类型和名称定位到我们想注入的对象。
public class UserService {
@Autowired
@Qualifier(name="userDao1")
private UserDao userDao;
}
@Resource
- @Resource注解由J2EE提供,需要导入包javax.annotation.Resource。
- @Resource默认按照属性的名字自动注入,也可以指定name和type。
例如:
public class UserService {
@Resource //默认情况。去Spring上下文中查找id="userDao"bean
private UserDao userDao;
@Resource(name="studentDao") //指定name的情况
private StudentDao studentDao;
@Resource(type="TeacherDao") //指定type的情况
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao") //指定name和type的情况
private ManDao manDao;
}
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
总结
Spring属于第三方的,J2EE是Java自己的东西。使用@Resource可以减少代码和Spring之间的耦合。
两者都可以写在字段和setter方法上。两者如果都写在属性的字段上,那么就不需要再写setter方法。
当存在多个类型,却又没有指定的时候,会报如下的错误。