目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从一个互联网职场小白到一个沪漂湿人,一路让我知道分享是一件多么重要的事情,总之不对的地方,多多指出,我们一起徜徉代码的海洋!
 
我这里做每个章节去说的前提,不是一定很标准的套用一些官方名词,目的是为了让大家可以理解更加清楚,如果形容的不恰当,可以留言出来,万分感激

上节我们说到一些生命周期和创建对象的注解,本节我们看一些扫描相关的注解

1、注解扫描详解

我们一直用过一个xml的标签

<context:component-scan base-package="com.chenxin.spring5.jdk"></context:component-scan>

表示Spring会扫描base-package指定的包以及子包下,进行注解的扫描,来创建对象和注入的。

这个方式自然有点粗犷了,如果我想扫描com.chenxin.spring5.jdk下面的部分包呢,那么这个注解,就显得比较繁琐了,所以Spring衍生出了一个注解,帮助我们更细粒度的控制这个包的扫描情况

先看看Spring用配置文件的方式是怎么处理的

1.1、排除方式

内部有个标签叫做exclude-filter意思是排除哪些你不想要的包,type字段有5个属性

  • annotation:排除特定的注解,不进行扫描
  • aspectj:排除特定的包下的类上的Spring注解,不进行扫描,通过切入点表达式过滤,注意表达式只能用包切入点,和类切入点,不熟悉多翻翻前面的知识点
  • assignable:排除特定的类,不进行扫描
  • custom:自定义排除策略,开发中用的更少了;一般会用在框架的底层开发中。比如在开发Springboot的时候,大量使用这个
  • regex:正则表达式,进行排除,这个用的很少很少,其实作用和aspectj作用一样的,更多用的是aspectj来实现。

假如我有个需求,我要扫描com.chenxin.spring5.jdk下的一些包,但是我想排除某个类,让Spring不扫某个类,比如就是com.chenxin.spring5.jdk.User,那么我们就可以这么写

<context:component-scan base-package="com.chenxin.spring5.jdk"><context:exclude-filter type="assignable" expression="com.chenxin.spring5.jdk.User"/></context:component-scan>

这样就可以做到我不想扫包下的特定类!!

假如我现在又有一个需求,我要扫描com.chenxin.spring5.jdk下的一些包,但是我想排除特定的注解,比如我不想扫一些@Service的一些类

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

假如我又有一个需求,我要扫描com.chenxin.spring5下的一些包,但是我想排除某些包或者子包下的类上具有Spring的注解,不进行扫描,com.chenxin.spring5.jdk..*表示下面的包及其子包(包切入点)

 <context:component-scan base-package="com.chenxin.spring5"><context:exclude-filter type="aspectj" expression="com.chenxin.spring5.jdk..*"/></context:component-scan>

如果是类切入点表达式呢,*..User表示当前com.chenxin.spring5所有的包及其子包下,只要有User类,就不扫进去

 <context:component-scan base-package="com.chenxin.spring5"><context:exclude-filter type="aspectj" expression="*..User"/></context:component-scan>

注意细节:

排除策略可以叠加使用的,比如我可以排除某个特定类,也可以同时排除某个包,举个例子哈,比如我想要排除这个com.chenxin.spring5.bean.User这个类不被扫描,又想排除这个com.chenxin.spring5.jdk..*这个包及其子包下的所有的类

<context:component-scan base-package="com.chenxin.spring5"><context:exclude-filter type="assignable" expression="com.chenxin.spring5.bean.User"/><context:exclude-filter type="aspectj" expression="com.chenxin.spring5.jdk..*"/></context:component-scan>

1.2、包含方式

包含方式决定了Spring要扫描哪些注解,进而完成对象的创建

和排除方式不同的地方有两点

  • use-default-filters="false",作为这个属性,Spring是有个默认策略,就是你写了base-package的包路径,会默认扫你当前包和子包下的所有注解,而这个属性默认是true,表示使用默认的过滤,但是目前因为是要包含某些包下的注解要被扫描,而如果你按照Spring默认策略,就等同于扫了所有包,包含了所有包,你就不能够定制化你的需求;所以就不能按照Spring默认策略扫包和子包的条件了,因为我只想让Spring扫描我特定需要的注解,别按照默认的方式了。所以让默认扫描失效,给false
  • context:include-filter:指定你需要扫描的那些注解
<context:component-scan base-package="com.chenxin.spring5" use-default-filters="false"><context:include-filter type="" expression=""/></context:component-scan>

type类型也和上面的排除是一样的,只是语义是相反的

  • annotation:包含特定的注解,进行扫描
  • aspectj:包含特定的包下的类上的Spring注解,进行扫描,通过切入点表达式过滤,注意表达式只能用包切入点,和类切入点,不熟悉多翻翻前面的知识点
  • assignable:包含特定的类,进行扫描
  • custom:自定义包含策略,开发中用的更少了;一般会用在框架的底层开发中。比如在开发Springboot的时候,大量使用这个
  • regex:正则表达式,这个用的很少很少,其实作用和aspectj作用一样的,更多用的是aspectj来实现。

这个包含的例子我就不多做解释了,和上面相反,这个感兴趣可以自己试试。效果不错的!

到这,注解扫描的详解,我就解释完了,更多的是练习练习再练习,反复反复再反复。

2、对注解开发的思考

  • 配置互通:Spring注解配置和配置文件的配置,是可以互通的,比如我们UserDaoImpl用@Repository创建,而UserServiceImpl用xml创建,那么在xml的bean ref标签就可以引用userDaoImpl这个bean的id,反之也是可以的
  • 什么情况下用注解,什么情况下用xml方式呢?是不是我们以后一旦用了注解,就可以彻底取代xml的方式了吗?

对于我们开发中,这些注解@Repository,@Service,@Autowired等等这些注解都是我们开发的时候,自己加上去的,这些都是我们自己开发需求,但是你很有可能会接触一些代码,比如SqlsessionFactoryBean,或者MapperScannerConfigure,这些类不是你写的,那你有没有机会在这些类上加上@Component,@Service这些注解呢?显然是没机会的,而这些类要是想创建他们的对象,应该怎么办呢?我们只能用bean标签了。

所以使用注解的情况只有一种:在程序员开发的类型上,可以加入对应的注解,进行对象的创建

对于应用其他非程序员开发的类型时候,还是需要bean标签进行配置!!

到此,基础注解部分我们算告一段落了,下一节我们更新高级注解部分!!!

Spring基础专题——第十章(基础注解编程——下)相关推荐

  1. spring controller 增加header字段forward_Spring 注解编程之模式注解

    上篇文章研究 Spring XML Schema 扩展进制,这段时候一直研究 Spring 注解编程的原理.原本以为有了之前研究基础,可以很快理解注解编程原理.没想到这个过程非常困难,注解编程源码难度 ...

  2. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  3. 利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇

    历史文章(文章累计440+) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三> ...

  4. Spring基础专题——第九章(基础注解编程——上)

    目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从一个互联网职场小白到一个沪漂湿人,一路让我知道分享是一件多么重要的事情 ...

  5. Spring基础专题——第十一章(高级注解编程完结)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  6. Spring基础专题——第六章(Aop编程)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  7. Java基础学习——第十章 枚举类注解

    Java基础学习--第十章 枚举类&注解 一.枚举类(enum) 1. 枚举类的概念 枚举类:类的对象只有有限个,确定的 线程状态:创建.就绪.运行.阻塞.死亡 当需要定义一组常量时,强烈建议 ...

  8. spring框架三种类型项目实现--基础maven类型、纯注解开发型、aop结合注解开发型

    spring框架实现 1.基础maven类型 1.开发准备--pom.xml添加spring依赖 2.创建properties文件 还是三层架构开发 3.domain层创建实体类javabean 4. ...

  9. Spring基础专题——第八章(事务)

    目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从一个互联网职场小白到一个沪漂湿人,一路让我知道分享是一件多么重要的事情 ...

最新文章

  1. 2022-2028年中国纳滤膜产业发展态势及市场发展策略报告
  2. kibana客户端工具操作ElasticSearch(增删改查二)
  3. javascript 处理HTML元素必须避免使用的一种方法
  4. Vue组件间的传值五大场景,你造吗?
  5. Etcd服务发现原理
  6. 博一结束后的一些反思 -- 该如何平衡科研与生活
  7. 三相桥式全控整流电路simulink仿真_维修电工实训仿真软件-电工入门与提高
  8. 个推《大数据降本提效实战手册》,分享独家数据智能技术实践
  9. uint16 累加_在一个驱动程序中看到uint16,uint32,unit8,int8是什么意思?有何作用?...
  10. 电脑如何录制屏幕视频?介绍三个电脑录屏的小技巧
  11. Nginx学习八:虚拟主机
  12. 前端开发中遇到的困难汇总
  13. Win10系统台式机如何调节系统亮度
  14. matplotlib入门-直方图、饼图、散点图
  15. MacOS查找各Python版本的路径
  16. 2022电大国家开放大学网上形考任务-客户关系管理非免费(非答案)
  17. idea中xml打开方式变成file,如何将file格式文件变回.xml文件
  18. 计算机视觉的应用,计算机视觉新手指南
  19. Improving Entity Linking by Modeling Latent Relations between Mentions
  20. FPGA进行数字信号处理通过DAC转化为波形的初步理解

热门文章

  1. AI化身监工,上班还能摸鱼吗?
  2. 真香!3个月0基础转型大厂数据分析师,他做对了什么?
  3. 2020年,为什么说入坑AI是最好的时机?
  4. 从事JAVA 20年最终却败给了Python,哭了!
  5. 全球超2万名开发者调研:Python 3渗透率至84%
  6. 美团大脑:知识图谱的建模方法及其应用 | 公开课笔记
  7. 谷歌CEO:没有这项能力,再牛的程序员也不要!
  8. AI解译遥感影像,商汤的“黑科技”了解一下
  9. 请求合并的三种方式,大大提高接口性能!
  10. Unsafe工具类的一些实用技巧,通往JVM底层的钥匙