i stuck in problem while , can not sleep:c
when use beanpostprocessor create proxy beana(beanpostprocessor not depend on beana), proxy works well.but if beanpostprocessor depend on beana,it not work.and found beana not proxied in spring applicationcontext when beanpostprocessor depend on it
targetiface:
public interface targetiface { void work(); }
targeta:
public class targeta implements targetiface { public void work() { system.out.println("targeta working..."); } }
targetb:
public class targetb implements targetiface { public void work() { system.out.println("targetb working..."); } }
simpleadivsor:
public class simpleadvisor extends defaultpointcutadvisor { private targetiface targetiface; private final advice advice = new methodinterceptor() { @override public object invoke(methodinvocation invocation) throws throwable { system.out.println("advice intercept...."); if (invocation.getthis().equals(targetiface)) { system.out.println("my advice"); } //no adivce return invocation.proceed(); } }; public simpleadvisor() { setadvice(advice); } public void settargetiface(targetiface targetiface) { this.targetiface = targetiface; } }
beanpostprocessor:
public class proxyprocessor implements beanpostprocessor { private list<advisor> advisors; @override public object postprocessbeforeinitialization(object bean, string beanname) throws beansexception { return bean; } @override public object postprocessafterinitialization(object bean, string beanname) throws beansexception { if (bean instanceof targetiface) { proxyfactory proxyfactory = new proxyfactory(); proxyfactory.settarget(bean); proxyfactory.addadvisors(advisors); return proxyfactory.getproxy(); } return bean; } public void setadvisors(list<advisor> advisors) { this.advisors = advisors; } }
mainclass:
applicationcontext context = new classpathxmlapplicationcontext("classpath:spring/application-context.xml"); targeta targeta = context.getbean(targeta.class); targeta.work();
first case:proxybeanprocessor not depend on targeta
<bean id="proxybeanprocessor" class="net.fendar.test.spring.processor.proxyprocessor"> <property name="advisors"> <list> <bean class="net.fendar.test.spring.advisor.simpleadvisor"> <!--<property name="targetiface" ref="targeta"/>--> </bean> </list> </property> </bean> <bean id="targeta" class="net.fendar.test.spring.bean.targeta"/> <bean id="targetb" class="net.fendar.test.spring.bean.targetb"/>
output:
advice intercept.... targeta working...
bean in applicationcontextenter image description here
second case:proxybeanprocessor depend on target,
<bean id="proxybeanprocessor" class="net.fendar.test.spring.processor.proxyprocessor"> <property name="advisors"> <list> <bean class="net.fendar.test.spring.advisor.simpleadvisor"> <property name="targetiface" ref="targeta"/> </bean> </list> </property> </bean> <bean id="targeta" class="net.fendar.test.spring.bean.targeta"/> <bean id="targetb" class="net.fendar.test.spring.bean.targetb"/> <bean id="proxybeanprocessor" class="net.fendar.test.spring.processor.proxyprocessor"> <property name="target" ref="target"/> </bean>
output:
targeta working...
bean in application:
if beanpostprocessor
bean depends on bean want proxy
<bean id="proxybeanprocessor" class="net.fendar.test.spring.processor.proxyprocessor"> <property name="target" ref="target"/> </bean>
then bean must created before proxyprocessor
bean ready. and, if it's not ready, there's no way can post process other beans, including target bean.
when spring initializes beans, passes them through registered beanpostprocessor
bean instances. implies beanpostprocesser
beans have been initialized. case demonstrates scenario bean initialized before beanpostprocessor
, therefore can't process it.
Comments
Post a Comment