首页 > 其他分享 >Bean创建的生命周期

Bean创建的生命周期

时间:2024-03-04 17:45:06浏览次数:23  
标签:初始化 生命周期 对象 创建 bean Bean class userClass 赋值

Bean创建的生命周期

((20231222181259-yw9e73s 'Spring的三级缓存机制:'))

User.class -> 无参构造器 -> user对象(属性无赋值) -> DI(依赖注入),这里通常使用@Autowired为属性赋值 -> 初始化前(PostConstruct) -> 初始化(InitializingBean) -> 初始化后(AOP) ->代理对象-> userBean对象(属性赋值)

这里如果使用AOP了之后会生成代理对象,代理对象会作为bean对象被spring容器管理.

((20231220161222-4xkz1rt 'Bean对象的生命周期:'))

需求: 获取一个bean对象的时候,希望这个bean对象的属性已经赋值完毕,并且这些属性是通过查询数据库中的数据完成赋值的?

这里就需要用到bean的生命周期,在一个对象未成为bean的时候,为其赋完所有需要的值.

//伪代码  方式1. 方法上标注@PostConstruct注解,初始化前生效
@Compoment
public class User{
  @Autowired
  private Clazz clazz; //这里的班级信息,希望的情况是获取到用户对象的时候,已经从数据库中查到了班级信息,并为该用户赋值班级属性的相关值.
  @PostConstruct  // 初始化前
  public void init(){
    //逻辑步骤   mysql查询 -> 赋值..
  }
}

//方式2. 实现InitializingBean接口,实现接口中的方法
@Compoment
public class User implements InitializingBean{
  @Autowired
  private Clazz clazz;

  @Override //方式2.
  public void afterPropertiesSet() throws Exception {
    //逻辑步骤   mysql查询 -> 赋值..
  }
}


@Compoment
public class Clazz{
  private Integer cno;
  private String cname;
}

总结Bean生命周期:

  1. 初始化前需要的准备工作, 在方法上标明@PostConstruct注解,spring会在bean初始化前执行这个方法.

    伪代码:

    Class<? extends Class> userClass = UserService.class.getClass();
    for (Method method : userClass.getMethods()) {
        if (method.isAnnotationPresent(PostConstruct.class)){
            method.invoke(userClass.newInstance(),null);
        }
    }
    
  2. 类实现InitializingBean接口,并在方法中写业务代码.

    伪代码:

    Class<? extends Class> userClass = UserService.class.getClass();
    if (userClass.isInstance(InitializingBean.class)){
        Method afterPropertiesSet = userClass.getMethod("afterPropertiesSet");
        afterPropertiesSet.invoke(userClass.newInstance(),null);
    }
    
  3. bean创建时候默认调用无参构造器创建对象,如果含有有参构造(1个的情况下),没有无参构造器,spring也会调用这个有参构造器. 如果含有多个有参构造器,spring默认会调用无参构造器.

标签:初始化,生命周期,对象,创建,bean,Bean,class,userClass,赋值
From: https://www.cnblogs.com/RepublicLine/p/18052244

相关文章

  • 解密Spring中的Bean实例化:推断构造方法(上)
    在Spring中,一个bean需要通过实例化来获取一个对象,而实例化的过程涉及到构造方法的调用。本文将主要探讨简单的构造推断和实例化过程,让我们首先深入了解实例化的步骤。实例化源码protectedBeanWrappercreateBeanInstance(StringbeanName,RootBeanDefinitionmbd,@NullableO......
  • 使用 Java 在Excel中创建下拉列表
    下拉列表(下拉框)可以确保用户仅从预先给定的选项中进行选择,这样不仅能减少数据输入错误,还能节省时间提高效率。在MSExcel中,我们可以通过“数据验证”提供的选项来创建下拉列表,但如果要在Java程序中通过代码实现这一功能,可能需要借助一些第三方库。本文将分享两种使用免费Java库......
  • 12. 创建卡牌数据类
    创建数据类上一节,我们添加了卡牌的形状,这一节,我们来添加卡牌的数据,使用ScriptableObject来添加卡牌的数据如上图所示,我们在Scripts/Card/ScriptableObject下面创建了CardDataSO文件,它里面有卡牌名字、卡牌图片、卡牌费用、卡牌类型、描述等信息然后再添加一个Card类,......
  • 创建云之家流程
    创建云之家流程一、功能终端不一致时推送信息创建云之家流程二、触发时机​创建​文档时同时满足终端客户是否和现场一致为否​、实际终端客户不为空​、仪器编号不为空​、仪器编号在设备卡片中​会创建流程三、问题修复2024年3月问题修复修改流程名称中的null为“当前......
  • Windows操作系统中的时间戳(Timestamp)是指用于标记事件发生时间的一种时间表示方式。在
    Windows操作系统中的时间戳(Timestamp)是指用于标记事件发生时间的一种时间表示方式。在计算机系统中,时间戳通常用来记录文件的创建时间、修改时间、访问时间等信息,也常用于网络通信中的认证和数据同步等场景。以下是Windows时间戳的基础技术原理:系统时钟:Windows操作系统通过系统......
  • 精简实现、线程安全:C#通用单例泛型基类助你轻松创建单例模式
     概述:该通用单例泛型基类使用C#实现,线程安全,通过泛型参数和Lazy<T>实现简化的单例模式。优点包括线程安全、泛型通用性、简化实现、以及延迟加载的特性。优点:线程安全: 使用Lazy<T>确保了线程安全的延迟初始化,避免了在多线程环境下可能导致的竞态条件问题。泛型通用性: 通......
  • python接口自动化系列(03):创建自动化框架项目
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074实现目标搭建能基于pytest运行测试用例的项目。 创建项目1、输入项目名称2、选择项目位置3、自定义虚拟环境(默认即可) 创建完成 安装pytest补充:python虚拟环境操作,详见:https://www.cnblogs.c......
  • 2_基于XML管理Bean
    2.基于XML管理Bean2.1项目准备:首先创建实体类User.java:packagecom.lily.iocxml;publicclassUser{privateStringname;privateIntegerage;publicvoidrun(){System.out.println("run...");}}其次创建spring的配置文件bean.xml:<?x......
  • 无法创建spring2.X版本,无法使用JDK8, 用idea创建spring2.X版本,使用JDK8解决方案
    1、解释原因spring2.X版本在2023年11月24日停止维护了,因此创建spring项目时不再有2.X版本的选项,只能从3.1.X版本开始选择而Spring3.X版本不支持JDK8,最低支持JDK17,因此JDK8也无法主动选择了当然,停止维护只代表我们无法用idea主动创建spring2.X版本的项目了,不代表我们无法使用,该......
  • 【Mybatis】【三】源码分析- MapperFactoryBean 的创建过程以及 Mapper 接口代理的生
    1 前言本节我们续前两节(调试查看Mapper接口生成过程、源码分析Mapper生成注入入口分析)的内容,看下MapperFactoryBean是如何代理掉我们的@Mapper接口的。上节我们看到我们的Mapper接口的BeanDefinition,已经放进spring的上下文中了,也就是在BeanFactory的BeanDefin......