spring自动扫描

在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>
分享:

发表评论

邮箱地址不会被公开。 必填项已用*标注

😉😐😡😈🙂😯🙁🙄😛😳😮:mrgreen:😆💡😀👿😥😎😕

验证码 *