欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Spring源码原理Bean的创建的生命周期(一)

时间:2023-06-19
Spring 加载Bean 的方式

通过AnnotationConfigurationContext 或者ClassPathXml… 来加载Bean 并使用。这是最开始的读取xml的方式,不同在于

AnnotationConfigurationContext 是通过注解类来读取加载Bean、ClassPathXmlApplicationContext 是通过读取文件的方式加载Bean、

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");UserService userService = context.getBean("userService");userService.test();

Bean 和普通的Java对象的区别?

假如我在userService 里定义 @Autowired OrderService 他肯定是有值的,根据依赖注入的原理

那么我直接new userService 那么这个OrderService 肯定是没值的。这就是区别之一。

Spring 不论如何去创建对象 都一定是使用构造方法userService 来得到对象并创建(无参构造方法)

标准无参对象创建:

无参构造函数获取对象对象userService(无值)

那么申明一点 Bean 肯定是一个java对象 。

Bean创建:

无参构造函数获取对象对象userService(无值)依赖注入(实际上就是属性赋值(加了@Autowired的赋值))最终得到 Bean

伪代码 获取对象并赋值 根据Class 字段注解来

for (Field field : ProductService.class.getClass().getFields()) { if (field.isAnnotationPresent(Autowired.class)) { //set } }

实际上在Bean获取到之前 之后还有一些初始化步骤

假如想要在某一个Service 里增加一个对象User ,(想要的Mysql中的注入的值)

如果想要在User 对象里定义自己想要的值,单单通过@Autowired 无法注入,如果注入 也只能拿到空对象,无法拿到数据库里的值

依赖注入(实际上就是属性赋值(加了@Autowired的赋值))初始化前 (找方法里加了PostConstract注解的)初始化初始化后(AOP)代理对象最终得到 Bean

此时可以使用@PostConstract注解,原理和之前的@Autowired 读取方式相同。也是读取field上的annotation来

@PostConstruct public void a() { }

当时还有另外一个方式 通过实现InititalizeBean 也是Spring 提供的接口,可以实现这个功能

atnceOf 来 InitailzeBean 然后判断成功,会对象进行强制转化。

InitailzeBean 对象,源码:

实际上就是一行代码,就多了一个安全管理器的判断。

那么接着看:

初始化后(AOP)代理对象最终得到 Bean Bean在创建的时候

默认使用无参的构造函数但是多个构造函数的时候 会报错(两个有参构造方法):错误信息 找不到默认的构造方法 @Autowired找Bean逻辑

先根据类型去找,如果没找到或者有多个同名 则再根据名字BeanName去找

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。