【问题标题】:Dynamic AOP configuration in SpringSpring中的动态AOP配置
【发布时间】:2013-01-16 02:26:14
【问题描述】:

我是 Spring AOP 的新手,我想知道是否可以使用 Spring AOP 实现我的项目。具体来说,我想知道在 Spring AOP 中是否可以在运行时配置哪些方面将被执行以及以何种顺序执行。注意:我只想控制我的应用程序方面,而不干扰 Spring 管理的方面,如事务或安全性。

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

    您可以控制 aspesct 的顺序(使用声明优先级),但在运行时很难做到这一点,因为它需要重新应用编织已经编织的类。 指定执行哪些方面也是如此。

    您可以在每个方面方法的开头进行 if(!enabled){return;} 检查,并且可以像任何普通 bean 一样设置启用或禁用标志。这样,方面总是被编织进去,但如果它们被禁用,它们将无能为力。

    更新

    以下是如何将方面用作 bean 的示例。 假设您有这样的方面:

    @Component // IMPORTANT
    public aspect MyAspect {
        Object responder;
    
        public void setResponder(Object object) {
            this.responder=object;
        }
    }
    

    然后在你的 spring 服务类中,你可以像这样连接方面:

    @Service
    public class MyServiceImpl implements MyService {
        @Autowired
        MyAspect aspect;
    
        void action() {
            aspect.setResponder(null);
        }
    }
    

    这是可行的,因为切面实际上是 java 类。组件注释使方面被spring组件扫描识别为bean。 我已经成功编译了这段代码,但实际上并没有在运行时测试它,所以很高兴知道它是否有效。

    【讨论】:

    • 我在这个答案中找到了一个可能的解决方案:stackoverflow.com/questions/6235359/…。它说在启动时加载NoOpAdvices,并在需要时用所需的建议替换它们。你觉得适用吗?如何在应用程序服务器中执行此操作,我必须控制传入请求的功能方面?
    • 我认为这实际上与我的建议相同。这些方面应该是预定义的和静态的。工作方面确实可以是动态的。方面是普通的 spring bean,因此您可以像控制任何其他 bean 一样控制它们。
    • 从 Spring 文档的 AOP 部分,我创建了 Ordered 接口,它声明了 int getvalue() 方法,我可以使用它来控制 Aspect 的排序(让他们实现接口) .现在我有两个问题:1)getValue() 返回值会在初始化后在运行时修改方面行为吗? 2)如果我在一个类中应用@Service 和@Aspect 注释,@Service 实例是否与@Aspect 相同?如果没有,我如何从对象中检索对系统使用的 Aspect 实例的引用?
    • 不需要@Aspect注解吗?或者我应该同时使用@Aspect@Component?它在运行时工作吗?那么订购呢?
    • 有不同的方式来定义方面。 @Aspect 注释用于注释样式方面。我的示例是强类型 aspectj 样式。在这里阅读更多:eclipse.org/aspectj/doc/next/adk15notebook/ataspectj.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2012-11-05
    • 2016-01-01
    相关资源
    最近更新 更多