为了账号安全,请及时绑定邮箱和手机立即绑定

Spring AOP不适用于另一个方法中的方法调用

/ 猿问

Spring AOP不适用于另一个方法中的方法调用

慕瓜9086354 2019-11-14 10:00:40

ABC.java中定义了两种方法


public void method1(){

   .........

   method2();

  ...........

}



public void method2(){

  ...............

  ...............  

}

我想有AOP上的呼叫方法2。所以,我创建了一个类,AOPLogger.java,具有在方法提供方面功能的checkAccess

在配置文件中,我不喜欢的东西下面


<bean id="advice" class="p.AOPLogger" />

<aop:config>

  <aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" />

  <aop:aspect id="service" ref="advice">

    <aop:before pointcut-ref="abc" method="checkAccess" />          

  </aop:aspect>

</aop:config>

但是,当调用我的method2时,不会调用AOP功能,即不会调用AOPLogger类的checkAccess方法。


我有什么想念的吗?


查看完整描述

3 回答

?
紫衣仙女

该方面应用于围绕bean 的代理。请注意,每次获得对bean的引用时,它实际上并不是配置中引用的类,而是实现相关接口的委托类,该类综合了实际的类并添加了功能,例如AOP。


在上面的示例中,您直接在类上调用,而如果将该类实例作为Spring bean注入到另一个实例中,则将其作为其代理注入,因此将在代理上调用方法调用(并且方面将被触发)


如果要实现上述目标,则可以将method1/ 拆分method2为单独的bean,或者使用非基于Spring的AOP框架。


在春季文档(节“理解AOP代理”)详细说明这一点,一对夫妇的解决方法(包括我上面的第一个建议)


查看完整回答
反对 回复 2019-11-14
?
MYYA

可以通过自我注射使用来完成。您可以通过注入的实例调用inner方法:


@Component

public class Foo {

    @Resource

    private Foo foo;


    public void method1(){

        ..

        foo.method2();

        ..

    }

    public void method2(){

        ..

    }

}

从Spring 4.3开始,您还可以使用@Autowired。


从4.3开始,@ Autowired还考虑了自我引用以进行注入,即,引用回当前注入的Bean。


查看完整回答
反对 回复 2019-11-14
?
尚方宝剑之说

我有同样的问题,我克服了通过实现Spring的ApplicationContextAware,BeanNameAware并实施相应的方法如下。


class ABC implements ApplicationContextAware,BeanNameAware{


      @Override

      public void setApplicationContext(ApplicationContext ac) throws BeansException {

          applicationContext=ac;

      }


      @Override

      public void setBeanName(String beanName) {

          this.beanName=beanName;

      }

      private ApplicationContext applicationContext;

      private String beanName;

}

然后我在调用同一类的方法时将其替换this.为 ((ABC) applicationContext.getBean(beanName)).。这样可以确保对同一类方法的调用仅通过代理进行。


因此method1()更改为


 public void method1(){

    .........

    ((ABC) applicationContext.getBean(beanName)).method2();

    ...........

  }

希望这可以帮助。


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信