栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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去找

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/735358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号