zoukankan      html  css  js  c++  java
  • Spring的组件自动扫描机制

    Spring将所有的bean都纳入到IOC中创建、管理和维护。对于大型的项目而言,项目中会有成百上千个bean,如果我们都在配置文件中配置,那么我们就会增加配置文件的体积,显得过于臃肿,过于庞大,查找维护起来也不太方便。

    在Spring2.5中引入了组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。

    这种机制的工作步骤是:

    1.配置需要扫描的类;

    2.在需要被纳入Spring容器的类上加上相应的注解;

    3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。

    它的作用是和在XML文件中使用<bean>节点配置组件是一样的。

    自动扫描组件的使用

    第一步:配置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>

    注:<context:component-scan>节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。

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

    · @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()方法寻找组件。在之前的配置文件中我们会用<bean>标签的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),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

    你给了我眼睛,却不给我光明。
  • 相关阅读:
    Golang解析、验证、修改URL之Host、Port、Path
    Golang检测Linux服务器端口占用
    Go MongoDB官方数据库驱动之增删改查
    PostgreSQL学习笔记(二)—— 概览
    PostgreSQL学习笔记(一)—— macOS下安装
    Go基础编程实践(十)—— 数据库
    Servlet的request和response
    JSP和Servlet异常处理转发
    运行servlet跳转页面变成了下载界面,或者中文乱码
    SQL Server事务(二)
  • 原文地址:https://www.cnblogs.com/wwb0111/p/3098946.html
Copyright © 2011-2022 走看看