Spring中Bean初始化过程
来源:互联网 发布:mac air换外壳 编辑:程序博客网 时间:2024/06/03 09:22
1、设置configLocation并调用refresh开始刷新上下文
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException { super(parent); setConfigLocations(configLocations); if (refresh) { refresh(); } }
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. **finishBeanFactoryInitialization(beanFactory);** // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }
2、解析配置文件得到Bean名称集合和定义集合
public class DefaultListableBeanFactory .....{ ...... // Bean定义集合 private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64); // Bean名称集合 private final List<String> beanDefinitionNames = new ArrayList<String>(); .......... }
3、遍历Factory中的Bean
public void preInstantiateSingletons() throws BeansException { List<String> beanNames; synchronized (this.beanDefinitionMap) { beanNames = new ArrayList<String>(this.beanDefinitionNames); } for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName); boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { @Override public Boolean run() { return ((SmartFactoryBean<?>) factory).isEagerInit(); } }, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); } } else { getBean(beanName); } } } }
4、判断Bean类型针对性处理
protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)throws BeansException { final String beanName = transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. // (2)先从单例注册表(缓存)中查找 Object sharedInstance = getSingleton(beanName); ....... bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { ......... try { // (3)如果缓存中没有,则获取Bean的定义,为创建Bean做准备 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); ......... // Create bean instance. // (4)如果Bean被配置为单例,则走单例创建方法,创建完成要注册到单例缓存中 if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } // (5)如果Bean被配置为原型,则直接创建 else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { // (6)在Web场景下,Bean的生命周期还有Request、Session、GlobalSession等范围, String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } } ........... } return (T) bean; } }
5、Bean实际通过反射技术创建而不是new出来的
public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException { Assert.notNull(ctor, "Constructor must not be null"); try { ReflectionUtils.makeAccessible(ctor); // 强制构造函数可用 return ctor.newInstance(args); // 创建实例对象,同Class.newInstance作用一样 } ........ }
6、调用BeanPostProcessors进行后续处理
阅读全文
0 0
- spring中bean初始化过程
- spring中bean初始化过程
- spring中bean初始化过程
- Spring中Bean初始化过程
- Spring中Bean的初始化过程
- 关于Spring 中初始化bean的过程
- spring中bean的初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean初始化过程
- Spring Bean初始化过程
- spring bean初始化过程
- Spring 初始化bean过程图解
- Spring中bean的初始化方法
- Spring中Bean的初始化顺序
- maven 开发布署
- 《deep learning》学习笔记(5)——机器学习基础
- Java学习总结
- LengthFieldBasedFrameDecoder和LengthFieldPrepender
- Bigdata Development Web_Study_02(Servlet使用,table标签)
- Spring中Bean初始化过程
- PHP入门(第一弹:初识PHP)
- Linux学习笔记_系统主机名称修改(hostname,sed)
- openlayer4加载天地图
- qt开发环境
- 事件处理:五星评价的例子
- SD卡的命令格式:
- linux中UDP程序流程、客户端、服务端
- Spring boot中集成mybatis开发环境