网站首页 > java教程 正文
在Spring3.0之前,我们的bean一直通过XML文件来配置的,后来在Spring3.0之后为我们提供了java的config版本。而且在Spring4.0之后推荐我们使用,这篇文章基于Spring5.2来分析。希望在平时使用和面试的时候对你有一丝帮助。
一、实例演示
我们先给出一个例子,看看如何使用,然后再来分析。创建一个普通的maven项目。
第一步:添加pom依赖
这里面添加了最核心的依赖。
第二步:在bean包添加User类
第三步:在service包添加UserService类
注意这里没有@Service注解。目的就是我们自己注入。
第四步:在config包添加UserConfig类
这个类是核心,我们使用了俩注解,一个Configuration还有一个Bean。我们一会就看他俩的作用。
第五步:测试
之前我们已经添加了测试依赖。直接测试一波:
这就是一个最基本的案例,实现起来非常的简单。下面我们着重分析一下这俩注解的作用,为什么能实现类似于Spring中XML文件一样的作用。
二、分析
1、注解角度分析
想要了解为什么@Configuration会有这样的作用,我们可以跟进去这个注解看看。
进去之后我们会发现,这个注解标签是一个元注解,由很多其他的注解实现,有一个我们应该很熟悉,那就是@Component,有着了这个注解就可以被@ComponentScan扫描并处理。Spring5.0已经自动扫描了,不需要我们自己再去添加了。现在我们进去到里面的代码看看:
首先是@AliasFor标签:
在Spring的众多注解中,经常会发现很多注解的不同属性起着相同的作用,比如@RequestMapping的value属性和path属性,这就需要做一些基本的限制,比如value和path的值不能冲突,比如任意设置value或者设置path属性的值,都能够通过另一个属性来获取值等等。为了统一处理这些情况,Spring创建了@AliasFor标签。
然后是value() :
意思是默认的值就是空,此时我们就可以指定@Configuration(value="属性值")的这种方式,因为只有一个value所以value可以省去不写。
最后是proxyBeanMethods:
有了 proxyBeanMethods 属性后,配置类不会被代理了。主要是为了提高性能,如果你的 @Bean 方法之间没有调用关系的话可以把 proxyBeanMethods 设置为 false。否则,方法内部引用的类生产的类和 Spring 容器中类是两个类。
3、运行角度分析
现在我们把目光转移,从测试运行的角度来分析。
看到这里,可能就要深入到Spring的源码中看了。Spring容器启动时,ApplicationContext接口的实现类
AnnotationConfigApplicationContext会执行refresh方法,往BeanFactory注册bean就在此方法完成。我们看到这个refresh是核心。我们进入到这个源码中看看:
我截取了其中一部分的源码,在里面有一个方法很关键,那就是
invokeBeanFactoryPostProcessors,意思是我们Spring容器首先会初始化BeanFactory,然后激活各种beanFactory处理器,也就是执行
invokeBeanFactoryPostProcessors,我们看看这个方法:
在这个方法的内部的核心是
ConfigurationClassPostProcessor,这个方法看到@Configuration,就会开启类的加载,这里也就是bean的加载。剩下的越挖越深,源码也越来越深。大体步骤我们可以总结一下:
ConfigurationClassPostProcessor处理器解析@configuration配置类主要过程:
(1)Spring容器初始化时注册
ConfigurationClassPostProcessor
(2)Spring容器初始化执行refresh()方法中调用
ConfigurationClassPostProcessor
(3)
ConfigurationClassPostProcessor处理器借助ConfigurationClassParser完成配置类解析
(4)ConfigurationClassParser配置内解析过程中完成嵌套的MemberClass、@PropertySource注解、@ComponentScan注解(扫描package下的所有Class并进行迭代解析,主要是@Component组件解析及注册)、@ImportResource、@Bean等处理
(5)接下来完成@Bean注册, @ImportResource指定bean的注册以及@Import的bean注册
(6)有@Bean注解的方法在解析的时候作为ConfigurationClass的一个属性,最后还是会转换成BeanDefinition进行处理, 而实例化的时候会作为一个工厂方法进行Bean的创建
现在大致应该明白了,其实一句话说完,还是想办法识别注解,完成和XML一样的功能。
猜你喜欢
- 2025-06-30 Java高级开发面试题深度解析(2025版)
- 2025-06-30 应届生/社招面试最爱问的几道Java基础问题
- 2025-06-30 Spring整合CXF 发布webservice接口服务器和客户端,WSDL简单解析
- 2025-06-30 【深入 JavaEE】Spring AOP 注解实战全解析
- 2025-06-30 如何深度理解mybatis?(如何深度理解王阳明这个人的形象)
- 2025-06-30 Spring IoC Container 原理解析(spring ioc基本原理)
- 2025-06-30 MyBatis映射文件深入解析(Mapper.xml)
- 2025-06-30 Java七大热门技术框架源码解析(完结)
- 2025-06-30 阿里资深架构师整理分享内部绝密MyBatis源码深度解析文档
- 2025-06-30 基于XML链式结构的研究(基于xml链式结构的研究现状)
你 发表评论:
欢迎- 08-03JVM内存结构和Java内存模型
- 08-03C++ 知识小结
- 08-03Java内存模型(JMM)详解
- 08-03为什么计算机内存需要堆和栈?
- 08-03Java中,对象一定在堆中分配吗?
- 08-03看完这篇,还不懂JAVA内存模型(JMM)算我输
- 08-03别再混淆了!JVM内存模型和Java内存模型的本质区别
- 08-03【C语言】(13)堆和栈
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)