如何通过Java配置实现Spring代理对象的注入(替代XML配置)
Spring Java Config实现代理对象注入Documentarist属性
原始XML配置
通过ProxyFactoryBean创建代理对象,并注入到Documentarist的guitarist属性:
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean" p:target-ref="john" p:interceptorNames-ref="advisorNames"> </bean> <bean id="documentarist" class="com.aop.declarative.Documentarist" p:guitarist-ref="proxy" />
当前Java Config问题
现有Java配置中,documentarist.setGuitarist(guitarist());直接注入了原始Guitarist实例,而非ProxyFactoryBean生成的代理对象,需要调整实现逻辑。
修改后的Java Config实现
方式一:手动调用FactoryBean的getObject()
@Bean public ProxyFactoryBean proxy() { ProxyFactoryBean factoryBean = new ProxyFactoryBean(); factoryBean.setTarget(guitarist()); factoryBean.setProxyTargetClass(true); factoryBean.addAdvisor(pointcutAdvisor()); return factoryBean; } @Bean public Documentarist documentarist() { Documentarist documentarist = new Documentarist(); // 通过ProxyFactoryBean的getObject()获取代理对象 documentarist.setGuitarist((Guitarist) proxy().getObject()); return documentarist; }
方式二:方法参数注入(推荐)
利用Spring对FactoryBean的自动解析能力,直接通过方法参数注入代理对象,更符合Java Config最佳实践:
@Bean public ProxyFactoryBean proxy() { ProxyFactoryBean factoryBean = new ProxyFactoryBean(); factoryBean.setTarget(guitarist()); factoryBean.setProxyTargetClass(true); factoryBean.addAdvisor(pointcutAdvisor()); return factoryBean; } @Bean public Documentarist documentarist(Guitarist proxyGuitarist) { Documentarist documentarist = new Documentarist(); documentarist.setGuitarist(proxyGuitarist); return documentarist; }
说明
- Spring中
ProxyFactoryBean是FactoryBean接口实现类,Spring会自动处理其getObject()方法,返回实际的代理对象。 - 方式二中,Spring会自动识别
proxy()方法返回的ProxyFactoryBean,并将其生成的Guitarist代理对象注入到documentarist()方法的参数中,无需手动处理。
内容的提问来源于stack exchange,提问作者Krishnnakumar R
相关产品推荐
相关产品推荐

