> From: chris.cranf...@setech.com
> To: user@struts.apache.org
> Subject: RE: Spring BeanPostProcessor called twice for Struts managed beans
> Date: Thu, 15 Oct 2015 13:26:01 +0000
> 
> I could be mistaken, but that would only solve not invoking the post 
> instantiation callbacks on the bean and would also imply that the 
> BeanPostProcessor implementations actually implement the 
> InstantiationAwareBeanPostProcessor interface I believe.   It also seems far 
> more logical to put this burn on the dependency injection framework itself, 
> particularly since the framework already manages this bean lifecycle workflow 
> itself.  

MG>how would DI lifecycle framework detect "This Spring bean has already been 
initialised"?
MG>if we can guarantee synchronised access to the initialised bean perhaps some 
manner of registration such as MG>SingletonBeanRegistry.registerSingleton(
MG>http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/SingletonBeanRegistry.html#registerSingleton-java.lang.String-java.lang.Object-
MG>afterward we detect "has this initialised bean already been registered" with 
getSingleton(String beanName)
MG>WDYT?
> 
> -----Original Message-----
> From: Martin Gainty [mailto:mgai...@hotmail.com] 
> Sent: Thursday, October 15, 2015 7:29 AM
> To: Struts Users Mailing List <user@struts.apache.org>
> Subject: RE: Spring BeanPostProcessor called twice for Struts managed beans
> 
> > From: lukaszlen...@apache.org
> > Date: Thu, 15 Oct 2015 07:56:24 +0200
> > Subject: Re: Spring BeanPostProcessor called twice for Struts managed 
> > beans
> > To: user@struts.apache.org
> > 
> > You are probably right :) Please register an issue and target 2.3.25 
> > as a fix version.
> > 
> > 
> > Regards
> > --
> > Ɓukasz
> > + 48 606 323 122 http://www.lenart.org.pl/
> > 
> > 2015-10-15 6:57 GMT+02:00 CRANFORD, CHRIS <chris.cranf...@setech.com>:
> > > In a recent BeanPostProcessor implementation, I noticed our logic was 
> > > being invoked twice in both the before and after initialization callbacks 
> > > for struts constructed objects like actions, interceptors, etc while 
> > > normal constructed Spring beans via component scanning were only being 
> > > invoked once.
> > >
> > > After debugging in 3.2.24.1, I narrowed the issue down to the 
> > > SpringObjectFactory implementation in Xwork2 at lines 194 to 197.  It 
> > > seems XWork's implementation manually calls the before and after 
> > > BeanPostProcessor callbacks.  Looking at the Spring source for 
> > > AbstractAutowireCapableBeanFactory, it seems initializeBean's 
> > > implementation also calls these callback methods too, which is what leads 
> > > to re-evaluating the struts constructed objects twice.
> > >
> > > I believe the plugin is based on Spring 3.0.5 (IIRC) and even reviewing 
> > > the code base at that release along with the latest 4.2.1 release, both 
> > > confirm that initializeBean has always invoked the BeanPostProcessor 
> > > callbacks internally and therefore, XWork's implementation really should 
> > > not worry with manually invoking them too.
> > >
> > > Is there a technical reason why the SpringObjectFactory is doing this or 
> > > is this an oversight?
> > > This just seems like a significant overhead on bean management that could 
> > > be avoided, right?
> > >
> > > Thanks,
> > > Chris
> MG>2 leads who preceeded Lukasz didnt test out the 
> MG>alwaysRespectAutowireStrategy = false logic no testcase means bug 
> MG>buried deep within code and  never shouldve seen light of day in a 
> MG>Continous Integration environment all features have at least one 
> MG>testcase..so if juergens spring code detects property assignment on a 
> MG>bean has already been set..maybe we can catch detect that
> /**
>      * Perform operations after the bean has been instantiated, via a 
> constructor or factory method,
>      * but before Spring property population (from explicit properties or 
> autowiring) occurs.
>      * <p>This is the ideal callback for performing field injection on the 
> given bean instance.
>      * See Spring's own {@link 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor}
>      * for a typical example.
>      * @param bean the bean instance created, with properties not having been 
> set yet
>      * @param beanName the name of the bean
>      * @return {@code true} if properties should be set on the bean; {@code 
> false}
>      * if property population should be skipped. Normal implementations 
> should return {@code true}.
>      * Returning {@code false} will also prevent any subsequent 
> InstantiationAwareBeanPostProcessor
>      * instances being invoked on this bean instance.
>      * @throws org.springframework.beans.BeansException in case of errors
>      */
>     boolean postProcessAfterInstantiation(Object bean, String beanName) 
> throws BeansException;
> MG>Good Catch Chris!
> > >
> > >
> > > --------------------------------------------------------------------
> > > - To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> > > For additional commands, e-mail: user-h...@struts.apache.org
> > >
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> > For additional commands, e-mail: user-h...@struts.apache.org
> > 
>                                         
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> For additional commands, e-mail: user-h...@struts.apache.org
> 
                                          

Reply via email to