栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring-创建完bean之后自动回调里面的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring-创建完bean之后自动回调里面的方法

目录

  1.实现SmartInitializingSingleton接口,具体原因解释如下:

 2.实现ApplicationListener接口:基于监听器解决问题,具体原因解释如下:


在公司统一配置中心客户端的程序代码中,遇到了这么一个问题:将所写的客户端程序打成jar后放到客户端里面,创建完Bean之后需要自动回调里面的方法来完成检测服务端是否重新发布配置的一个长轮询基于这个问题,给出两个解决方案::

  1.实现SmartInitializingSingleton接口,具体原因解释如下:
    for (String beanName : beanNames) {
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean factory = (FactoryBean) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction)
											((SmartFactoryBean) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

        //通过上述步骤,已经把beanDefinitionMap中符合要求的bean定义创建完成
        //遍历所有的beanName
		for (String beanName : beanNames) {
            //所有的bean已经创建完成,会从一级缓存中获取对应的对象
			Object singletonInstance = getSingleton(beanName);
            //判断是否实现了SmartInitializingSingleton接口
			if (singletonInstance instanceof SmartInitializingSingleton) {
                //如果实现了这个接口,将实现类转为smartSingleton 
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
                    //调用实现类里面的这个方法
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		} 

具体的实现代码:

 2.实现ApplicationListener接口:基于监听器解决问题,具体原因解释如下:
protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
       
        else {

//ApplicationEventMulticaster这个类是我们所说的广播器,在spring事件中起到了非常关键的作用,
//发布者发布的事件会发送给EventMultiCaster, 而后由EventMultiCaster注册着所有的Listener,
//然后根据事件类型决定转发给那个Listener,接着唤醒Listener,执行里面的onApplicationEvent方法

            getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
        }

       

}



private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {
       //经过上述处理找到对应的监听器,调用onApplicationEvent方法
       try {
           listener.onApplicationEvent(event);
       }
}

具体代码实例

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号