Spring 对真实bean实例设置了一个代理对象,用户通过@Autowired、@Resource等注解定义bean后,spring执行过程获取的是对应真实实例的代理对象。
注解修饰接口,通过jdk动态代理到真实实例。
注解修饰非接口,通过cglib动态代理到真实实例。
但是jdk和cglib构建的代理对象都实现org.springframework.aop.framework.Advised接口。
可以通过该接口获取代理对象的真实实例,代码参考:
public static Object getTargetBean(Object bean) {
Object targetBean = bean;
if (targetBean instanceof Advised) {
try {
Object target = ((Advised) targetBean).getTargetSource().getTarget();
targetBean = target;
} catch (Exception e) {
}
}
return targetBean;
}