Spring的IOC容器负责管理bean的生命周期
IOC初始化
初始化bean工厂
注册beanDefinition
实例化bean
属性装配
执行回调方法
入口 1 2 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-base.xml" ); Student student = (Student) applicationContext.getBean("stu1" );
流程图 项目启动时spring会通过资源加载组件(ResourceLoader)加载配置文件(spring-base.xml)作为资源(Resource) 通过BeanDefinitonReader解析此资源生成bean定义(beanDefinition) 注册到bean工厂(DefaultListableBeanFactory持有一个Map<String, BeanDefiniton>) 并完成bean的初始化(实例化、属性装配) 执行回调方法 从而提供bean的获取
回调方法(AbstractAutowireCapableBeanFactory.initializeBean) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 protected Object initializeBean (final String beanName, final Object bean, RootBeanDefinition mbd) { if (System.getSecurityManager() != null ) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run () { invokeAwareMethods(beanName, bean); return null ; } }, getAccessControlContext()); } else { invokeAwareMethods(beanName, bean); } Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { 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()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 @Override public Object applyBeanPostProcessorsBeforeInitialization (Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessBeforeInitialization(result, beanName); if (result == null ) { return result; } } return result; } 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 (logger.isDebugEnabled()) { logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'" ); } if (System.getSecurityManager() != null ) { try { AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { @Override public 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); } } } @Override public Object applyBeanPostProcessorsAfterInitialization (Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessAfterInitialization(result, beanName); if (result == null ) { return result; } } return result; }
ApplicationContextAwareProcessor 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; public ApplicationContextAwareProcessor (ConfigurableApplicationContext applicationContext) { this .applicationContext = applicationContext; } @Override public Object postProcessBeforeInitialization (final Object bean, String beanName) throws BeansException { AccessControlContext acc = null ; if (System.getSecurityManager() != null && (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) { acc = this .applicationContext.getBeanFactory().getAccessControlContext(); } if (acc != null ) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run () { invokeAwareInterfaces(bean); return null ; } }, acc); } else { invokeAwareInterfaces(bean); } return bean; } private void invokeAwareInterfaces (Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this .applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver( new EmbeddedValueResolver(this .applicationContext.getBeanFactory())); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this .applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this .applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this .applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this .applicationContext); } } } @Override public Object postProcessAfterInitialization (Object bean, String beanName) { return bean; } private static class EmbeddedValueResolver implements StringValueResolver { private final ConfigurableBeanFactory beanFactory; public EmbeddedValueResolver (ConfigurableBeanFactory beanFactory) { this .beanFactory = beanFactory; } @Override public String resolveStringValue (String strVal) { return this .beanFactory.resolveEmbeddedValue(strVal); } } }
初始化bean的回调方式 1 <bean id ="exampleInitBean" class ="examples.ExampleBean" init-method ="init" />
1 2 3 4 5 6 public class AnotherExampleBean implements InitializingBean { public void afterPropertiesSet () { } }
1 2 3 4 @PostConstruct public void init () {}
1 2 3 4 @Bean (initMethod = "init" )public Foo foo () { return new Foo(); }