我刚刚在SO上发布了关于龙目岛没有生成我的getter/setter的问题.事实证明它与AspectJ相冲突.如果我禁用AspectJ,则适当地生成getter/setter.
我的猜测是ajc编译器无法识别lombok.
Lombok和AspectJ是互斥的吗?两种技术一起工作吗?
我已经将Java更新为版本"1.7.0_09-icedtea"(以前它是1.6)并获得以下消息:
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate be
an class [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error the
@annotation pointcut expression is only supported at Java 5 compliance level or above
Run Code Online (Sandbox Code Playgroud)
应用程序已使用java 1.6编译,编译器合规性级别也设置为1.6.我正在使用spring 3.1.0
有没有人能够在Java 7下使用aspectj?
以下是我的方面:
@Configurable
@Aspect
public class TimingAspect {
@Autowired
private HttpServletRequest httpServletRequest;
// Generic performance logger for any mothod
private Object logPerfomanceInfo(ProceedingJoinPoint joinPoint, String remoteAddress) {
StringBuilder tag = new StringBuilder();
if (joinPoint.getTarget() != null) {
tag.append(joinPoint.getTarget().getClass().getName());
tag.append(".");
}
tag.append(joinPoint.getSignature().getName());
StopWatch stopWatch = new StopWatch(tag.toString());
Object result = joinPoint.proceed(); // continue on the intercepted method
stopWatch.stop();
PerformanceUtils.logInPerf4jFormat(stopWatch.getStartTime(), stopWatch.getElapsedTime(), stopWatch.getTag(), stopWatch.getMessage(), remoteAddress);
return result;
}
@Around("execution(* $$$.$$$.$$$.api.controller.*.*(..))")
public Object logAroundApis(ProceedingJoinPoint joinPoint) throws Throwable {
String remoteAddress = null;
if (httpServletRequest != null) …Run Code Online (Sandbox Code Playgroud) aspectj-weaver.jar有什么作用?它的常见用途是什么?
我正在读一本关于在Spring AOP中启用AspectJ支持的书.
以下是从该书中摘录的一段:
要在Spring IoC容器中启用AspectJ注释支持,您只需在bean配置文件中定义一个空的XML元素aop:aspectj-autoproxy.然后,Spring将自动为您的AspectJ方面匹配的任何bean创建代理.
对于接口不可用或未在应用程序设计中使用的情况,可以依靠CGLIB创建代理.为了使CGLIB,你需要设置该属性
proxy-target-class=true在<aop:aspectj-autoproxy />.
我无法得到第二段.' 接口不可用 ' 是什么意思.任何人都可以用一个例子说明这一点
我正在开发一个有很多不同Maven项目的项目.我一直在对这些项目进行一系列JUnit测试,通常这很顺利.我打开Eclipse,右键单击包资源管理器 - >导入...现有的Maven项目,我可以很好地导入项目.我可以构建,深入到src/test/java ...右键单击该文件并执行Run As JUnit测试.不时,我不能让这个工作.如果我右键单击以执行运行方式,我得到的只是AspectJ/Java应用程序.没有JUnit测试.
我注意到项目文件夹旁边的图标只有一个M和一个文件夹图标,而对于有效的项目,有一个文件夹,M和一个AJ.我也注意到它似乎没有像普通的Java项目那样将文件排序到它们的包中.看起来它并没有将项目视为AspectJ项目.如何让Eclipse将这个Maven项目识别为Java项目?
我有两个不同的方面类来计算执行测试程序的非静态方法调用的数量.第一个方面计算"呼叫"连接点的方法:
pointcut methodCalls() : call (!static * test..*(..));
before(): methodCalls() {
counter.methodCallCounter();
}
Run Code Online (Sandbox Code Playgroud)
而第二个方面计算"执行"连接点的方法:
pointcut methodCalls() : execution (!static * test..*(..));
before(): methodCalls() {
counter.methodCallCounter();
}
Run Code Online (Sandbox Code Playgroud)
methodCallCounter()是计数器类中的静态方法.
小测试程序的方法调用次数是相同的.但是当我用更大的程序更改测试程序时,第二个方面类(带执行切入点)中的方法调用数量大于带有调用切入点的方面类中的方法调用数.这是合理的,因为调用连接点不会选择使用super进行的调用,因此不会对它们进行计数.
但是,我遇到了一种情况,对于程序的特定执行,具有"调用切入点"的方面类中的非静态方法调用的数量高于具有"执行切入点"的方面类中的方法调用的数量.我找不到任何解释为什么会发生这种情况.任何关于第二种情况的原因的想法都值得赞赏.
我有一个特定包的工作代码,但我想为所有控制器,服务和dao包配置它
等等...这是我的项目的基础包,有人可以帮助我如何做到这一点,以便它适用于我的网络项目的所有类,包括控制器,提前感谢...
package com.abc.xyz.utilities;
import java.util.Arrays;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect
{
private Log log = LogFactory.getLog(this.getClass());
@Pointcut("execution(* com.abc.xyz.content.service..*(..))")
protected void loggingOperation()
{
}
@Before("loggingOperation()")
@Order(1)
public void logJoinPoint(JoinPoint joinPoint)
{
log.info("Signature declaring type : " + joinPoint.getSignature().getDeclaringTypeName());
log.info("Signature name : " + joinPoint.getSignature().getName()); …Run Code Online (Sandbox Code Playgroud) 我试图使用AOP在带注释的控制器之后进行一些处理.一切都在运行,没有错误,但建议没有被执行.
这是控制器代码:
@Controller
public class HomeController {
@RequestMapping("/home.fo")
public String home(ModelMap model) {
model = new ModelMap();
return "home";
}
}
Run Code Online (Sandbox Code Playgroud)
和application-config中的设置
<aop:aspectj-autoproxy/>
<bean id="testAdvice" class="com.test.TestAdvice">
</bean>
<bean id="testAdvisor"
class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="advice" ref="testAdvice" />
<property name="expression" value="execution(* *.home(..))" />
</bean>
Run Code Online (Sandbox Code Playgroud)
和实际的建议
public class TestAdvice implements AfterReturningAdvice {
protected final Log logger = LogFactory.getLog(getClass());
public void afterReturning(Object returnValue, Method method, Object[] args,
Object target) throws Throwable {
logger.info("Called after returning advice!");
}
}
Run Code Online (Sandbox Code Playgroud)
甚至可以在带注释的控制器上提供建议吗?我使用的是Spring 2.5.
aspectj ×10
java ×7
spring ×6
aop ×3
spring-mvc ×2
dependencies ×1
eclipse ×1
jar ×1
java-7 ×1
junit ×1
logging ×1
lombok ×1
maven ×1
spring-aop ×1