在spring中我们通过在xml中定义bean来配置组件。如果项目中的组件比较多,如果采用在xml文件中来定义这些bean,那么xml配置文件的体积就会越来越大。虽然可以使用 annotation 来进行注入,维护bean之间的依赖关系,不必在xml中进行配置,少了依赖关系的配置,但bean还是以要在xml中定义,这样xml文件依然是一种增量式的配置。
spring2.5引入了组件自动扫描的机制,可以采用在classpath自动扫描方式把classpath中所有的组件都纳入到spring 容器来进行管理。但是这些类需要使用使用 @Service, @Controller, @Repository 这几个注解。它的作用与在xml文件中使用bean节点配置组件式一样的。
@Service–用于标注业务层组件
@Controller–用于标注控制层组件,比如struts中的action
@Repository–用于标注数据访问组件,如DAO组件
@Component–泛指组件,当组件不好归类的时候,我们可以使用它进行标注
要完成自动扫描,我们好需要在xml配置中引入以下信息:
- a) .context命名空间以及这个命名空间的schema文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- b) <context:component-scan base-package=”com.wq” /> 打开组件扫描配置项base-package表示自动扫描com.wq包以及它的子包。
================================================================
<context:annotation-config /> 可以不必打开,因为<context:component-scan>完成了annotation处理的注册
*************************************************************************************************
com.wq.dao.UserDAO.java //userDAO是这个bean在spring容器中的ID号 //如果不写,则默认为类名,将类名的首字母小写 @Repository("userDAO") public class UserDAO { public String[] findUsers(){ return new String[]{"张三","李四","王五"}; } }
*************************************************************************************************
com.wq.serviceUserService.java //userService是这个bean在spring容器中的ID号 //如果不写,则默认为类名,将类名的首字母小写 @Service("userService") public class UserService { private UserDAO userDao; public UserDAO getUserDao() { return userDao; } @Resource(name="userDAO") public void setUserDao(UserDAO userDao) { this.userDao = userDao; } public String[] getAllUser(){ return userDao.findUsers(); } }
*************************************************************************************************
运行测试类,与前面使用xml配置文件效果是一样的。这样我们就再也不用在xml文件中配置bean了,xml文件也不是一种增量配置
public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService=(UserService) ctx.getBean("userService"); String[] users=userService.getAllUser(); for (String user : users) { System.out.println(user); } }
================================================================
<context:component-scan>提供了两个子标签:<context:include-filter>和<context:exclude-filter>各代表引入和排除的过滤
<context:component-scan base-package="com.xxx.bcm"> <context:include-filter type="regex" expression="com\.xxx\.bcm\.(.+?(dao|action|jms|impl).+?)" /> <context:exclude-filter type="regex" expression="(.+?Test.+?)" /> <context:exclude-filter type="regex" expression="com.xxx.bcm.service.impl.RemoteServiceImpl" /> <context:exclude-filter type="regex" expression="com.xxx.bcm.service.impl.RemoteCalledServiceImpl" /> </context:component-scan>