温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解并掌握Spring Bean生命周期

发布时间:2021-11-16 13:45:02 来源:亿速云 阅读:105 作者:iii 栏目:大数据

这篇文章主要介绍“如何理解并掌握Spring Bean生命周期”,在日常操作中,相信很多人在如何理解并掌握Spring Bean生命周期问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解并掌握Spring Bean生命周期”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!


这些 Spring Beans 是怎么生成出来的呢?

在正式回答这个问题之前,先解答一些有关 Java Bean, Spring Bean 和 Spring IoC 容器这些概念性的疑惑,我希望通过下面这个例子形象说明这些问题:

小学生 (Java Bean)通过提交资料申请(元数据配置)加入了少先队(Spring Ioc 容器),学习了一些精神与规定之后,变成了少先队员(Spring Bean)

从这里可以看出,Java Bean 和 Spring Bean 都是具有特定功能的对象,小学生还是那个小学生,只不过加入了少先队之后有了新的身份,新的身份要按照组织 (Spring Ioc)的规定履行特定义务

来看下图加深一下了解 如何理解并掌握Spring Bean生命周期

首先要有容器,实例化 Spring Ioc 容器是非常简单的,接口 org.springframework.context.ApplicationContext 表示Spring IoC容器,负责实例化,配置和组装上述 bean。 容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指令。 配置元数据通常以XML,Java 注解或代码的形式表示。 它允许你自己表达组成应用程序的对象以及这些对象之间丰富的相互依赖性,比如这样:

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring.xml", "spring1.xml"});

有了容器,我们需要做哪些处理,使其内部对象变为 Ready for Use 的状态?
我们需要通过 Spring 容器实例化它们,Spring 为我们提供了三种方式:

三种初始化方式

InitializingBean

Spring 为我们提供了 InitializingBean 接口

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

我们可以通过实现 InitializingBean 接口,在其唯一方法 afterPropertiesSet 内完成实例化的工作,但是 Spring Framework 官方并不建议我们通过这种方法来完成 Bean 的实例化,这是一种强耦合的方式,我们看到框架层面才会用到这个方法。

@PostConstruct

这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 init()

@PostConstruct
public void init() {
  System.out.println("Inside init() method...");
}

init-method

你应该见过这种初始化方式:

public class MyClass {
   public void init() {
      // perform post-creation logic here
   }
}

@Configuration
public class AppConfig {
   @Bean(initMethod = "init")
   public MyClass myclass() {
      return new MyClass ();
   }
}

你也应该见过这种配置方式:

<bean id="myClass" class="com.demo.MyClass" init-method="init"/>

没错,这只是同样功能的不同实现方式罢了 以上就是三种初始化 Spring Beans 的方式,我们在框架中看到过三种方式在组合使用,那么组合使用的调用顺序是什么呢?

  1. 首先@PostConstruct 会被最先调用

  2. 其次 InitializingBean.afterPropertiesSet() 方法将会被调用

  3. 最后调用通过 XML 配置的 init-method 方法或通过设置 @Bean 注解 设置 initMethod 属性的方法

了解了这些,你也就了解了 Spring Bean 是怎么来的了

通过图示来说明一下: 如何理解并掌握Spring Bean生命周期

组合shying,这个调用顺序很难记忆吗吗?

PostConstruct (P),afterPropertiesSet (A),init-method (I) ---> PAI (圆周率π)

BeanPostProcessor

BeanPostProcessor 接口,大家也应该有印象,里面只有两个方法:

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;

    Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}

看方法名,BeforeInitialization 和 AfterInitialization,我们应该猜得出,这是在上述三种方式的前和后,算是一种全局的切面思想,我们经常会使用 postProcessAfterInitialization 方法,通过读取 Bean 的注解完成一些后续逻辑编写与属性的设定,现在 Ready for Use之前是这样: 如何理解并掌握Spring Bean生命周期

Ready for Use 之前,了解这些内容,已可以基本满足日常的工作内容,但这并不是 Ready for Use 的全部内容,Spring Bean 整个生命周期的流程应该是这样的,后续文章会逐步点亮: 如何理解并掌握Spring Bean生命周期

到此,关于“如何理解并掌握Spring Bean生命周期”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI