方面建议其他方面

杰姆斯

我目前正在开发两个使用Spring-AOP的Spring应用程序。我有一个方面允许简单的性能日志记录,其定义如下:

@Aspect
final class PerformanceAdvice {
    private Logger logger = LoggerFactory.getLogger("perfLogger");

    public Object log(final ProceedingJoinPoint call) throws Throwable {
        logger.info("Logging statistics.");
    }
}

然后可以通过带有以下XML的Spring AOP配置来创建此建议:

<bean id="performanceAdvice" class="com.acme.PerformanceAdvice" />

<aop:config>
    <aop:aspect ref="performanceAdvice">
        <aop:around pointcut="execution(* com.acme..*(..))" method="log"/>
    </aop:aspect>
</aop:config>

这对于Spring创建的类(例如用注释的类)很好用@Service但是,我希望这个方面也可以在二级项目中提供其他方面的建议我知道Spring不支持他们的文档中所指出

在Spring AOP中,不可能使方面本身成为其他方面的建议目标。类上的@Aspect注释将其标记为一个方面,因此将其从自动代理中排除。

因此,我可能需要更强大的功能,例如AspectJ还是有可能使Spring意识到这一方面并仍然允许建议?从StackOverflow上的许多其他问题(与该特定问题没有直接关系)中,我尝试了制作方面@Configurable,通过将它们定义为a并使它们具有Spring意识,@Component并使用了各种XML和插件设置,例如:

<context:spring-configured />
<context:annotation-config/>
<context:load-time-weaver/>
<aop:aspectj-autoproxy/>

我的想法已经用完了。我是否需要写出完整的AspectJ方面?如果是这样,它是否可以使用相同的配置(例如Spring),引用现有方面并定义新切入点?这将很有用,因此我不必重新编写PerformanceAdvicefor,Project 1但仍可以参考并在中使用它Project 2

编辑此评论为了使自己更清楚,我有以下示例。

我有一个服务Project 2

@Service
public class TargetSpringServiceImpl implements TargetSpringService {
    @Override
    public String doSomeComplexThings(String parameter) {
        return "Complex stuff";
    }
}

当调用此方法时,我会有一个方面进行一些验证。

@Aspect
public class ValidationAdvice {
    @Autowired
    ValidationService validationService

    public void validate(JoinPoint jp) throws Throwable {
        //Calls the validationService to validate the parameters
    }
}

使用以下切入点作为执行:

<bean id="validationAdvice" class="com.acme.advice.ValidationAdvice" />

<aop:config>
    <aop:aspect ref="validationAdvice">
        <aop:before pointcut="execution(* com.acme.service..*(..))" method="validate"/>
    </aop:aspect>
</aop:config>

我想在PerformanceAdvicelog()方法上调用ValidationAdvicevalidate()方法。不在doSomeComplexThings()方法上TargetSpringService因为这只是一个附加切入点。问题在于建议另一个方面的方法。

杰姆斯

我已经找到了解决我的问题的两种可能的解决方案。一个实际上是在建议方面,另一个实际上是在解决问题,但实际上更优雅。

解决方案1:建议方面

AspectJ有可能编织任何事情。借助于AspectJ LTW文档META-INF/aop.xml中所述的文件,我可以通过以下方式引用该方面并定义一个新的切入点。

项目1的变更

PerformanceAdvice

为了允许AspectJ定义新的切入点,建议必须是abstract并且具有pointcut可以挂接到的抽象方法。

@Aspect
final class PerformanceAdvice extends AbstractPerformanceAdvice {
    @Override
    void externalPointcut(){}
}

@Aspect
public abstract class AbstractPerformanceAdvice {
    private Logger logger = LoggerFactory.getLogger("perfLogger");

    @Pointcut
    abstract void externalPointcut();

    @Around("externalPointcut()")
    public Object log(final ProceedingJoinPoint call) throws Throwable {
        logger.info("Logging statistics.");
    }
}

项目2的变更

META-INF/aop.xml

aop.xml文件定义了一个名为的新方面ConcretePerformanceAdvice它也扩展了AbstractPerformanceAdvice,但定义了一个新的切入点。然后,在AspectJIS可能(不像在弹簧AOP) 以限定一个切入点另一个方面。

<aspectj>
    <aspects>
        <concrete-aspect name="com.example.project2.ConcretePerformanceAdvice" extends="com.example.project1.AbstractPerformanceAdvice">
            <pointcut name="externalPointcut" expression="execution(* com.example.project2.ValidationAdvice.validate(..))"/>
        </concrete-aspect>
    </aspects>    
    <weaver options="-verbose"/>
</aspectj>

pom.xml

编织方面需要一些仪器。这需要依赖关系和插件来执行它。至于依赖关系,如下所示:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-instrument</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

目前,在测试过程中,我通过进行测试surefire-plugin这需要以下位:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>
                    -javaagent:"${settings.localRepository}/org/springframework/spring-instrument/${org.springframework.version}/spring-instrument-${org.springframework.version}.jar"
                </argLine>
                <useSystemClassloader>true</useSystemClassloader>
            </configuration>
        </plugin>
    </plugins>
</build>

春天的背景

要启用加载时编织,还必须激活编织。因此,必须在Spring上下文中添加以下内容。

<context:load-time-weaver/>

解决方案2:委托给Spring bean

Spring-AOP不允许方面建议其他方面。但是它的确允许在春季运行建议@Component因此,另一种解决方案是将建议中完成的验证转移到另一个Spring bean。然后将这个Spring bean自动连接到通知中并执行,但是PerformanceAdvice它在验证组件上而不是在验证方面具有切入点因此,它看起来如下所示:

项目1的变更

没有!

项目2的变更

该建议会自动装配Spring@Component并将其逻辑委托给组件。

@Aspect
public class ValidationAdvice {
    @Autowired
    private ValidatorDefault validatorDefault;

    public void validate(JoinPoint jp) throws Throwable {
        validatorDefault.validate(jp);
    }
}

@Component
public class ValidatorDefault {
    @Autowired
    ValidationService validationService

    public void validate(JoinPoint jp) throws Throwable {
        //Calls the validationService to validate the parameters
    }
}

然后,在Spring上下文中,可以@ComponentValidationAdvice自动装配的同时定义切入点@Component

<!-- Scan the package to find the ValidatorDefault component for autowiring -->
<context:component-scan base-package="com.example.project2" />

<bean id="validationAdvice" class="com.example.project2.ValidationAdvice" />
<bean id="performanceAdvice" class="com.example.project1.PerformanceAdvice" />

<aop:config>
    <aop:aspect ref="validationAdvice">
        <aop:before pointcut="execution(* com.acme.service..*.*(..))" method="validate"/>
    </aop:aspect>
    <aop:aspect ref="performanceAdvice">
        <aop:around pointcut="execution(* com.example.project2.ValidatorDefault.validate(..))" method="log"/>
    </aop:aspect>
</aop:config>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Vue.js是否在其他方面

来自分类Dev

如果在其他方面?

来自分类Dev

“%”正在对URI进行解码,而其他方面则没有

来自分类Dev

除了smplayer和umplayer以外,mplayer还有哪些其他方面?

来自分类Dev

使用iptables过滤所有类型的TCP攻击是否已在其他地方或其他方面被过滤掉了?

来自分类Dev

将“ su <user>”用于权限较低的用户以启动Web应用程序是否有缺点(安全性或其他方面)?

来自分类Dev

如何使用其他查询来计算方面

来自分类Dev

如何使用其他查询来计算方面

来自分类Dev

用注解注解的方法的方面,用其他注解注解

来自分类Dev

在对其他文件的可见性方面,结构如何表现?

来自分类Dev

基于其他列的ggplot2方面中的自定义轴中断

来自分类Dev

获取不存在其他模型的多方面关系的对象?

来自分类Dev

Elasticsearch按所有者,我和其他人进行分组的方面

来自分类Dev

在对其他文件的可见性方面,结构如何表现?

来自分类Dev

在 XAML 文件与 ViewModel 对话后,MVVMLight 在其他哪些方面有帮助

来自分类Dev

通过Pandas GroupBy函数(和建议的其他方法)为SVM创建特征(行)向量

来自分类Dev

有关多方面搜索软件堆栈的建议

来自分类Dev

Aspectj和Spring安全性方面-建议执行顺序

来自分类Dev

Spring Data Repository的方面建议不起作用

来自分类Dev

在多线程合并排序方面需要建议

来自分类Dev

在调用返回行为方面,fork() 和 exec() 系统调用与其他系统调用有何不同?

来自分类Dev

This()与Target()方面

来自分类Dev

其他方法的范围

来自分类Dev

MouseOver的其他方式

来自分类Dev

如何解决SurfaceHolder.setType不建议使用的问题?还有其他方法吗?

来自分类Dev

as / 400:显示图形的其他方法?

来自分类Dev

PictureBox PaintEvent与其他方法

来自分类Dev

如何从其他方法访问变量

来自分类Dev

从调用其他方法的方法

Related 相关文章

  1. 1

    Vue.js是否在其他方面

  2. 2

    如果在其他方面?

  3. 3

    “%”正在对URI进行解码,而其他方面则没有

  4. 4

    除了smplayer和umplayer以外,mplayer还有哪些其他方面?

  5. 5

    使用iptables过滤所有类型的TCP攻击是否已在其他地方或其他方面被过滤掉了?

  6. 6

    将“ su <user>”用于权限较低的用户以启动Web应用程序是否有缺点(安全性或其他方面)?

  7. 7

    如何使用其他查询来计算方面

  8. 8

    如何使用其他查询来计算方面

  9. 9

    用注解注解的方法的方面,用其他注解注解

  10. 10

    在对其他文件的可见性方面,结构如何表现?

  11. 11

    基于其他列的ggplot2方面中的自定义轴中断

  12. 12

    获取不存在其他模型的多方面关系的对象?

  13. 13

    Elasticsearch按所有者,我和其他人进行分组的方面

  14. 14

    在对其他文件的可见性方面,结构如何表现?

  15. 15

    在 XAML 文件与 ViewModel 对话后,MVVMLight 在其他哪些方面有帮助

  16. 16

    通过Pandas GroupBy函数(和建议的其他方法)为SVM创建特征(行)向量

  17. 17

    有关多方面搜索软件堆栈的建议

  18. 18

    Aspectj和Spring安全性方面-建议执行顺序

  19. 19

    Spring Data Repository的方面建议不起作用

  20. 20

    在多线程合并排序方面需要建议

  21. 21

    在调用返回行为方面,fork() 和 exec() 系统调用与其他系统调用有何不同?

  22. 22

    This()与Target()方面

  23. 23

    其他方法的范围

  24. 24

    MouseOver的其他方式

  25. 25

    如何解决SurfaceHolder.setType不建议使用的问题?还有其他方法吗?

  26. 26

    as / 400:显示图形的其他方法?

  27. 27

    PictureBox PaintEvent与其他方法

  28. 28

    如何从其他方法访问变量

  29. 29

    从调用其他方法的方法

热门标签

归档