Spring IOC详解及Bean生命周期详细过程,看完直接吊打面试官

1、实例化前置


实例化前置使用的是 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(Class<?> beanClass, String beanName) 方法,方法里有2个参数,分别是beanClass和beanName,顾名思义,就是对在对象实例化之前对bean对象的class信息进行修改或者扩展,以达到我们想要的功能,它的底层是动态代理AOP技术实现的;且是bean生命周期中最先执行的方法;

返回非空:返回值是Object类型,这意味着我们可以返回任何类型的值,由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成对象的目标对象的实例,也就是说,如果返回了非空的值,那么以后我们需要用到这个bean的时候,拿到的就现在返回的对象了,也就不会去走第二步去实例化对象了;

返回空(null)值:默认也是返回null值的,那么就直接返回,接下来会调用doCreateBean方法来实例化对象;

2、实例化对象


doCreateBean方法创建实例,用反射技术创建,这个没什么好说的,只是相当于new了一个对象出来而已,但需要注意的是,这个时候只是将对象实例化了,对象内的属性还未设置;

3、实例化后置


方法名称: InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(Object bean, String beanName)

在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为他的返回值是决定要不要调用postProcessPropertyValues方法中的一个因素(因为还有一个因素是mbd.getDependencyCheck());

返回false :如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;

返回true : 如果返回true,postProcessPropertyValues就会被执行

4、属性修改


方法名称 :InstantiationAwareBeanPostProcessor.PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

此方法可对属性值进行修改,修改范围包括添加、修改、删除操作;,如果实例化后置 postProcessAfterInstantiation() 方法返回false,那么该方法不会被调用;

5、给用户属性赋值


用户属性指的是用spring 的人自定义的bean对象属性,像 User、Student、Teacher 、UserService、IndexService 这类的对象都是自定义bean对象,第5步主要给这类属性进行赋值操作,使用的是  AbstractAutowireCapableBeanFactory.populateBean() 方法进行赋值;

6、给容器属性赋值


容器属性其实就是容器自带的属性,这些属性都是spring本来就有的;可以肯定的是,它们都是 Aware 接口的实现类,主要有以下实现类,我已经将它们的执行顺序都排列好了,

image.png

我们先看看怎么用,然后再来讲解每个Aware的作用;上代码

package com.Spring.Boot.init.aware;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanClassLoaderAware;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.BeanFactoryAware;

import org.springframework.beans.factory.BeanNameAware;

import org.springframework.context.*;

import org.springframework.context.annotation.ImportAware;

import org.springframework.context.weaving.LoadTimeWeaverAware;

import org.springframework.core.env.Environment;

import org.springframework.core.io.ResourceLoader;

import org.springframework.core.type.AnnotationMetadata;

import org.springframework.instrument.classloading.LoadTimeWeaver;

import org.springframework.stereotype.Component;

import org.springframework.util.StringValueResolver;

import org.springframework.web.context.ServletContextAware;

import javax.servlet.ServletContext;

@Component

public class AllAwareInterface implements BeanNameAware, BeanClassLoaderAware,

BeanFactoryAware, EnvironmentAware, EmbeddedValueResolverAware,

ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware,

ApplicationContextAware, ServletContextAware, LoadTimeWeaverAware, ImportAware {

@Override

public void setBeanName(String name) {

// BeanNameAware作用:让Bean对Name有知觉

//这个方法只是简单的返回我们当前的beanName,听官方的意思是这个接口更多的使用在spring的框架代码中,实际开发环境应该不建议使用

System.out.println(“1 我是 BeanNameAware 的 setBeanName 方法 —参数:name,内容:”+ name);

}

@Override

public void setBeanClassLoader(ClassLoader classLoader) {

System.out.println(“2 我是 BeanClassLoaderAware 的 setBeanClassLoader 方法”);

}

@Override

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

// 注意: 如果使用 @Configuration 注解的话,setBeanFactory方法会执行2次,

System.out.println(“3 我是 BeanFactoryAware 的 setBeanFactory 方法”);

}

@Override

public void setEnvironment(Environment environment) {

System.out.println(“4 我是 EnvironmentAware 的 setEnvironment 方法”);

}

@Override

public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {

System.out.println(“5 我是 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法”);

}

@Override

public void setResourceLoader(ResourceLoader resourceLoader) {

System.out.println(“6 我是 ResourceLoaderAware 的 setResourceLoader 方法”);

}

@Override

public void setApplicationEventPu

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值