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/
Spring 配置自动扫描原理说明的更多相关文章
- Spring 配置自动扫描spring bean配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- (4.1)Spring MVC执行原理和基于Java的配置过程
一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...
- Spring MVC执行原理和基于Java的配置过程
一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...
- Spring Boot2 系列教程(七)理解自动化配置的原理
Spring Boot 中的自动化配置确实够吸引人,甚至有人说 Spring Boot 让 Java 又一次焕发了生机,这话虽然听着有点夸张,但是不可否认的是,曾经臃肿繁琐的 Spring 配置确实让 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- 深入理解Spring IOC工作原理
为什么会出现spring,spring出现解决了什么问题? 1.分析普通多层架构存在的问题 JSP->Servlet->Service->Dao 层与层之间的依赖很强,属于耦合而且是 ...
- Spring Boot启动原理解析
Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置 ...
- spring boot启动原理步骤分析
spring boot最重要的三个文件:1.启动类 2.pom.xml 3.application.yml配置文件 一.启动类->main方法 spring boot启动原理步骤分析 1.spr ...
- spring boot 启动原理详细解析
我们开发任何一个Spring Boot项目,都会用到如下的启动类 1 @SpringBootApplication 2 public class Application { 3 public stat ...
随机推荐
- HD-ACM算法专攻系列(3)——Least Common Multiple
题目描述: 源码: /**/ #include"iostream" using namespace std; int MinComMultiple(int n, int m) { ...
- 使用Chrome浏览器,让我们远离(所有)广告
你是否还在为浏览网页时各种广告霸屏而急躁不安?这里分享一个小技巧,如何自动屏蔽各大广告. 这里使用的浏览器是Chrome,直接在Chrome网上应用商店搜索下载安装AdBlock插件(不知道其它浏览器 ...
- Android框架-Volley(三)
经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest.JsonRequest.ImageRequest等.其中StringRequest用于请 ...
- UI Framework-1: Aura Multi-desktop
Multi-desktop Aura now makes it possible for the same browser process to render to multiple desktops ...
- 如何知道 CPU 是否支持虚拟化技术(VT)
作者: Sk 译者: LCTT geekpi 我们已经知道如何检查你的 Linux 操作系统是 32 位还是 64 位以及如何知道你的 Linux 系统是物理机还是虚拟机.今天,我们将学习另一个有用的 ...
- NodeJS学习笔记 (23)模块机制-module
https://github.com/chyingp/nodejs-learning-guide
- django 在非空的字段里插入现象表述
1.char 类型设置为非空 对于字段不赋值 默认储存为''(空字符串) 2.int 类型设置为非空 对于字段不赋值 单条插入 报错 多条数据同时插入 默认设置为0
- spring mvc 防止重复提交表单的两种方法,推荐第二种
第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...
- Linux Unix shell 编程指南学习笔记(第五部分)
第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...
- Unity multiplayer
using UnityEngine; using System.Collections; public class multiplayer_Button : MonoBehaviour { void ...