You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Lukasz Lenart (JIRA)" <ji...@apache.org> on 2014/07/28 17:39:40 UTC
[jira] [Updated] (WW-4110) struts2+spring intergration,when user
aop, maybe inject fail
[ https://issues.apache.org/jira/browse/WW-4110?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lukasz Lenart updated WW-4110:
------------------------------
Description:
1.
{code:java}
@Autowired
private Resource resource; //no setter
{code}
{code:xml}
<action name="myAction" class="cn.javass.MyAction">
{code}
2. use aop, for example
{code:xml}
<aop:config proxy-target-class="true">
<aop:aspect ref="myAspect">
<aop:before method="before" pointcut="execution(* cn.javass.MyAction.*(..))"/>
</aop:aspect>
</aop:config>
{code}
3. StrutsSpringObject
{code:java}
bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());
// We don't need to call the init-method since one won't be registered.
bean = autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean, bean.getClass().getName()); //generate proxy
return autoWireBean(bean, autoWiringFactory); //inject error because proxy
{code}
spring`s processing flow :
(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory):
# InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsBeforeInstantiation
# InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsAfterInitialization
# doCreateBean
## createBeanInstance
## populateBean
### InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
### autowire, for example AUTOWIRE_BY_NAME,AUTOWIRE_BY_TYPE
### InstantiationAwareBeanPostProcessor.postProcessPropertyValues
### applyPropertyValues
# initializeBean
## invokeAwareMethods
## BeanPostProcessor.postProcessBeforeInitialization
## invokeInitMethods
## BeanPostProcessor.postProcessAfterInitialization
# solution
{code:java}
bean = autoWiringFactory.createBean(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
bean = autoWireBean(bean, autoWiringFactory);
bean = autoWiringFactory.initializeBean(bean, bean.getClass().getName());
{code}
please delete src/main/java patch
com.opensymphony.xwork2.spring.SpringObjectFactory
test, will see resource is null;
but use this patch will be not null
was:
1、
@Autowired
private Resource resource; //no setter
<action name="myAction" class="cn.javass.MyAction">
2、use aop, for example
<aop:config proxy-target-class="true">
<aop:aspect ref="myAspect">
<aop:before method="before" pointcut="execution(* cn.javass.MyAction.*(..))"/>
</aop:aspect>
</aop:config>
3、StrutsSpringObject
bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());
// We don't need to call the init-method since one won't be registered.
bean = autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean, bean.getClass().getName()); //generate proxy
return autoWireBean(bean, autoWiringFactory); //inject error because proxy
spring`s processing flow :
(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory):
1、InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsBeforeInstantiation
2、InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsAfterInitialization
如果此时有bean返回 直接返回;
3、doCreateBean
3.1、createBeanInstance
3.2、populateBean
3.2.1、InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
3.2.2、autowire, for example AUTOWIRE_BY_NAME,AUTOWIRE_BY_TYPE
3.2.3、InstantiationAwareBeanPostProcessor.postProcessPropertyValues
3.2.4、applyPropertyValues
4、initializeBean
4.1、invokeAwareMethods
4.2、BeanPostProcessor.postProcessBeforeInitialization
4.3、invokeInitMethods
4.4、BeanPostProcessor.postProcessAfterInitialization
5、solution
bean = autoWiringFactory.createBean(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
bean = autoWireBean(bean, autoWiringFactory);
bean = autoWiringFactory.initializeBean(bean, bean.getClass().getName());
please delete src/main/java patch
com.opensymphony.xwork2.spring.SpringObjectFactory
test, will see resource is null;
but use this patch will be not null
> struts2+spring intergration,when user aop, maybe inject fail
> ------------------------------------------------------------
>
> Key: WW-4110
> URL: https://issues.apache.org/jira/browse/WW-4110
> Project: Struts 2
> Issue Type: Improvement
> Components: Plugin - Spring
> Affects Versions: 2.3.1.1
> Reporter: zhangkaitao
> Fix For: 2.3.18
>
> Attachments: test.rar
>
>
> 1.
> {code:java}
> @Autowired
> private Resource resource; //no setter
> {code}
> {code:xml}
> <action name="myAction" class="cn.javass.MyAction">
> {code}
> 2. use aop, for example
> {code:xml}
> <aop:config proxy-target-class="true">
> <aop:aspect ref="myAspect">
> <aop:before method="before" pointcut="execution(* cn.javass.MyAction.*(..))"/>
> </aop:aspect>
> </aop:config>
> {code}
> 3. StrutsSpringObject
> {code:java}
> bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
> bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());
> // We don't need to call the init-method since one won't be registered.
> bean = autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean, bean.getClass().getName()); //generate proxy
> return autoWireBean(bean, autoWiringFactory); //inject error because proxy
> {code}
> spring`s processing flow :
> (org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory):
> # InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsBeforeInstantiation
> # InstantiationAwareBeanPostProcessor.applyBeanPostProcessorsAfterInitialization
> # doCreateBean
> ## createBeanInstance
> ## populateBean
> ### InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
> ### autowire, for example AUTOWIRE_BY_NAME,AUTOWIRE_BY_TYPE
> ### InstantiationAwareBeanPostProcessor.postProcessPropertyValues
> ### applyPropertyValues
> # initializeBean
> ## invokeAwareMethods
> ## BeanPostProcessor.postProcessBeforeInitialization
> ## invokeInitMethods
> ## BeanPostProcessor.postProcessAfterInitialization
> # solution
> {code:java}
> bean = autoWiringFactory.createBean(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false);
> bean = autoWireBean(bean, autoWiringFactory);
> bean = autoWiringFactory.initializeBean(bean, bean.getClass().getName());
> {code}
> please delete src/main/java patch
> com.opensymphony.xwork2.spring.SpringObjectFactory
> test, will see resource is null;
> but use this patch will be not null
--
This message was sent by Atlassian JIRA
(v6.2#6252)