SpringBean的生命周期深度解析

单例和多例

  • 单例默认在容器创建的时候就会初始化,容器关闭的时候销毁
  • 多例在使用对象的时候才会初始化

生命周期

调用无参构建函数创建对象—对象初始化—对象销毁

对象的初始化和销毁过程

自定义对象的初始化操作和对象销毁的操作,单例的销毁是在容器关闭的时候才会把对象销毁

下面展示第一种使用@Bean注解指定初始和销毁方法代码

package com.mayikt.v4.entity;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/03 07:25
 **/
public class SmsEntity {
    public SmsEntity() {
        System.out.println("无参构造函数执行》》》》");
    }

    public void init() {
        System.out.println("对象初始化>>>");
    }

    public void destroy() {
        System.out.println("对象销毁>>>>");
    }
}

package com.mayikt.v4.config;

import com.mayikt.v4.entity.SmsEntity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: spring配置类
 * @Author: ChenYi
 * @Date: 2020/07/02 23:07
 **/
@Configuration
@ComponentScan("com.mayikt.v4")
public class MySpringConfig {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public SmsEntity smsEntity() {
        return new SmsEntity();
    }
}

下面展示第二种 对象实现InitializingBean初始化和DisposableBean销毁的代码

package com.mayikt.v4.entity;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/04 14:16
 **/
@Component
public class MemberEntity implements InitializingBean, DisposableBean {
    public MemberEntity() {
        System.out.println("无参构造函数执行>>>>");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("容器销毁>>>>");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("容器初始化>>>>>");
    }
}

下面展示第三种 添加@PostConstruct初始和@PreDestroy销毁注解的代码

package com.mayikt.v4.entity;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/04 14:20
 **/
@Component
public class OrderEntity {
    public OrderEntity() {
        System.out.println("无参构造函数执行>>>>");
    }

    @PostConstruct
    public void init() {
        System.out.println("对象初始化>>>");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("对象销毁>>>>");
    }
}

ApplicationContextAware接口

自定义实现ApplicationContextAware接口获取ioc容器
package com.mayikt.v4.config;

import com.mayikt.v4.entity.OrderEntity;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/04 14:38
 **/
@Component
public class MyApplicationContextAware implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        MyApplicationContextAware.applicationContext = applicationContext;
        getBean();
    }

    public void getBean() {
        OrderEntity orderEntity = MyApplicationContextAware.applicationContext.getBean("orderEntity", OrderEntity.class);
        System.out.println(orderEntity);
    }
}

整个bean生命周期的详细流程图

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
         //检查是否偶Aware依赖
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
		//调用BeanPostProcessorsBeforeInitialization方法
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
		//调用初始化的方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
		//调用BeanPostProcessorsAfterInitialization方法
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

在这里插入图片描述

Aware接口

重要的接口:

BeanNameAware :可以获取容器中bean的名称

BeanFactoryAware:获取当前BeanFactory,可以调用容器的服务

ApplicationContextAware: 当前的applicationContext, 可以调用容器的服务
类图:
在这里插入图片描述
下面 自定义实现生命周期的接口代码

实现 DisposableBean BeanNameAware BeanFactoryAware ApplicationContextAware  InitializingBean的接口
package com.mayikt.v4.entity;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/04 14:16
 **/
@Component
public class MemberEntity implements DisposableBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
    public MemberEntity() {
        System.out.println("1.对象创建>>>>");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("8. 容器销毁>>>>");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.实现BeanFactoryAware接口" + beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("2.实现BeanNameAware接口" + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("4.实现ApplicationContextAware的接口");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("6.容器自定义init初始化>>>>>");
    }
}

实现BeanPostProcessor接口
package com.mayikt.v4.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @Description:
 * @Author: ChenYi
 * @Date: 2020/07/04 16:08
 **/
public class MyBeanPostProcess implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("5.执行init方法之前执行:" + beanName);
        return beanName;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("7.执行init方法之后执行:" + beanName);
        return beanName;
    }
}

参考:蚂蚁课堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值