启用spring aop可以避免依赖注入

时间:2014-01-29 01:55:52

标签: java spring dependency-injection aspectj spring-aop

我有一个简单的spring bean(一个S2动作类),它使用自动装配来注入依赖工作的常规方法。但是,当我使用这个bean的方法之一进行弹跳时,使用JDK / cglib代理提出@Before建议时,将跳过依赖注入,而不会设置我的变量。

我知道这与spring aop通过代理完成连接点的方式有关,但我无法从文档中找到有关此特定问题的任何内容。我错过了什么?

如果有人需要看一下,我也可以发布上下文xml,但它真的非常简单,它包含的是动作类的几个bean,方面的bean和{{1}设置。

答案:

这是错误:

<aop:aspectj-autoproxy>

<action name="sampleAction" class="com.example.s2.SampleAction" method="actionMethod"> 属性必须在spring的应用程序上下文中引用spring bean。

更新1

  1. 我已经尝试过JDK代理和CGLib,两种情况都会出现同样的问题。
  2. 使用bean属性注入依赖(而不是自动装配)也无济于事。
  3. 我使用spring 4.0.0.RELEASE和struts2.1.3。
  4. 更新2(包含代码)

    class

    TestAspect类:

    <!-- ======================== Spring context annotation support======================== -->
        <context:annotation-config />
        <bean id="testAspect" class="com.example.s2.aop.TestAspect" />
    
        <!-- ======================== AspectJ configuration======================== --> 
        <!-- Proxy-target-class must be set true if the object being proxied does not implement even a single interface (or if the advised method
               does not come from an interface. Setting this to true tells spring to use cglib for proxying -->
        <aop:aspectj-autoproxy proxy-target-class="true" />
    
      <!-- ======================== Spring managed beans ======================== -->
        <bean id="sampleActionBean"
                class="com.example.s2.SampleAction"
                scope="prototype">
        </bean>
    
        <!-- use a single offer service manager instance throughout the course of the context -->
        <bean id="dependency1" class="com.example.s2.DependencyProviderFactory" factory-method="getDependency1Instance" />
    

    被告知的类(SampleAction):

    @Aspect
    public class TestAspect
    {
      private static final Logger SLOGGER = Logger.getLogger(TestAspect.class);
      @Before ("actionAnnotatedPointCut() && (publicActionMethodPointCut() || protectedActionMethodPointCut())")
      public void checkUserAccess(JoinPoint pJoinPoint) throws Throwable
      {
        SLOGGER.smartError("Intercepted:", pJoinPoint.getSignature().getName());
      }
    
      @AfterThrowing (value = "actionAnnotatedPointCut() && (publicActionMethodPointCut() || protectedActionMethodPointCut())", throwing = "pException")
      public void handlePortletException(JoinPoint pJoinPoint, Exception pException)
      {
        SLOGGER.smartError("Method threw error:", pJoinPoint.getSignature().getName(), "| Exception:", pException);
      }
    
      @Pointcut ("@annotation(org.apache.struts2.convention.annotation.Action")
      public void actionAnnotatedPointCut() {}
    
      @Pointcut ("execution(public String *(..))")
      public void publicActionMethodPointCut() {}
    
      @Pointcut ("execution(protected String *(..))")
      public void protectedActionMethodPointCut() {}
    }
    

    struts.xml中:

    public class SampleAction
    {
      @Autowired
      private Dependency1 dependency1;
      ...
    }
    

    更新3

    我认为我发现了问题,struts配置中<constant name="struts.objectFactory" value="spring" /> <action name="sampleAction" class="com.example.s2.SampleAction" method="actionMethod"> <result name="success">/pages/actionOutput.jsp</result> </action> 的{​​{1}}必须为class。我知道我是从这种方式开始的,不知道当我还原的时候,我的道歉。

1 个答案:

答案 0 :(得分:1)

春天永远不会留下注射目标,即。 @Autowired字段或方法,null。如果无法找到要注入的bean,它将始终抛出异常。

因此,错误必须在其他地方。看到你有Struts,我会假设你可能正在查看由Struts管理的对象,并认为它们也是由Spring管理的。只有适当地完成Spring-Struts集成,才会出现这种情况。