九江市住房与城乡建设厅网站,php可以做视频网站有哪些,dw制作网站模板,网页设计培训学校校doGetBean()执行过程 createBean()执行过程 一、DependsOn注解
spring创建对象之前会判断类上是否加了DependsOn注解#xff0c;加了会遍历然后会添加到一个map中#xff0c;spring会先创建DependsOn注解指定的类
二、spring类加载器
在合并BeanDefinition#xff0c;确定… doGetBean()执行过程 createBean()执行过程 一、DependsOn注解
spring创建对象之前会判断类上是否加了DependsOn注解加了会遍历然后会添加到一个map中spring会先创建DependsOn注解指定的类
二、spring类加载器
在合并BeanDefinition确定beanName之后和scope之后就会调用createBean()方法获取类加载器BeanDefinition合并之后就可以去创建Bean对象了而创建Bean就必须实例化对象而实例化就必须先加载当前BeanDefinition所对应的class在AbstractAutowireCapableBeanFactory类的createBean()方法中一开始就会调用
Class? resolvedClass resolveBeanClass(mbd, beanName);
这行代码就是去加载类该方法是这么实现的
if (mbd.hasBeanClass()) {return mbd.getBeanClass();
}
if (System.getSecurityManager() ! null) {return AccessController.doPrivileged((PrivilegedExceptionActionClass?) () -doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());}
else {return doResolveBeanClass(mbd, typesToMatch);
}
public boolean hasBeanClass() {return (this.beanClass instanceof Class);
}
如果beanClass属性的类型是Class那么就直接返回如果不是则会根据类名进行加载doResolveBeanClass方法所做的事情
会利用BeanFactory所设置的类加载器来加载类如果没有设置则默认使用**ClassUtils.getDefaultClassLoader()**所返回的类加载器来加载。
ClassUtils.getDefaultClassLoader()
优先返回当前线程中的ClassLoader线程中类加载器为null的情况下返回ClassUtils类的类加载器如果ClassUtils类的类加载器为空那么则表示是Bootstrap类加载器加载的ClassUtils类那么则返回系统类加载器
三、实例化前
当前BeanDefinition对应的类成功加载后就可以实例化对象了但是...
在Spring中实例化对象之前Spring提供了一个扩展点允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()。比如
Component
public class TestBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);}return null;}
}
如上代码会导致在userService这个Bean实例化前会进行打印。
值得注意的是postProcessBeforeInstantiation()是有返回值的如果这么实现
Component
public class TestBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);return new UserService();}return null;}
}
userService这个Bean在实例化前会直接返回一个由我们所定义的UserService对象。如果是这样表示不需要Spring来实例化了并且后续的Spring依赖注入也不会进行了会跳过一些步骤直接执行初始化后这一步。
四、实例化
在这个步骤中就会根据BeanDefinition去创建一个对象了。
1、Supplier创建对象
首先判断BeanDefinition中是否设置了Supplier如果设置了则调用Supplier的get()得到对象 得直接使用BeanDefinition对象来设置Supplier比如
AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setInstanceSupplier(new SupplierObject() {Overridepublic Object get() {return new UserService();}
});
context.registerBeanDefinition(userService, beanDefinition);
2、工厂方法创建对象
如果没有设置Supplier则检查BeanDefinition中是否设置了factoryMethod也就是工厂方法有两种方式可以设置factoryMethod比如 方式一
bean iduserService classcom.spring.service.UserService factory-methodcreateUserService /
对应的UserService类为
public class UserService {public static UserService createUserService() {System.out.println(执行createUserService());UserService userService new UserService();return userService;}public void test() {System.out.println(test);}} 方式二
bean idcommonService classcom.spring.service.CommonService/
bean iduserService1 factory-beancommonService factory-methodcreateUserService /
对应的CommonService的类为
public class CommonService {public UserService createUserService() {return new UserService();}
} Spring发现当前BeanDefinition方法设置了工厂方法后就会区分这两种方式然后调用工厂方法得到对象。
值得注意的是我们通过Bean所定义的BeanDefinition是存在factoryMethod和factoryBean的也就是和上面的方式二非常类似Bean所注解的方法就是factoryMethodAppConfig对象就是factoryBean。如果Bean所所注解的方法是static的那么对应的就是方式一。
五、BeanDefinition后置处理器
Bean对象实例化出来之后接下来就应该给对象的属性赋值了。在真正给属性赋值之前Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()可以对此时的BeanDefinition进行加工比如
Component
public class TestMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class? beanType, String beanName) {if (userService.equals(beanName)) {beanDefinition.getPropertyValues().add(orderService, new OrderService());}}
} 在Spring源码中AutowiredAnnotationBeanPostProcessor就是一个MergedBeanDefinitionPostProcessor它的postProcessMergedBeanDefinition()中会去查找注入点并缓存在AutowiredAnnotationBeanPostProcessor对象的一个Map中injectionMetadataCache。
六、实例化后
在处理完BeanDefinition后Spring又设计了一个扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()比如
Component
public class TestInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {UserService userService (UserService) bean;userService.test();}return true;}
}
七、自动注入
spring会根据配置Bean的autowire是byType或者byName进行注入另外spring会调用InstantiationAwareBeanPostProcessor.postProcessProperties()解析Autowired注解
八、处理属性
这个步骤中就会处理Autowired、Resource、Value等注解也是通过**InstantiationAwareBeanPostProcessor.postProcessProperties()**扩展点来实现的比如我们甚至可以实现一个自己的自动注入功能比如
Component
public class TestInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {for (Field field : bean.getClass().getFields()) {if (field.isAnnotationPresent(TestInject.class)) {field.setAccessible(true);try {field.set(bean, 123);} catch (IllegalAccessException e) {e.printStackTrace();}}}}return pvs;}
}
九、执行Aware
完成了属性赋值之后Spring会执行一些回调包括
BeanNameAware回传beanName给bean对象。BeanClassLoaderAware回传classLoader给bean对象。BeanFactoryAware回传beanFactory给对象。
十、初始化前
初始化前也是Spring提供的一个扩展点BeanPostProcessor.postProcessBeforeInitialization()比如
Component
public class TestBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化前);}return bean;}
}
利用初始化前可以对进行了依赖注入的Bean进行处理。 在Spring源码中
InitDestroyAnnotationBeanPostProcessor会在初始化前这个步骤中执行PostConstruct的方法ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调 EnvironmentAware回传环境变量EmbeddedValueResolverAware回传占位符解析器ResourceLoaderAware回传资源加载器ApplicationEventPublisherAware回传事件发布器MessageSourceAware回传国际化资源ApplicationStartupAware回传应用其他监听对象可忽略ApplicationContextAware回传Spring容器ApplicationContext
十一、初始化
查看当前Bean对象是否实现了InitializingBean接口如果实现了就调用其afterPropertiesSet()方法执行BeanDefinition中指定的初始化方法
十二、、初始化后
这是Bean创建生命周期中的最后一个步骤也是Spring提供的一个扩展点BeanPostProcessor.postProcessAfterInitialization()比如
Component
public class TestBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化后);}return bean;}
} 可以在这个步骤中对Bean最终进行处理Spring中的AOP就是基于初始化后实现的初始化后返回的对象才是最终的Bean对象。 总结BeanPostProcessor
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()实例化MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()自动注入InstantiationAwareBeanPostProcessor.postProcessProperties()Aware对象BeanPostProcessor.postProcessBeforeInitialization()初始化BeanPostProcessor.postProcessAfterInitialization()