200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 从源码了解spring bean实例化过程

从源码了解spring bean实例化过程

时间:2023-07-16 18:29:10

相关推荐

从源码了解spring bean实例化过程

我们先来看下spring如何手动初始化一个对象

ClassPathResource res = new ClassPathResource("beans.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(res);User user=(User) factory.getBean("user");复制代码

所以我们先从DefaultListableBeanFactory开始了解 AbstractBeanFactory

public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException {return doGetBean(name, requiredType, args, false);}复制代码

protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)throws BeansException {复制代码

1.去掉&

final String beanName = transformedBeanName(name);复制代码

protected String transformedBeanName(String name) {return canonicalName(BeanFactoryUtils.transformedBeanName(name));}复制代码

2.如果是单例且存在,就直接取过来

Object bean;// Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {....bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}复制代码

3.如果已经创建,抛出异常

else {if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}复制代码

4.在父BeanFactory查找

BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}复制代码

5.创建标记,(用于清除)

if (!typeCheckOnly) {markBeanAsCreated(beanName);}复制代码

6.寻找bean定义信息,并针对bean定义进行验证

try {final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);复制代码

7.处理依赖信息,这里会针对xml定义中的depends-on进行处理

String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dependsOnBean : dependsOn) {if (isDependent(beanName, dependsOnBean)) {....registerDependentBean(dependsOnBean, beanName);getBean(dependsOnBean);}}复制代码

具体通过这个私有方法来解决依赖的 假设A依赖于B,那么在创建A之前,必须保证B先被创建。 在创建了B之后,这里会进行依赖信息存储。后面在递归调用一下,不过依赖关系反过来。 dependentBeanMap放 A->[B,C,D] (A所依赖的B,C,D)

private boolean isDependent(String beanName, String dependentBeanName, Set<String> alreadySeen) {if (alreadySeen != null && alreadySeen.contains(beanName)) {return false;}String canonicalName = canonicalName(beanName);Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);if (dependentBeans == null) {return false;}if (dependentBeans.contains(dependentBeanName)) {return true;}for (String transitiveDependency : dependentBeans) {if (alreadySeen == null) {alreadySeen = new HashSet<String>();}alreadySeen.add(beanName);if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {return true;}}return false;}复制代码

单例模式就调用getSingleton(String beanName, ObjectFactory<?> singletonFactory)

// 单例if (mbd.isSingleton()) {....bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}复制代码

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {....synchronized (this.singletonObjects) {Object singletonObject = this.singletonObjects.get(beanName);....beforeSingletonCreation(beanName);....singletonObject = singletonFactory.getObject();....addSingleton(beanName, singletonObject);}return (singletonObject != NULL_OBJECT ? singletonObject : null);}}复制代码

原型模式

else if (mbd.isPrototype()) {Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}复制代码

其他模式,比如scope=request

else {String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);....try {Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {@Overridepublic Object getObject() throws BeansException {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}....}}....}复制代码

8.无论哪种模式都会进入AbstractAutowireCapableBeanFactory的createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

....RootBeanDefinition mbdToUse = mbd;// 解析beanDefinition,以确保bean定义中的class可以被正确解析Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}....try {// 如果实现了InstantiationAwareBeanPostProcessor就先postProcessBeforeInstantiation(Class<?> beanClass, String beanName)->postProcessAfterInitialization(Object bean, String beanName)Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}....Object beanInstance = doCreateBean(beanName, mbdToUse, args);....}return beanInstance;复制代码

9.Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

....if (exposedObject != null) {exposedObject = initializeBean(beanName, exposedObject, mbd);}....复制代码

10.Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd)

if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {//setBeanName#BeanNameAware//->setBeanClassLoader#BeanClassLoaderAware//->setBeanFactory#BeanFactoryAwareinvokeAwareMethods(beanName, bean);return null;}}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {//->postProcessBeforeInitialization#BeanPostProcessorwrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//->afterPropertiesSet#InitializingBeaninvokeInitMethods(beanName, wrappedBean, mbd);}....if (mbd == null || !mbd.isSynthetic()) {//->postProcessAfterInitialization#BeanPostProcessorwrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;复制代码

private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}复制代码

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {....if (System.getSecurityManager() != null) {try {AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {@Overridepublic Object run() throws Exception {((InitializingBean) bean).afterPropertiesSet();return null;}}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null) {String initMethodName = mbd.getInitMethodName();if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}}}复制代码

postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor ->postProcessAfterInitialization(Object bean, String beanName)#InstantiationAwareBeanPostProcessor ->setBeanName#BeanNameAware ->setBeanClassLoader#BeanClassLoaderAware ->setBeanFactory#BeanFactoryAware ->postProcessBeforeInitialization#BeanPostProcessor ->afterPropertiesSet#InitializingBean ->postProcessAfterInitialization#BeanPostProcessor

public class InitAndDestroySeqBean implements InitializingBean,DisposableBean,BeanPostProcessor,InstantiationAwareBeanPostProcessor {public InitAndDestroySeqBean() {System.out.println("构造方法");}@PostConstructpublic void postConstruct(){System.out.println("@PostConstruct");}@Override public void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet()#InitializingBean");}public void initMethod(){System.out.println("init-method");}@PreDestroypublic void preDestroy(){System.out.println("@PreDestroy");}@Override public void destroy() throws Exception {System.out.println("destroy()#DisposableBean");}public void destroyMethod(){System.out.println("destroy-method");}@Override public Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor");return bean;}@Override public Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor");return bean;}@Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)throws BeansException {System.out.println("postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor");return null;}@Override public boolean postProcessAfterInstantiation(Object bean, String beanName)throws BeansException {System.out.println("postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor");return false;}@Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,Object bean, String beanName) throws BeansException {System.out.println("postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,\n"+ " Object bean, String beanName)#InstantiationAwareBeanPostProcessor");return null;}}复制代码

0308:11:34:52.866 [main] INFO Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@49c43f4e, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@290dbf45, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@12028586, org.springframework.test.context.support.DirtiesContextTestExecutionListener@17776a8, org.springframework.test.context.transaction.TransactionalTestExecutionListener@69a10787, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@2d127a61]0308:11:34:52.972 [main] INFO Loading XML bean definitions from URL [file:/Users/dsc/IdeaProjects/firDemo/firdemo/web/target/classes/init.xml] 0308:11:34:53.105 [main] INFO Refreshing org.springframework.context.support.GenericApplicationContext@2b4a2ec7: startup date [Wed Mar 08 11:34:53 CST ]; root of context hierarchy 构造方法 @PostConstruct afterPropertiesSet()#InitializingBean init-method postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor 0308:11:34:53.286 [Thread-0] INFO Closing org.springframework.context.support.GenericApplicationContext@2b4a2ec7: startup date [Wed Mar 08 11:34:53 CST ]; root of context hierarchy @PreDestroy destroy()#DisposableBean destroy-method

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。