当前位置: 首页 > 知识库问答 >
问题:

为静态方法设置AspectJ建议

徐文彬
2023-03-14

我已经用原始切入点和建议方法编写了简单方面:

@Aspect
public class MyAspect {

  @Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))")
  public void someMethodInvoke() { }

  @AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult")
  public void decrementProductCount(List<String> comparisonResult) {
    //some actions
  }
}

我有以下基于Spring注释的应用程序配置:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig { 
  //...
}

和com中的实用程序类。mtag。util包:

public class SomeUtil {
  static List<String> someMethod(List<String> oldList, List<String> newList) {
    //...
  } 
}

但是当我打电话的时候

SomeUtil.someMethod(arg1, arg2);

在单元测试中,我可以看到方法调用没有被拦截,我的@AfterResning建议不起作用。

但如果我将someMethod()类型更改为实例(非静态)方法,则切入点为

@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))")

通过添加@Component注释和调用目标metod来管理Spring的某些对象:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class)
public class SomeUtilTest {

    @Autowired
    private SomeUtil someUtil;

    @Test
    public void categoriesDiffCalc() {
        List<String> result = someUtil.someMethod(...);
    }
}

一切都好。

如何设置静态方法的建议?

共有1个答案

伍宝
2023-03-14

实际上,在spring框架中并没有使用自动代理拦截静态方法的解决方案。您应该使用LWT AspectJ解决方案。

简而言之,您应该使用相同的注释,但需要一些额外的配置。

1) 添加到spring上下文文件的下一行:

<context:load-time-weaver/>

(可能在你的情况下没有必要)

2) 不幸的是,您还应该添加META-INF/aop。xml。例子:

<weaver>
    <include within="com.example.ClassA"/> <!-- path to concrete class -->
    <include within="com.log.* "/> <!—- path to aspects package -->
</weaver>
<aspects>
    <aspect name="com.log.AspectA"/>
</aspects>

3) 在启动参数时

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar

应该加上。

所以这个解决方案相当费劲。

有关更多信息,请阅读此处的第7.8.4章http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

 类似资料:
  • 我正在使用Spring并试图用AspectJ编写示例应用程序。我需要学习如何拦截静态方法调用。在我的示例中,我尝试截取main方法,如下所示: Spring配置文件: 主要方法: 协会本身: 但是当我运行应用程序时,唯一的字符串正在打印。

  • 本文向大家介绍destoon之URL Rewrite(伪静态)设置方法详解,包括了destoon之URL Rewrite(伪静态)设置方法详解的使用技巧和注意事项,需要的朋友参考一下 1、如果您的服务器支持.htaccess,则无需设置,网站根目录下的.htaccess已经设置好规则。 规则(参考http://download.destoon.com/rewrite/htaccess.txt)为:

  • rank ▲ ✰ vote url 31 549 117 733 url 静态方法 Python有没有静态方法使我可以不用实例化一个类就可以调用,像这样: ClassName.StaticMethod ( ) 是的,用静态方法装饰器 class MyClass(object): @staticmethod def the_static_method(x): pri

  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式

  • 问题内容: 如下所示,有两种简单的方法可以制作流式复印机(介绍Apache Commons或类似工具的栏)。我应该去哪一个?为什么? 与 问题答案: 我将使用非静态(实例)版本,并将其作为显式依赖项(使用setter)提供给消费者: 然后将其模拟用于单元测试是微不足道的,因此,消费者的测试不会与实现耦合。 换出功能很简单,例如:使用子类; 与依赖项注入系统配合良好。 编辑 为了回应(“有用!”)的

  • 操作步骤: 菜单栏: Refactor --> Convert to Instance Method