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 接口的实现类,主要有以下实现类,我已经将它们的执行顺序都排列好了,
我们先看看怎么用,然后再来讲解每个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