ray*_*man 6 java aop design-patterns aspectj java-ee
我想向我说清楚.
我读到了AOP概念,我明白这是分享跨领域服务的好方法.(记录,安全,交易......)
但我想说/询问一下这个想法及其实施情况.
我读到有一些方法,比如AspectJ,JBOSS AOP,以便将AOP同化到我的业务逻辑中.
但很久以前不是这里的吗?
比方说,我想在我的组件(Java bean,EJB',无论如何......)之间共享一个日志记录或安全实现.
为什么我不能让Singleton bean确保它只有一个实例,只要任何组件需要它的日志/安全服务,它就会查找并使用它的服务.
为什么我需要了解并拥有所有那些"大"实现,例如aspectj或jboss AOP?我在这里想念什么?
AOP的想法是将共同逻辑保持在一个地方(你的单身解决方案也解决了这个问题)并且是"不可见的"(透明的).使用AOP,您的日志记录代码甚至不是业务逻辑的一部分,它会在后台"注入".
此外,它更具动态性 - 每次需要记录时都不需要调用单例服务.只需配置一次切入点(例如:" 此包中的所有setter "),并将对所有现有代码和新代码应用日志记录.
此外,AOP更灵活,更强大.您可以询问AOP实现:"每次调用以" save*" 开头的方法并且使用一个参数"或"如果方法返回Customer抛出异常子类化IllegalAgumentException,请再次调用该方法"时,请启动事务.
AOP不仅仅是对通用逻辑进行分组.
你还没有明白AOP是什么.AOP的想法是能够写
public void foo() {
// some business code
}
Run Code Online (Sandbox Code Playgroud)
而不是写作
public void foo() {
LogManager.getInstance().log("entering foo...");
SecurityManager.getInstance().checkUserInRole("fooer");
TransactionManager.getInstance().startTransaction();
try {
// some business code
TransactionManager.getInstance().commit();
}
catch(RuntimeException e) {
TransactionManager.getInstance().rollback();
throw e;
}
LogManager.getInstance().log("leaving foo...");
}
Run Code Online (Sandbox Code Playgroud)
所有横切关注点(日志记录,安全性,事务管理)都在业务代码之外,而不是与业务代码混合在一起,并且反复出现令人作呕的问题.