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),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

转载于:https://www.cnblogs.com/wwb0111/archive/2012/05/27/3098946.html

Spring的组件自动扫描机制相关推荐

  1. Spring过滤器组件自动扫描

    在这个Spring自动组件扫描的教程,您已经了解如何使Spring自动扫描您的组件.在这篇文章中,我们将展示如何使用组件过滤器自动扫描过程. 1.过滤组件 - 包含 参见下面的例子中使用Spring  ...

  2. 基于Spring Boot自动化装配机制实现多数据库适配

    1. 背景说明 一个应用服务可能会用到多种数据库,可以采用多版本方式去管理运作,实际当中,同一套数据库版本可能又会适配不同的客户需求, 这时候再增加版本去维护会比较复杂, 不利于维护,有没办法根据配置 ...

  3. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  4. Spring5源码 - 11 Spring事件监听机制_源码篇

    文章目录 pre 事件监听机制的实现原理[观察者模式] 事件 ApplicationEvent 事件监听者 ApplicationEvent 事件发布者 ApplicationEventMultica ...

  5. JDK/Dubbo/Spring 三种 SPI 机制,谁更好呢?

    JDK/Dubbo/Spring 三种 SPI 机制,谁更好? SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文 ...

  6. Spring IOC 组件概述

    IOC 概述 IOC: Inversion of Control(控制反转), 这里其实指的是: 将程序中需要使用的 POJOs, 丢入到容器中, 解析成统一的 BeanDefinition(主要基于 ...

  7. 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件

    这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...

  8. 7. Spring Boot2.5 安全机制与 REST API 身份验证实战

    文章目录 Spring Boot2.5 安全机制与 RESTAPI 身份验证实战 一.Java Spring Boot 2.5 安全机制 Java Spring Boot 2.0 安全机制 安全漏洞 ...

  9. 一文读懂Spring中的AOP机制

    一.前言 这一篇我们来说一下 Spring 中的 AOP 机制,为啥说完注解的原理然后又要说 AOP 机制呢? 1.标记日志打印的自定义注解 @Target({ElementType.METHOD}) ...

  10. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

最新文章

  1. 数字对 (长乐一中模拟赛day2T2)
  2. Android LK Bootlaoder启动概览
  3. oracle动态采样超时,解决 ORACLE 11.2 动态采样导致的性能问题
  4. Centos7 amp;amp; Docker amp;amp; Jenkins amp;amp; ASP.NET Core
  5. 从起源到未来:能自己编程和改进的超人工智能会出现吗?
  6. 48.检测对象是否为空
  7. java oscache 缓存_Java]用OSCache进行缓存对象
  8. 配置 IIS 7 显示详细错误信息
  9. 聊聊我在美团做算法的感受
  10. matlab竞赛论文模板,美赛数学建模比赛论文模板.doc
  11. Invisible Perturbations: Physical Adversarial Examples Exploiting the Rolling Shutter Effect 论文解读
  12. 使用ArcMap将txt数据转换成shp数据
  13. 蓝桥杯题目练习 基础篇 [蓝桥杯2015初赛]奖券数目
  14. python萌新笔记----基于requests库请求API下载网易云(VIP)音乐
  15. 王者荣耀在android目录下的名字,王者荣耀手q区有哪些 王者荣耀安卓手Q区名称...
  16. mantis linux 安装,linux安装mantis详细步骤
  17. The Innovation | 用系统生物学的观点鸟瞰肿瘤易感基因
  18. mysql rls_各种类型RLS自适应滤波算法的C++实现
  19. 文件服务器恢复测试,基于文件传输中文件损坏检测和恢复办法.doc
  20. C语言实验——一元二次方程Ⅱ

热门文章

  1. 商品类别推荐系统:LightGBM模型
  2. 迁移学习和数据扩充(附代码)
  3. 最长公共子序列lcs 51nod1006
  4. mifi随身wifi选购
  5. iOS用户体验之-modal上下文
  6. 让我们一起ML吧(一)聚类分析
  7. 如何深入浅出地讲解麦克斯韦方程组
  8. (转)mysql中InnoDB表为什么要建议用自增列做主键
  9. 获取mysqli函数的值和字段名
  10. 单片机TM4C123学习(一):GPIO模块的应用