aspectj 检查 Spring Boot 中损坏的层访问
Posted
技术标签:
【中文标题】aspectj 检查 Spring Boot 中损坏的层访问【英文标题】:aspectj check broken layer access in spring boot 【发布时间】:2015-02-07 22:55:36 【问题描述】:我尝试使用 aspectj 来检查架构的各个层是否损坏,例如从控制器到存储库的访问,而不使用它们之间的服务
现在这将每个方法调用标记为在 de.fhb.controller 中注释的自动装配。
但我如何才能将其限制为例如存储库?
包结构如下:
de.fhb.controller de.fhb.service de.fhb.entity 等等。我的外观是这样的
@Aspect
public class Layer
@DeclareError("within(de.fhb.controller..*) && @annotation(org.springframework.beans.factory.annotation.Autowired) " )
private static final String typeWarning = "You try to access through many layers";
存储库:
@Repository
public interface BoxRepository extends JpaRepository<Box, Long>
public List findByPrio(long prio);
以及应该通过方面检查的控制器:
@RequestMapping("/box")
@Controller
public class BoxController
@Autowired
private BoxRepository boxRepository; // negative example
@Autowired
private BoxService boxService;
@RequestMapping(value = "/")
public String list(Model model)
List boxes = boxRepository.findAll(); // negativ example
model.addAttribute("boxes", boxes);
return "box/list";
进一步了解:repository at github
【问题讨论】:
【参考方案1】:你的切入点
within(de.fhb.controller..*) &&
execution(de.fhb.repository.BoxRepository *(..))
在散文中表示:拦截包de.fhb.controller
或其返回类型为de.fhb.repository.BoxRepository
的子包中的任何方法,但在您的代码中没有这样的方法。所以你永远不会看到编译器错误。
;-)
问题更新后更新答案:
您需要拦截对带有@Repository
注解的类型的方法的调用:
within(de.fhb.controller..*) &&
call(* (@org.springframework.stereotype.Repository *).*(..))
但是为了做到这一点,您需要从 Spring AOP 切换到具有编译时编织的成熟 AspectJ,即您需要使用 AspectJ 编译器 Ajc 来编译和编织你的方面。原因是 Spring AOP 不支持 call()
切入点,但这正是您所需要的。 execution()
切入点在这里对您没有帮助,但这是唯一受 Spring AOP 等基于代理的“AOP lite”框架支持的切入点。你只需要用 AspectJ 编织这一方面,其他方面仍然可以使用 Spring AOP。但随后需要注意 AspectJ 不会拾取您的其他方面。
【讨论】:
是的,我们已经添加了成熟的 AspectJ,所以调用工作正常。谢谢!以上是关于aspectj 检查 Spring Boot 中损坏的层访问的主要内容,如果未能解决你的问题,请参考以下文章
译:在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间
如何配置 Spring Boot 应用程序以使用 aspectj 事务?
如何使用 JUnit 测试 Spring Boot aspectj 方法?
如果在 Spring Boot 项目中添加了 @EnableTransactionManagement,则 @Aspectj 日志记录问题