zoukankan      html  css  js  c++  java
  • Spring 配置自动扫描原理说明

    Spring利用IOC容器将所有的bean进行有秩序的管理维护,而实际项目中不可能在xml文件中创建bean,而是利用了Spring的组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。

    • 这种机制的工作步骤是: 
      1.配置需要扫描的类; 
      2.在需要被纳入Spring容器的类上加上相应的注解; 
      3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。 
      它的作用是和在XML文件中使用节点配置组件是一样的。

    自动扫描组件的使用 
    第一步:配置applicationContext.xml文件;如下:

    <?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"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    ">
    <!-- 打开Spring组件自动扫面,并配置要扫描的基本包 -->
    <context:component-scan base-package="com.springtest"></context:component-scan>
    </beans>

    注:节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。 
    在这里说明一下:context:component-scan有一个use-default-filters属性,默认为true,这就意味着会扫描指定包base-package下的全部的标有@Component@Service,@Repository的类,并注册成bean. 
    1. context:include-filter 指定扫描位置 
    2. context:exclude-filter 指定的不扫描 
    use-default-filters=”true”时,此时指定的include-filter不会起到作用,只有当 
    use-default-filters=”false”时,context:exclude-filter指定的不扫描,context:include-filter指定的扫描

    第二步:为需要被扫描的类添加相应的注解;注解的类型有以下几种:

    • @Service 用于标注业务层组件;
    • @Repository 用于标注数据访问层组件;
    • @Controller 用于标注控制层组件(如:Struts中的action)
    • @Component 表示泛型组件,当组件不好归类的时候,我们可以使用这个组件进行注解。

    第三步:当为类添加完成注解后,我们需要测试相应的组件是否被纳入Spring容器,所以我们需要测试组件是否被扫描;如下:

    @Test
    public void testAddUser()
    {
    UserBiz userBiz = (UserBiz)context.getBean("userBizImpl");
    System.out.println(userBiz);
    }

    如果输出不为空,则说明测试类已经被扫描并且纳入了Spring容器。 
    细节问题总结: 
    1.当我们进行测试时,用ApplicationContext对象的getBean()方法寻找组件。在之前的配置文件中我们会用标签的id属性去定义,在使用注解后怎样获得组建的id呢? 
    在这种情况下,Spring会将被标注注解的类名拿到,然后再将该类名的第一个字母变为小写,放到getBean()方法中。如:UserBizImpl类的组件Id就会是userBizImpl,获取时为context.getBean(“userBizImpl”); 
    那么,我们在使用注解时可以自定义组件的Id吗? 
    当然可以。 
    我们需要在为相应的类添加注解时,在注解之后添加自定义的类名,例如:

    @Service("userBiz")
    public class UserBizImpl implements UserBiz {
    ……
    }

    当我们在获取该组件时,为context.getBean(“userBiz); 
    2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢? 
    我们可以直接在为类添加注解的同时,运用另一个注解@Scope(“prototype”)来设置,如下 
    @Service(“userBiz”)@Scope(“prototype”) 
    public class UserBizImpl implements UserBiz { 
    …… 

    3.在使用注解时,为组件设置初始化和销毁方法: 
    在添加注解的相应的类中,如果想初始化或销毁某个方法,我们可以直接在方法上添加注解,如下:

    @PostConstruct
    public void addItem() {
    System.out.println("初始化方法");
    }
    @PreDestroy
    public void testItem() {
    System.out.println("释放资源");
    }

    4.在使用Spring自动扫描组件后,怎样进行依赖注入? 
    运用注解@Resource和@Autowired,并为依赖对象设置名称,例如:

    @Resource(name="userDao")
    private UserDAO userDao = null;

    首先它会根据名称去找Spring自动扫描的并加入到Spring容器的组件(bean),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

    引自:http://blog.163.com/qqabc20082006@126/blog/static/2292852520091128103316534/

  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    thinkphp使用foreach遍历的方法
    php中foreach中使用&的办法
    thinkphp做搜索功能
    数据库虚拟主机目录的配置文件
    网页响应式设计原理
    数据库常见远程连接问题
  • 原文地址:https://www.cnblogs.com/Luke-Me/p/8941445.html
Copyright © 2011-2022 走看看