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

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 回答

?
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下载
官方微信