spring容器启动就获得实现指定接口的beanMap
2016-12-26 19:33
316 查看
package cn.baozun.crm.listener;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import cn.baozun.crm.service.api.common.IMobile;
import cn.baozun.crm.util.ProxyToTarget;
// IMObile 换成指定接口就行了 在application。xml配置 listenner bean即可
public class ContextBeanListener implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 根容器为Spring容器
if(event.getApplicationContext().getParent()==null){
Map<String,Object> beans = event.getApplicationContext().getBeansWithAnnotation(org.springframework.stereotype.Component.class );
HashMap<String,Object> map= new HashMap<String,Object>();
for (Entry<String,Object> entry : beans.entrySet()) {
String key = entry.getKey();
Object obj = entry.getValue();
try {
Object target = ProxyToTarget.getTarget(obj);
if(target instanceof IMobile){
map.put(key, target);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//将spring 代理对象转换成 真是对象
package cn.baozun.crm.util;
import java.lang.reflect.Field;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
public class ProxyToTarget {
public static Object getTarget(Object proxy) throws Exception {
if (!AopUtils.isAopProxy(proxy)) {
return proxy;// 不是代理对象
}
if (AopUtils.isJdkDynamicProxy(proxy)) {
return getJdkDynamicProxyTargetObject(proxy);
} else { // cglib
return getCglibProxyTargetObject(proxy);
}
}
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
h.setAccessible(true);
Object dynamicAdvisedInterceptor = h.get(proxy);
Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);
AdvisedSupport advisedSupport = (AdvisedSupport) advised.get(dynamicAdvisedInterceptor);
Object target = advisedSupport.getTargetSource().getTarget();
return target;
}
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget();
return target;
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import cn.baozun.crm.service.api.common.IMobile;
import cn.baozun.crm.util.ProxyToTarget;
// IMObile 换成指定接口就行了 在application。xml配置 listenner bean即可
public class ContextBeanListener implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 根容器为Spring容器
if(event.getApplicationContext().getParent()==null){
Map<String,Object> beans = event.getApplicationContext().getBeansWithAnnotation(org.springframework.stereotype.Component.class );
HashMap<String,Object> map= new HashMap<String,Object>();
for (Entry<String,Object> entry : beans.entrySet()) {
String key = entry.getKey();
Object obj = entry.getValue();
try {
Object target = ProxyToTarget.getTarget(obj);
if(target instanceof IMobile){
map.put(key, target);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
//将spring 代理对象转换成 真是对象
package cn.baozun.crm.util;
import java.lang.reflect.Field;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
public class ProxyToTarget {
public static Object getTarget(Object proxy) throws Exception {
if (!AopUtils.isAopProxy(proxy)) {
return proxy;// 不是代理对象
}
if (AopUtils.isJdkDynamicProxy(proxy)) {
return getJdkDynamicProxyTargetObject(proxy);
} else { // cglib
return getCglibProxyTargetObject(proxy);
}
}
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
h.setAccessible(true);
Object dynamicAdvisedInterceptor = h.get(proxy);
Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);
AdvisedSupport advisedSupport = (AdvisedSupport) advised.get(dynamicAdvisedInterceptor);
Object target = advisedSupport.getTargetSource().getTarget();
return target;
}
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget();
return target;
}
}
相关文章推荐
- Spring 实现容器销毁该bean的时候获得一次回调
- Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean
- 获得spring容器中,实现某接口的所有实例;
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- Spring AOP实现机制(二)--ProxyFactoryBean---将Spring AOP和Spring IoC容器相结合
- Spring中通过实现ApplicationContextAware接口获取bean
- spring3 bean容器相关源码学习----ApplicationContext接口
- Spring 的 BeanPostProcessor接口实现
- Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法
- Spring-Bean的初始化(init方法和实现org.springframework.beans.factory.InitializingBean接口)
- 获取Spring容器中Bean实例的工具类(Java泛型方法实现)
- C#实现根据指定容器和控件名字获得控件的方法
- Spring 的 BeanPostProcessor接口实现
- spring 中容器 map、set、list、property 的 bean 实例化
- Spring 的 BeanPostProcessor接口实现
- 如何获得Spring容器里管理的Bean,。不论是Service层,还是实体Dao层
- 获得指定接口的所有实现类(实现类需位于接口所在的包或其子包中)
- web后台守护线程如何获得spring容器中的bean
- Spring 的 BeanPostProcessor接口实现
- Spring 的 BeanPostProcessor接口实现