首先让我注意一下,我使用AspectJ,我喜欢它,但我还能做些什么呢.
我知道AspectJ可以用于日志记录.在某些情况下,它用于事务控制 - 主要与注释一起实现.AspectJ也可以用于增强类(代码生成)方法,就像Spring Roo一样.
但我相信AspectJ和AOP一般可以用于:日志记录,事务控制和模拟部分类.
那么AspectJ和AOP的其他有用用例是什么?
我试图在Spring中使用拦截器.我想在一些方法上实现一个拦截器来处理调用这些方法时的特定逻辑.我也希望与使用Web框架分开,因为我倾向于使用Spring作为后端,没有任何标头.
搜索之后,我认为Spring方法被称为Aspects,你能提一下这方面的最佳实践吗?
迁移到Spring 2.5.x时,我发现它添加了更多的构造型注释(在2.0 的@Repository之上):@ Component,@ Service和@Controller.你怎么用它们?您是否依赖于隐式Spring支持或您定义自定义构造型特定函数/方面/功能?或者它主要用于标记bean(编译时,概念等)?
我一直在使用一个公司的代码库,该公司的策略是编写大量的跟踪日志记录.因此,几乎每个方法都有一段代码,如下所示:
String LOG_METHOD = "nameOfMethod(String,List<Long>):void";
if(logger.isTraceEnabled()) {
Object[] params = new Object[] { string, list };
logger.trace(CompanyMessages.newMethodInstanceMessage(this, LOG_METHOD, params));
}
Run Code Online (Sandbox Code Playgroud)
并以此结束(在finally
-clause中或在方法的最后:
if(logger.isTraceEnabled()) {
logger.trace(CompanyMessages.leaveMethodInstanceMessage(this, LOG_METHOD));
}
Run Code Online (Sandbox Code Playgroud)
实际上有更多的代码,但这是基本的想法.这使得代码变得混乱,其他编码人员不断地使用他们自己的解释来搞乱它,这些解释不使用CompanyMessages
格式化监视工具要读取的消息所需的特定类.所以我正在寻找一种方法来摆脱上面的所有代码,并提供所有需要跟踪记录的方法,注释如下:@LogBefore('logLevel')
&@LogAfter('logLevel')
.
我选择这个解决方案的原因是为了使其他开发人员不必学习任何新东西,而是使用注释而不是代码.我在一个服务器环境中工作,我们部署了数百个Web应用程序和数十个开发人员.所以我一直在寻找一种在Web应用程序中实现它的方法,而无需额外的编码或额外的大型库.这意味着我正在寻找一个小的,稳定的AOP实现,使用类似于我提出的注释,在每个Web应用程序中易于配置.表现也很重要.用AOP实现这个的最简单的例子是什么?
编辑:我确实找到了与我正在寻找的非常类似的东西,但这有几个问题.必须配置所有需要日志记录的类,这比仅使用注释更耗费资源.弹簧配置会<aop:aspectj-autoproxy/>
修复吗?
Omar Al Zabir正在寻找"一种更简单的AOP风格编码方式".
他创建了一个名为AspectF的框架,这是一种"将Aspects添加到代码中的流畅而简单的方法".
它不是真正的AOP,因为它不进行任何编译时或运行时编织,但它是否实现了与AOP相同的目标?
以下是AspectF用法的示例:
public void InsertCustomerTheEasyWay(string firstName, string lastName, int age,
Dictionary<string, string> attributes)
{
AspectF.Define
.Log(Logger.Writer, "Inserting customer the easy way")
.HowLong(Logger.Writer, "Starting customer insert", "Inserted customer in {1} seconds")
.Retry()
.Do(() =>
{
CustomerData data = new CustomerData();
data.Insert(firstName, lastName, age, attributes);
});
}
Run Code Online (Sandbox Code Playgroud)
以下是作者的一些帖子,进一步阐明了AspectF的目标:
根据作者的说法,我认为AspectF的设计不是AOP的替代品,而是一种实现"分离关注并保持代码良好和干净"的方法.
一些想法/问题:
在他们网站上的示例中,PostSharp有一个拦截主系统程序集中的调用的演示.我已经尝试了几次设置和复制所有拦截调用程序集我没有源代码没有成功.
我的方法是简单地将程序集级别属性放在我想要检测的命名空间和方法上.这从来没有对我有用.
就像是:
[assembly:Trace("MyCategory",AttributeTargetTypes ="My.BusinessLayer.*")]
我在这里错过了什么吗?如果我没有为其提供源,我是否可以不在程序集上对我的检测方面进行运行时注入?我以为我可以做运行时注射......
谢谢.
我目前正在用C编码,我有很多printfs,所以我可以在某些时候跟踪我的应用程序的流程.问题是有时我想要比其他人更多的细节,所以我通常花时间评论/取消注释我的C代码,所以我可以获得适当的输出.
使用Java或C#时,我通常可以使用Aspects将我的实现代码与日志记录逻辑分开.
您是否在C中使用了类似的技术来解决这个问题?
我知道我可以放置一个名为DEBUG的标志,可以打开或关闭,所以每次我想要显示或隐藏printfs时,我都不必四处寻找并注释/取消注释我的整个代码.问题是我还想摆脱代码中的日志记录逻辑.
如果用C++编写代码而不是CI,它会更好吗?
似乎有一个AspectC++,所以对于C++似乎有一个解决方案.C怎么样?
谢谢
我试图在IntelliJ IDEA中的示例项目中使用AspectJ.我有使用Spring AOP的经验,但这是我第一次使用AspectJ,并且无法使其工作.
我想按照此处的描述进行操作:https://www.jetbrains.com/help/idea/2017.1/aspectj.html
我的build.gradle:
apply plugin: 'java'
repositories
{
mavenCentral()
}
dependencies
{
compile "org.projectlombok:lombok:+"
compile "org.aspectj:aspectjrt:+"
compile "org.aspectj:aspectjweaver:+"
compile "org.aspectj:aspectjtools:+"
}
buildscript
{
repositories
{
maven
{
url "https://maven.eveoh.nl/content/repositories/releases"
}
}
dependencies
{
classpath "nl.eveoh:gradle-aspectj:+"
}
}
project.ext
{
aspectjVersion = '+'
}
apply plugin: 'aspectj'
Run Code Online (Sandbox Code Playgroud)
我的方面:
package aspects;
import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import java.util.Arrays;
@Aspect
@FieldDefaults(makeFinal = true)
public aspect LoggingAspect
{
Journal journal = Journal.INSTANCE;
pointcut all(ProceedingJoinPoint …
Run Code Online (Sandbox Code Playgroud) 我是AOP领域的新手.我第一次编写应用AOP概念的东西时,我很高兴能够理解方面如何消除应用程序中的交叉切割模式.考虑到解决交叉模式,如安全性,日志记录,交易,审计等应用AOP,我感到不知所措.
然而,当我第一次向我正在工作的客户提出使用AOP时,我被告知他们不支持它.有人告诉我,AOP意味着更多的维护!如果您的代码发生变化,您的切入点必须更改.因此,每当您更改应用它们的代码时,您可能必须分析,更改和测试您的方面?
关于这个你有什么要说的?为什么主流公司尚未开放广泛使用AOP?AOP世界在哪里?
我想要完成的是以下内容:
我有一个具有以下结构的服务器.
bin apis services etc...
我想定义一个包含服务使用方面的API.说:
@Aspect
public class AuthorizationAspect {
@Pointcut("call(* *()) && @annotation(Authorization)")
public void cutAuthorize() { }
@Before("cutAuthorize()")
public void callFromAuthorizeBefore() {
System.out.println("Test");
}
}
Run Code Online (Sandbox Code Playgroud)
然后我定义服务并使用@Authorization注释我想要的方法,并通过该方面获得切入点.
你应该知道的事情:
我的问题是,我该怎么做?如何定义我的maven工件来实现这一目标?
我注意到aspectj插件有一个weaveDependencies部分,但是这也将在服务JAR中包含该API中的所有类(我想要避免的东西).这是正确的举动吗?
提前致谢,
瑞
aspects ×10
java ×6
aop ×5
aspectj ×3
annotations ×2
c# ×2
logging ×2
spring ×2
c ×1
c++ ×1
interceptor ×1
maven ×1
postsharp ×1
stereotype ×1
trace ×1