【发布时间】:2013-01-16 02:26:14
【问题描述】:
我是 Spring AOP 的新手,我想知道是否可以使用 Spring AOP 实现我的项目。具体来说,我想知道在 Spring AOP 中是否可以在运行时配置哪些方面将被执行以及以何种顺序执行。注意:我只想控制我的应用程序方面,而不干扰 Spring 管理的方面,如事务或安全性。
【问题讨论】:
标签: spring spring-aop
我是 Spring AOP 的新手,我想知道是否可以使用 Spring AOP 实现我的项目。具体来说,我想知道在 Spring AOP 中是否可以在运行时配置哪些方面将被执行以及以何种顺序执行。注意:我只想控制我的应用程序方面,而不干扰 Spring 管理的方面,如事务或安全性。
【问题讨论】:
标签: spring spring-aop
您可以控制 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。 我已经成功编译了这段代码,但实际上并没有在运行时测试它,所以很高兴知道它是否有效。
【讨论】:
NoOpAdvices,并在需要时用所需的建议替换它们。你觉得适用吗?如何在应用程序服务器中执行此操作,我必须控制传入请求的功能方面?
Ordered 接口,它声明了 int getvalue() 方法,我可以使用它来控制 Aspect 的排序(让他们实现接口) .现在我有两个问题:1)getValue() 返回值会在初始化后在运行时修改方面行为吗? 2)如果我在一个类中应用@Service 和@Aspect 注释,@Service 实例是否与@Aspect 相同?如果没有,我如何从对象中检索对系统使用的 Aspect 实例的引用?
@Aspect注解吗?或者我应该同时使用@Aspect 和@Component?它在运行时工作吗?那么订购呢?