spring组件扫描context:component-scan/使用详解

关于spring自动检测组件的使用方式网上太多了,而且也不是我记录的重点,我想说下一点可能你还不知道的经验
我们知道如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入。
先写一个小例子,剩下的在下面解释
<!-- 定义扫描根路径为leot.test,不使用默认的扫描方式 -->
<context:component-scan base-package="leot.test" use-default-filters="false">
  <!-- 扫描符合@Service @Repository的类 -->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
下面是引用spring framework开发手册中的一段话

Spring 2.5引入了更多典型化注解(stereotype annotations): @Component@Service @Controller@Component是所有受Spring管理组件的通用形式;而@Repository@Service @Controller则是@Component的细化,用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。也就是说,你能用@Component来注解你的组件类,但如果用@Repository@Service @Controller来注解它们,你的类也许能更好地被工具处理,或与切面进行关联。例如,这些典型化注解可以成为理想的切入点目标。当然,在Spring Framework以后的版本中, @Repository@Service @Controller也许还能携带更多语义。如此一来,如果你正在考虑服务层中是该用@Component还是@Service,那@Service显然是更好的选择。同样的,就像前面说的那样, @Repository已经能在持久化层中进行异常转换时被作为标记使用了。”

 

下面是网上目前关于组件扫描最详细的介绍

Spring applicationContext.xml的<context:component-scan>標籤用途比我想像的還要實用。而且後來才知道,有了<context:component-scan>,另一個<context:annotation-config/>標籤根本可以移除掉,因為被包含進去了。原本我survery Spring3通常只配置成<context:component-scan base-package="com.foo.bar"/>,意即在base-package下尋找有@Component和@Configuration的target Class。而現在如下的飯粒:

<context:component-scan base-package="com.foo" use-default-filters="false">
<context:include-filter type="regex" expression="com.foo.bar.*Config"/>
<context:include-filter type="regex" expression="com.foo.config.*"/>
</context:component-scan>

  <context:component-scan>提供兩個子標籤:<context:include-filter>和<context:exclude-filter>各代表引入和排除的過濾。而上例把use-default-filters屬性設為false,意即在base-package所有被宣告為@Component和@Configuration等target Class不予註冊為bean,由filter子標籤代勞。

  filter標籤在Spring3有五個type,如下:

Filter TypeExamples ExpressionDescription
annotationorg.example.SomeAnnotation符合SomeAnnoation的target class
assignableorg.example.SomeClass指定class或interface的全名
aspectjorg.example..*Service+AspectJ語法
regexorg\.example\.Default.*Regelar Expression
customorg.example.MyTypeFilterSpring3新增自訂Type,實作org.springframework.core.type.TypeFilter

  所以上例用的regex就有個語病,com.foo.config.* 可以找到com.foo.config.WebLogger,但也可以找到com1fool2config3abcde,因為小數點在Regex是任意字元,是故要用\.把小數點跳脫為佳。(2010/3/15補充:但要使用\.方式,其use-default-filters不能為false,否則抓不到,感覺是Bug)

  Spring3提供豐富的Filter支援,有益配置策略,不需面臨Configuration Hell,比如Regex的com\.foo\.*\.action\.*Config,這樣就可以找到com.foo package下所有action子package的*Config的target class。

 

我按他的例子,配置了我自己的如下:

<context:component-scan base-package="com.xhlx.finance.budget"  >
  <context:include-filter type="regex" expression="com.lee.finance.budget.service.*"/>
  <context:include-filter type="regex" expression="com.lee.finance.budget.security.*"/> 
</context:component-scan>
但是死活扫描不到,网上又没有更好的讲解,没办法只好自己试,改成
<context:component-scan base-package="com.xhlx.finance.budget" >
  <context:include-filter type="regex" expression="com.lee.finance.budget.*"/>
</context:component-scan>
这样连没有加注解的类也扫描并实例化,结果报错,因为有的类根本就没有默认的构造函数不能实例化,能不报错吗
改成
<context:component-scan base-package="com.xhlx.finance.budget"  >
  <context:include-filter type="regex" expression="com\.lee\.finance\.budget\.service.*"/>  
</context:component-scan>问题依旧
<context:component-scan base-package="com.xhlx.finance.budget" >
  <context:include-filter type="regex" expression="com.lee.finance.budget.service.TestService"/>
</context:component-scan>
嘿,这次可以了,写全限定名就可以,表达式却不行,但是如果我有成千上百个还得一个一个这样配置啊?不行,继续研究,我想有个base-package的配置,从表面意思来看这是个“基本包”,是否表示下面的过滤路径是基于这个包的呢?于是试着改成
<context:component-scan base-package="com.xhlx.finance.budget" >
  <context:include-filter type="regex" expression=".service.*"/>
</context:component-scan>
嘿,行了。 
原文地址:http://blog.sina.com.cn/s/blog_57769b7b0100tt5x.html

转载于:https://www.cnblogs.com/smile361/p/3247331.html

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

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

相关文章

最短路径实现

主要工具 QGIS建立拓扑关系 Postgres存储数据表 Geoserver发布相关服务 QGIS建立拓扑关系 使用v.clean运行&#xff0c;并用DBManager即可以建立拓扑关系并导入数据库。 注意 QGIS2.16有数据溢出问题&#xff0c;使用QGIS2.14可以解决这个问题 Postgres存储数据表 导…

2019将成机器学习关键年:中美AI或有一战

作者 | Hussain Fakhruddin译者 | 大小非编辑 | Vincent 来源 | AI前线(ID&#xff1a;ai-front)导读&#xff1a;2019 年将是机器学习关键的一年。ML 已经成为全球数字转型的关键要素之一——到 2021 年底&#xff0c;累计投资预计将达到 580 亿美元。在企业应用领域&#xff…

LOGO设计中文字体设计十种手法

LOGO设计中文字体设计十种手法 Tags&#xff1a;LOGO设计中文字体设计手法 1.连接法——结合字体特征将笔画相连接的形式 2.简化法——根据字体特点&#xff0c;利用视觉错觉合理地简化字体部分笔画的形式 3.附加法——在字体外添加配合表现标示的图形的形式 4.底图法——将字体…

深度 | IBM长文解读人工智能、机器学习和认知计算

来源&#xff1a;人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏&#xff0c;近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日&#xff0c;IBM 官网发表了一篇概述文章&#xff0c;对人工智能技术的发展过程进行了简单梳理&#xff0c;同时还图文并…

【ACM】hdu_1862_EXCEL排序_201308091948

EXCEL排序 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11903 Accepted Submission(s): 4736 Problem DescriptionExcel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。Input测试输入包含若…

多变量线性回归

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn) 增添更多特征后,我们引入一系列新的注释: n 代表特征的数量 x(i)代表第 i 个训练实例,是特征矩阵中的第 i 行,是一…

人工智能乌托邦 迪拜认为2071年人类应该这样生活!

来源&#xff1a;网易智能不同于硅谷老牌的科技力量&#xff0c;迪拜一直是独特的存在。他们日益崛起的科技实力正在被验证&#xff0c;无论是全面AI化的基础建设和城市治安力量&#xff0c;还是频频登上全球科技头条的机器人警察和空中出租车&#xff0c;迪拜试图摆脱很多人眼…

[leetcode]Decode Ways

动态规划。要注意waydp[i-1]或dp[i-2]以及way1的条件。我看有的人把数组命名为count的。 public class Solution {public int numDecodings(String s) {// Start typing your Java solution below// DO NOT write main() functionint len s.length();if (len 0) return 0;int…

逻辑回归与正则化

在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问 题的例子有:判断一封电子邮件是否是垃圾邮件;判…

万字报告!一文看懂全球车厂的技术家底模块化平台

来源&#xff1a;智东西摘要&#xff1a;介绍模块化平台以及该平台对车企的重要意义&#xff0c;详解车企模块化平台布局。汽车的研发制造方式经历了手工作坊式到标准化流水线再到平台化&#xff0c;目前主流车企纷纷采取模块化平台方式。汽车模块化平台研发制造是指车企基于通…

记录下Lambda常用的表现形式

纯粹记录下Lambda的表现形式&#xff1a; (x, y) > x * y;//多参数&#xff0c;隐式类型>表达式 x > x * 10;//单参数&#xff0c;隐式类型>表达式 x > { return x * 10; }; //单参数&#xff0c;隐式类型>语句块 (int x) > x * 10;//单参数&#xff0c;显…

西湖大学全披露:68位顶级科学家加盟,已获捐资35亿,最小捐赠者12岁

来源&#xff1a;量子位最终&#xff0c;2018年10月20日&#xff0c;成为了西湖大学的成立日。在刚结束的成立大会上&#xff0c;5名诺贝尔奖得主、70余位国内外校长及代表、近百位捐赠人齐聚。可谓少长咸集&#xff0c;高朋满座&#xff0c;生而备受期待。而且就在创立大会上&…

字体大宝库:设计师必备的专业免费英文字体

字体绝对是每一个设计非常重要的部分&#xff0c;设计者总是希望有最好的免费字体&#xff0c;以保持他们字体库的更新。所以今天我要向设计师们分享一个专业的免费英文字体集合。这些免费的字体是适用于任何类型的图形设计&#xff1a;Web&#xff0c;打印&#xff0c;动态图形…

神经网络学习

代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经 网络层数,Sl表示每层的 neuron 个数(SL表示输出层神经元个数),SL代表最后一层中处理 单元的个数。 将神经网络的分类定义为两种情况:二类分…

干货|深度!“人工智能+制造”产业发展研究报告

来源&#xff1a;&#xff1a;腾讯研究院工业革命以后的“自动化”概念追求的是机器自动生产&#xff0c;本质是“机器替人”&#xff0c;强调在完全不需要人的情况下进行不间断的大规模机器生产&#xff1b;而“智能化”追求的是机器的柔性生产&#xff0c;本质是“人机协同”…

简明外贸报价单(Price List)范本

简明外贸报价单&#xff08;Price List&#xff09;范本 简明外贸报价单&#xff08;Price List&#xff09;范本 报价单 Price List 报价日期&#xff1a;年 月 日 Supplier   Address   供应商 公司地址 Contact   Approvals   联系人名 产品认证 Tel …

机器学习系统设计与建议

当我们在运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以 做什么? 1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可 考虑先采用下面的几种方法。 2. 尝试减少特征的数量 3. 尝试获得更多的特征 4. 尝试增加多项式特征…

李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」

来源&#xff1a;网络大数据刚刚&#xff0c;李飞飞宣布斯坦福开启「以人为中心的 AI 计划」(Human-Centered AI Initiative&#xff0c;HAI)&#xff0c;该项目由李飞飞和斯坦福大学前教务长 John Etchemendy 共同主导&#xff0c;Chris Manning 也参与其中。李飞飞在 twitter…

前端开发如何做好SEO优化的工作

前端开发工程师不仅需要要跟视觉设计师、交互式设计师配合&#xff0c;完美还原设计图稿&#xff0c;编写兼容各大浏览器、加载速度快、用户体验好的页面。现在还需要跟SEO人员配合&#xff0c;调整页面的代码结构和标签。 一些成熟的平台&#xff0c;在开发初期并没有考虑优化…

支持向量机学习

与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性 方程时 供了一种更为清晰,更加强大的方式 如果我们用一个新的代价函数来代替,即这条从 0 点开始的水平直线,然后是一条斜 线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为cost1(z),同时,…