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 事务?

Spring Boot- 设置拦截打印日志

如何使用 JUnit 测试 Spring Boot aspectj 方法?

Spring - 如何使用 aspectJ 缓存自调用?

如果在 Spring Boot 项目中添加了 @EnableTransactionManagement,则 @Aspectj 日志记录问题