java - Spring AOP 上下文选择切入点到底是如何工作的?

标签 java spring spring-mvc aop spring-aop

我正在学习 Spring Core 认证,我有以下疑问,试图了解 AOP 上下文选择切入点如何工作以及它的用途。

因此,在查看文档时,我读到切入点还可以选择有用的连接点上下文,而不是通过调用与特定建议关联的方法执行来表示的简单情况。

比如:

  • 当前执行的对象(代理)
  • 目标对象
  • 方法参数
  • 与方法、目标或相关的注释 论据

所以在我看来,以这种方式使用它的目的不仅仅是调用此方法时自动执行此操作,是真的吗?

现在,文档中有以下 2 个与上下文选择相关的示例(我理解起来有些困难)。

考虑以下要求:每次服务器即将启动时记录一条消息

public interface Server {
    public void start(Map input);
    public void stop();
}

在建议中,我们如何访问服务器?并绘制 map ?

1) 第一个示例:没有上下文选择:

文档上说所有需要的信息必须从JoinPoint对象获取,这样:

@Before(“execution(void example.Server.start(java.util.Map))”)
public void logServerStartup(JoinPoint jp) {
    // A 'safe' implementation would check target type
    Server server = (Server) jp.getTarget();
   // Don't assume args[0] exists
   Object[] args= jp.getArgs();
   Map map = args.length > 0 ? (Map) args[0] : new HashMap();
   logger.info( server + “ starting – params: “ + map);
}

所以我认为这意味着:每次在我的服务器上执行start()方法时,都会执行以下logServerStartup()建议方法,这是正确的吗?

现在我觉得是通过JointPoint对象提取Server信息和Map输入参数内容。

这个对象到底代表什么?它是一个 AspectJ 对象还是与 Spring AOP 对象相关?包含什么以及它如何工作?

2) 第二个示例:没有选择:

@Before(“execution(void example.Server.start(java.util.Map)) && target(server) && args(input)”)
public void logServerStartup(Server server, Map input) {
    …
}

所以在我看来,在这个切入点中,我还包含了一些包含在我的应用程序上下文中的信息,作为服务器和与关节点执行相关的输入参数(Map 对象)(当在 Server 对象上调用 start() 方法时)。

正确吗? target(server) 方法到底做什么?

你能解释一下具体是如何工作的吗?

Tnx

最佳答案

您只是在研究文档还是自己编写和测试一些代码?那会对你有很大帮助。实际上,第二个示例比第一个示例更好,因为它绑定(bind)了切入点中所需的参数,并且您可以通过建议参数轻松访问它们。不再需要通过连接点属性自行确定它们的样板代码。否则,这些示例是等效的。

即使您只使用 Spring AOP,它的语法也是 AspectJ 语法的子集,因此它使用一些 AspectJ 类。只需检查导入的包名称,您就可以轻松地看到哪些类来自 Spring,哪些类来自 AspectJ。

连接点代表的是代码中的一个位置(例如,方法执行之前或之后),可以通过切入点选择该位置,然后用于通过通知注入(inject)其他代码。

关于java - Spring AOP 上下文选择切入点到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442366/

相关文章:

java - DOM 元素对象被标识为 "instanceof"多个类 - 一次全部

java - 如何找到数组中的下一个可用插槽?

java - 如何在众多 JAR 之间分离 Spring JPA 配置?

java - Spring @Transactional 在类上与在方法上

java - 多模块maven项目: Failed to execute goal on project,无法解析项目的依赖关系,无法找到 Artifact

java - 另一个 "Can only iterate over an array or an instance of java.lang.Iterable"问题

java - 下载后文件损坏

spring - 使用 @PropertySource 注释时未解析 @Value。如何配置 PropertySourcesPlaceholderConfigurer?

java - springdoc-openapi 应用默认的全局 SecurityScheme 可能吗?

java - 在 Spring 中使用 AutoWire 时如何处理新的实现?