Spring3系列7- 自动扫描组件或Bean

原文地址


http://www.cnblogs.com/leiOOlei/p/3547589.html


一、      Spring Auto Scanning Components —— 自动扫描组件    

    1.      Declares Components Manually——手动配置component

    2.      Auto Components Scanning——自动扫描组件

    3.      Custom auto scan component name——自定义扫描组件名称

    4.      Auto Components Scan Antotation Types——自动扫描组件的注释类型

二、      Spring Filter Components In Auto Scanning —— 在自动扫描中过滤组件

    1.      Filter Component——include

    2.      Filter Component——exclude

 

 

一、      Spring Auto Scanning Components —— 自动扫描组件

通常你可以在xml配置文件中,声明一个bean或者component,然后Spring容器会检查和注册你的bean或component。实际上,Spring支持自动扫描bean或component,你可以不必再在xml文件中繁琐的声明bean,Spring会自动扫描、检查你指定包的bean或component。

以下列举一个简单的Spring Project,包含了Customer、Service、DAO层,让我们来看一下手动配置和自动扫描的不同。

1.      Declares Components Manually——手动配置component

先看一下正常手动配置一个bean

DAO层,CustomerDAO.java如下:

复制代码
package com.lei.customer.dao;public class CustomerDAO 
{@Overridepublic String toString() {return "Hello , This is CustomerDAO";}    
}
复制代码

 

Service层,CustomerService.java如下:

复制代码
package com.lei.customer.services;import com.lei.customer.dao.CustomerDAO;public class CustomerService 
{CustomerDAO customerDAO;public void setCustomerDAO(CustomerDAO customerDAO) {this.customerDAO = customerDAO;}@Overridepublic String toString() {return "CustomerService [customerDAO=" + customerDAO + "]";}}
复制代码

 

 

配置文件,Spring-Customer.xml文件如下:

复制代码
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="customerService" class="com.lei.customer.services.CustomerService"><property name="customerDAO" ref="customerDAO" /></bean><bean id="customerDAO" class="com.lei.customer.dao.CustomerDAO" /></beans>
复制代码

 

运行如下代码,App.java如下:

复制代码
package com.lei.common;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lei.customer.services.CustomerService;public class App 
{public static void main( String[] args ){ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});CustomerService cust = (CustomerService)context.getBean("customerService");System.out.println(cust);}
}
复制代码

 

输出结果:CustomerService [customerDAO=Hello , This is CustomerDAO]

 

2.      Auto Components Scanning——自动扫描组件

现在,看一下怎样运用Spring的自动扫描。

用注释@Component来表示这个Class是一个自动扫描组件。

Customer.java如下:

复制代码
package com.lei.customer.dao;import org.springframework.stereotype.Component;@Component
public class CustomerDAO 
{@Overridepublic String toString() {return "Hello , This is CustomerDAO";}    
}
复制代码

 

CustomerService.java如下:

复制代码
package com.lei.customer.services;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.lei.customer.dao.CustomerDAO;@Component
public class CustomerService 
{@AutowiredCustomerDAO customerDAO;@Overridepublic String toString() {return "CustomerService [customerDAO=" + customerDAO + "]";}
}
复制代码

 

 

配置文件Spring-customer.xml如下

 

复制代码
<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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:component-scan base-package="com.lei.customer" /></beans>
复制代码

 

 

 

注意:

以上xml文件中,加入了“context:component-scan”标签,这样就将Spring的自动扫描特性引入,base-package表示你的组件的存放位置,Spring将扫描对应文件夹下的bean(用@Component注释过的),将这些bean注册到容器中。

       最后运行结果与手动配置的结果一致。

3.      Custom auto scan component name——自定义扫描组件名称

上例中,默认情况下,Spring将把组件Class的第一个字母变成小写,来作为自动扫描组件的名称,例如将“CustomerService”转变为“customerservice”,你可以用“customerService”这个名字调用组件,如下:

CustomerService cust = (CustomerService)context.getBean("customerService");

 

你可以像下边这样,创建自定义的组件名称:

 

@Service("AAA")
public class CustomerService 
...

 

现在,可以调用自己定义的组件了,如下:

CustomerService cust = (CustomerService)context.getBean("AAA");

 

4.      Auto Components Scan Antotation Types——自动扫描组件的注释类型

有4种注释类型,分别是:

@Component      ——表示一个自动扫描component

@Repository              ——表示持久化层的DAO component

@Service             ——表示业务逻辑层的Service component

@Controller        ——表示表示层的Controller component

 

以上4种,在应用时,我们应该用哪一种?让我们先看一下@Repository、@Service、@Controller的源代码

复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {String value() default "";}
复制代码

 

你还可以看一下@Service、@Controller的源代码,发现它们都用@Component注释过了,所以,在项目中,我们可以将所有自动扫描组件都用@Component注释,Spring将会扫描所有用@Component注释过得组件。

       实际上,@Repository、@Service、@Controller三种注释是为了加强代码的阅读性而创造的,你可以在不同的应用层中,用不同的注释,就像下边这样。

DAO层:

复制代码
package com.lei.customer.dao;import org.springframework.stereotype.Repository;@Repository
public class CustomerDAO 
{@Overridepublic String toString() {return "Hello , This is CustomerDAO";}    
}
复制代码

 

 

Service层:

复制代码
package com.lei.customer.services;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.lei.customer.dao.CustomerDAO;@Service
public class CustomerService 
{@AutowiredCustomerDAO customerDAO;@Overridepublic String toString() {return "CustomerService [customerDAO=" + customerDAO + "]";}}
复制代码

 

 

二、      Spring Filter Components In Auto Scanning —— 在自动扫描中过滤组件

1.      Filter Component——include

下例演示了用“filter”自动扫描注册组件,这些组件只要匹配定义的“regex”的命名规则,Clasee前就不需要用@Component进行注释。

DAO层,CustomerDAO.java如下:

复制代码
package com.lei.customer.dao;public class CustomerDAO 
{@Overridepublic String toString() {return "Hello , This is CustomerDAO";}    
}
复制代码

 

Service层,CustomerService.java如下:

复制代码
package com.lei.customer.services;import org.springframework.beans.factory.annotation.Autowired;
import com.lei.customer.dao.CustomerDAO;public class CustomerService 
{@AutowiredCustomerDAO customerDAO;@Overridepublic String toString() {return "CustomerService [customerDAO=" + customerDAO + "]";}}
复制代码

 

Spring Filtering,xml配置如下:

复制代码
<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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:component-scan base-package="com.lei" ><context:include-filter type="regex" expression="com.lei.customer.dao.*DAO.*" /><context:include-filter type="regex" expression="com.lei.customer.services.*Service.*" /></context:component-scan></beans>
复制代码

 

注意:

以上xml文件中,所有文件名字,只要包含DAO和Service(*DAO.*,*Service.*)关键字的,都将被检查注册到Spring容器中。

 

运行以下代码:

复制代码
package com.lei.common;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lei.customer.services.CustomerService;public class App 
{public static void main( String[] args ){ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-AutoScan.xml"});CustomerService cust = (CustomerService)context.getBean("customerService");System.out.println(cust);}
}
复制代码

 

运行结果:CustomerService [customerDAO=Hello , This is CustomerDAO]

 

2.      Filter Component——exclude

你也可以用exclude,制定组件避免被Spring发现并被注册到容器中。

以下配置排除用@Service注释过的组件

<context:component-scan base-package="com.lei.customer" ><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />        
</context:component-scan>

 

以下配置排除包含“DAO”关键字的组件

<context:component-scan base-package="com.lei" ><context:exclude-filter type="regex" expression="com.lei.customer.dao.*DAO.*" />        
</context:component-scan>



转载于:https://www.cnblogs.com/zaifeng0108/p/7225055.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps 实践分享

这周一&#xff0c;我们迫不及待写下了最新的 changelog —— 项目语言新增「Java」。创建 Java 项目工作流和其它语言项目配置很相似&#xff0c;flow.ci 提供了默认的 Java 项目构建流程模版&#xff0c;快去试试吧&#xff5e; 最近 flow.ci 2017 招聘计划正式启动&#xff…

python选取tensor某一维_Pytorch的Tensor操作(1)

类型推断torch.randn()&#xff1a;随机初始化a.type()&#xff1a;返回类型type()&#xff1a;返回基本类型isinstance() &#xff1a;检查类型cuda会影响数据类型标量维度(dimention)为0的标量标量的shape&#xff1a;返回类型为【】(空的list)&#xff0c;返回长度也为0a.di…

201521123014 《Java程序设计》第8周学习总结

201521123014 《Java程序设计》第8周学习总结 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 泛型&#xff08;编写的代码可被不同类型的对象所重用&#xff09; Java中一个集合可以放任何类型的对象&#xff0c;因为…

【4.0】jdbcTemplate

1.什么是jdbcTemplate? 2.使用jdbcTemplate 3.crud操作 参考博文&#xff1a;http://blog.csdn.net/u014800380/article/details/64125653 4.采用配置文件的方式使用jdbcTemplate 参考博文&#xff1a;http://suyanzhu.blog.51cto.com/8050189/1563219/ 参考博文原文&#x…

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读&#xff1a;触摸屏能够直观、生动地显示运行参数和运行状态&#xff0c;而且通过触摸屏画面可以直接修改系统运行参数&#xff0c;人机交互性好。触摸屏和单片机通信&#xff0c;需要根据触摸屏采用的通信协议为单片机编…

【转】C#之继承

C#之继承 一.继承的类型  在面向对象的编程中&#xff0c;有两种截然不同继承类型&#xff1a;实现继承和接口继承  1.实现继承和接口继承  *实现继承&#xff1a;表示一个类型派生于基类型&#xff0c;它拥有该基类型的所有成员字段和函数。在实现继承中&#xff0c;派生…

java 学习计划_Java学习计划范例

Java学习计划范例Java学习计划好的计划是成功的一半&#xff0c;今天是在创新思维的第一节课&#xff0c;在这门课程的开始&#xff0c;一个有策略的、有目的性的计划是非常必要的&#xff0c;为了在以后的学习中能够达到最好的.效果&#xff0c;"坚持"是一把雕刻刀&…

SQL Server 2012自动备份

SQL 2012和2008一样&#xff0c;都可以做维护计划&#xff0c;来对数据库进行自动的备份。 现在做这样一个数据库维护的计划&#xff0c;每天0点对数据库进行差异备份&#xff0c;每周日0点对数据库进行完全备份&#xff0c;并且每天晚上10点删除一次过期备份&#xff08;两个星…

mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

一、前言本文将基于主从复制&#xff0c;读写分离的环境基础上进行一个简单的分片(分库分表)配置二、Mycat分片配置mycat分片主要在scheam.xml&#xff0c;rule.xml这2个表中配置① scheam.xml&#xff1a;配置逻辑表以及对应使用的分片规则select user()这里小编主要对t_user表…

JS取消浏览器文本选中的方法

一 、问题的出现 今天在使用Easy-UI 的messager.alert()方法时候出现浏览器文本被选中&#xff0c;不知道其中是什么原因&#xff0c;如下图所示。 二 、解决思路 我最后的思路时在弹出消息框的同时&#xff0c;取消浏览器文本的选择&#xff0c;最后查找资料编写如下方法。  …

linux 脚本 java_Linux 通过脚本执行Java程序

由于要统计不同的IP&#xff0c;代码中应用了HashSet来存放IP地址。上述Java程序是在Windows下编写的&#xff0c;如果在Linux服务器上运行&#xff0c;只需要把上面文件的路径和文件更换了就可以了。2.编写好java程序后&#xff0c;将java程序打成jar文件(环境Linux)我将上述测…

Java开启/关闭tomcat服务器

© 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处 通过java代码实现Tomcat的开启与关闭 1.项目结构 2.CallTomcat.java package com.calltomcat.test;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;…

5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

5、如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a sample("ABCDEF",randint(5,6)) # print(a) # b1 {x:randint(1,4) for x in sample("ABCDEF",randint(3,6))} # b2 {x:randint(1,4) for x in sample("A…

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机

一 .KVM 简介 KVM &#xff08;名称来自英语&#xff1a; Kernel-basedVirtual Machine 的缩写&#xff0c;即基于内核的虚拟机&#xff09; &#xff0c; 是一种用于Linux内核中的虚拟化基础设施&#xff0c;可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Li…

python 如何在一个for循环中遍历两个列表

是我在看《笨方法学python》过程中发现有一行代码看不懂——“ for sentence in snippet, phrase:”&#xff0c;所以研究了半天&#xff0c;感觉挺有收获的。所以就放在博客上分享给大家了。 直入主题&#xff1a; 为了不耽误大家时间&#xff0c;如果知道以下为两段代码为什么…

画王八java代码参数_java画乌龟源代码-郭遥航.doc

java画乌龟源代码-郭遥航.doc /*JAVA基本功小练习用java语言描述小王八用鼠标可以拖动小乌龟进行移动选中乌龟时可以显示小乌龟的腹面*/importjava.awt.*;importjavax.swing.*;importjava.awt.event.MouseMotionListener;importjava.awt.event.MouseListener;importjava.awt.ev…

java服务注册中心有哪些_Spring Cloud服务注册中心简述

概念当一个大型系统拥有很多服务时&#xff0c;往往需要一个服务注册中心来管理这些服务&#xff0c;它可以提供如下功能&#xff1a;登记每个服务提供的功能检测每个服务是否可用&#xff0c;不可用的服务剔除服务间互相调用时&#xff0c;通过服务注册中心很容易找到目标服务…

JavaScript原生对象及扩展

来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置&#xff08;Build-in&#xff09;对象与原生&#xff08;Naitve&#xff09;对象的区别在于&#xff1a;前者总是在引擎初始化阶段就被创建好的对象&#xff0c;是后者的一个子集&#xff1b;而后…

实例化Java对象_Java面向对象基础之对象实例化

1、实例化对象的过程可以分为两部分,例如下面代码:Person per new Person();该代码分为两部分:第一,声明对象:Personper&#xff0c;这部分是在栈内存中声明的&#xff0c;与数组一样&#xff0c;数组名称及时保存在占内存之中&#xff0c;只是开闭了真内存&#xff0c;对象是…

HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误...

错误摘要 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置&#xff0c;无法提供您请求的页面。 详细错误信息 模块IsapiModule通知ExecuteRequestHandler处理程序ExtensionlessUrlHandler-ISAPI-4.0_32bit错误代码0x800704ec请求的 URLhttp://:…