前言:解读注解主要是方便在阅读以后的spring版本或者springboot源码开发团队对框架进行进一步重构时,对于某些注解的作用一知半解,导致阅读困难,一方面面试官也常会问到(注:博主用的spring版本为5.07)
@Configuration:主要用来代替xml方式的注入方式,声明此类为配置类等同于配置文件xml
以前我们声明bean,需要在xml中码如下代码:
然后通过ClassPathXmlApplicationContext来获取我们的bean,如下:
而使用@Configuration的形式如下:
(注:这里博主只是封装了一下实体类,使用链式方法的形式注入,大家也可以构造注入,无差异)
随后我们使用AnnotationConfigApplicationContext来获取我们的bean,如下
效果是一致的
@ComponentScan:指定要扫描的包,也可以由我们制定扫描规则,更加灵活
大致如下:解释会在末尾总结所有
第一个字段value:指定要扫描的包,如果我们在写这个注解的时候,只写包名,其他都不写,那么类型会采用FilterType.ANNOTATION,而useDefaultFilters=ture(源码截图如下,具体解释后面会补上),
FilterType:
useDefaultFilters:
excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
useDefaultFilters = false 默认是true,扫描所有组件大家可以自己去查看源码,改成false则不按他所表明的规则去扫描
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口,写法如下(注:这里博主多写了一些类以及解释,以后工作不一定用得到,只是让大家知道,存在这么一个东西,也许某一天有某个特殊需求,可能使用到,其次也是扩展深度)
启动类后,输出
,第一个是我在Person内定义的静态内部类那么看一下博主的类结构,凌晨了,就随意敲几个类
,TestConfig被跳过了,因为它的类名并不包含er,那么表示我们写的过滤类成功过滤了不包含‘er’字符的类
@Scope:控制是否多实例
prototype:多实例:IOC容器启动并不会去调用方法提前创建对象放在容器中,最初只是将对象初始化完成,而是每次获取的时候才会调用方法创建对象的实例,测试如下:
输出:
,可以看出我们的容器是先构建好了,再当我们执行getBean,也就是要使用bean的时候,它再实例化我们的bean,并且我们也能看出,创建出来了俩个实例,俩个实例的引用地址是不一样的。
singleton:单实例(默认):IOC容器启动会调用方法提前创建对象放到IOC容器中以后每交获取就是直接从容器(我们所有由IOC管理的bean其实都是放在一个map里,所以可以理解成从map)中拿 ,测试如下:
输出:
,这里我们可以看出,bean只被实例化了一次,俩个对象引用引用的是同一个地址,输出结果为true也证明了这一点
request:主要针对WEB应用,同一次请求创建一个实例
session:同一个session创建一个实例(后面两个用得不多,了解即可)
@Lazy:懒加载,跟我们的@Scope中的多实例加载是一个原理,在使用时再创建实例
大家可以根据@Scope中的多实例,照猫画老虎来实现我们的懒加载模式