今天在用@aspect的时候碰到一个问题,代码如下:
先定义一个@aspect的方法
package com.hexin.pettyLoan.common.aop;
import java.util.Date;
import javax.annotation.Resource;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.stereotype.Component;
import com.hexin.core.annotation.AnnotationUtil;
import com.hexin.core.annotation.RedisRead;
import com.hexin.core.util.JSONUtil;
import com.hexin.core.util.cache.ShardedRedisUtil;
@Component
@Aspect
public class AspectJRedisRead {
@Pointcut("execution(* com.hexin.pettyLoan.*.service.impl.*.*(..))")
private void pointCut(){}
public AspectJRedisRead(){
System.out.println("aaaaaa");
}
// @Resource(name="shardedRedisUtil")
// ShardedRedisUtil redisUtil;
@Before("pointCut()") //spring中Before通知
public void readBefore() {
System.out.println("readBefore:现在时间是:"+new Date());
}
@After("pointCut()") //spring中After通知
public void readAfter() {
System.out.println("readAfter:现在时间是:"+new Date());
}
@AfterReturning("pointCut()")
public void readAfterReturning(){
System.out.println("readAfterReturning:现在时间是:"+new Date());
}
@AfterThrowing("pointCut()")
public void readAfterThrowing(){
System.out.println("readAfterThrowing:现在时间是:"+new Date());
}
@Around("pointCut()") //spring中Around通知
public Object readAround(ProceedingJoinPoint joinPoint) {
Object result = null;
try {
System.out.println("readAround开始:现在时间是:"+new Date());
result = joinPoint.proceed(joinPoint.getArgs());
System.out.println("readAround结束:现在时间是:"+new Date());
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}
配置文件已加入aspectj-autoproxy 如下:
<context:annotation-config></context:annotation-config>
<!-- 启用aop -->
<aop:aspectj-autoproxy proxy-target-class="true" />
service实现类
@Service("flexkeyService")
public class FlexkeyServiceImpl implements FlexkeyService {
@Override
public String redisTest(Integer id){
return "this is from function";
}
}
controller调用
@RequestMapping("/redistest.do")
public @ResponseBody String redistest(String callback){
JsonResult result = new JsonResult();
try{
result = new JsonResult(1, null, flexkeyService.redisTest(1));
}
catch(ErrorCodeException ex){
result = new JsonResult(-1, ex.toMessage(), null);
logger.error(ex.toMessage(), ex);
}
String json =JSONUtil.toJsonpString(result, callback);
return json;
}
但是,在执行了redisTest方法的时候,它并没有去执行@After,@Around等对应的方法
请大神帮忙查查,是什么原因?
------解决思路----------------------
1. component-scan 定义了没
2. 试试 @Before("execution(* com.hexin.pettyLoan.*.service.impl.*.*(..))")
------解决思路----------------------
new JsonResult: 直接 new 的对象不行,这个时候 flexkeyService 并不是注入进来的,即使有 @Autowired 注解,这时的注解没有任何作用。
只有 Spring 生成的对象才有 AOP 功能,因为 Spring 生成的代理对象才有 AOP 功能。
------解决思路----------------------
请问在什么情况下,会切入不进去。我也遇到了这样的问题,困扰了好久了。