在平时休闲时间做一个学习型项目练手,在练习过程中,遇到一个spring拦截器不生效的问题,拦截器代码如下:
@Aspect
// 该注解标示该类为切面类
@Component
public class LogAopAction {
@Autowired
private LogDao logDao;
@Around("execution(* com.lanyuan.service.impl.*.* (..))")
public Object logAll(ProceedingJoinPoint point) {
}
}
被拦截对象如下:
@Transactional
@Service("storeService")
public class StoreServiceImpl implements StoreService {
@Autowired
private StoreDao storeDao;
@Override
public void add(Store store) {
}
}
但是如果直接调用是拦截不到的,因为采用了@Autowired注解,这个会自动装配javabean,
所以在没有生成代理类之前,就已经进行了装配,所以注入的实例为非代理类,所以无法拦截。
解决方案:
storeService = (StoreService) SpringContextUtil.getBean("storeService");
采用spring手动方式获取实例,在需要的时候获取代理类。
还有一种是使用延迟加载方式,这个需要用到lazy注解,大家可以查查网上资料。