spring DI

参考
https://blog.csdn.net/qq_44836294/article/details/107794445

入口

AbstractApplicationContext:refresh()

public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// 准备好刷新上下文
		prepareRefresh();
 
		// 告诉子类刷新内部bean工厂  IOC 加载定位注册bean到beanDefinitionMap中
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
 
		// 准备bean工厂,以便在此上下文中使用
		prepareBeanFactory(beanFactory);
 
		try {
			//可算作DI开始

			// 允许在上下文子类中对bean工厂进行后处理(例如  继承Aware)
			// 1.添加后处理器、忽略依赖接口
			// 2.注册web应用的scopes
			// 3.注册和环境有关的beans    参考https://www.cnblogs.com/feng-jq/p/10282260.html
			postProcessBeanFactory(beanFactory);
 
			// 调用上下文中注册为bean的工厂处理器(实现BeanFactoryPostProcessor接口的postProcessBeanFactory()方法,来对生成好的beanDefinition做处理操作)
			invokeBeanFactoryPostProcessors(beanFactory);
 	
 			// 开始实例化bean
			// 注册拦截bean创建的bean处理器(实现BeanPostProcessor接口的before,after方法,对BeanFactory的实例化,注册后置拦截器,当getBean()的时候,触发before,after方法)
			registerBeanPostProcessors(beanFactory);
 
			// 初始化此上下文的消息源(国际化)
			initMessageSource();
 
			// 初始化此上下文的事件多播器
			initApplicationEventMulticaster();
 
			// 在特定上下文子类中初始化其他特殊bean
			onRefresh();
 
			// 检查侦听器bean并注册它们
			registerListeners();
 
			// 实例化所有剩余的(非惰性初始化)单例,这里完成DI及三级缓存
			// 三级缓存 https://blog.csdn.net/qq_43516647/article/details/122682677
			finishBeanFactoryInitialization(beanFactory);
 
			// 最后一步:发布相应的事件
			finishRefresh();
		} catch (BeansException ex) {
			if (logger.isWarnEnabled()) {
				logger.warn("Exception encountered during context initialization - " +
						"cancelling refresh attempt: " + ex);
			}
 
			// 销毁已经创建的单例,以避免挂起资源。
			destroyBeans();
 
			// 重置“活跃”的旗帜。
			cancelRefresh(ex);
 
			// Propagate exception to caller.
			throw ex;
		}
 
		finally {
			// 重置Spring核心中的公共内省缓存,因为我们可能再也不需要单例bean的元数据了……
			resetCommonCaches();
		}
	}
}

postProcessBeanFactory方法的使用示例

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("调用MyBeanFactoryPostProcessor的postProcessBeanFactory");
        BeanDefinition bd = beanFactory.getBeanDefinition("myJavaBean");
        System.out.println("属性值============" + bd.getPropertyValues().toString());
        MutablePropertyValues pv =  bd.getPropertyValues();  
        if (pv.contains("remark")) {  
            pv.addPropertyValue("remark", "把备注信息修改一下");  
        }  
        bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值