【问题标题】:How exactly works Spring AOP context selecting pointcuts?Spring AOP 上下文选择切入点究竟是如何工作的?
【发布时间】:2014-12-12 11:09:34
【问题描述】:

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

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

比如:

  • 当前正在执行的对象(代理)
  • 目标对象
  • 方法参数
  • 与方法、目标或 论据

所以在我看来,它以这种方式被用来做更多的事情,而不是像在调用此方法时自动执行此操作,是真的吗?

现在在文档中有以下 2 个与 CONTEXT SELECTING 相关的示例(我有些难以理解)。

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

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

在建议中,我们如何访问Server?并映射?

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);
}

所以我认为这意味着:每次在我的 Server 上执行 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 对象)(当 start() 方法是在 Server 对象上调用)。

正确吗? target(server) 方法究竟是做什么的?

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

Tnx

【问题讨论】:

  • Andrea,您可以在 StackOverflow 上使用一个帐户吗?你似乎使用了几个。名称相同,但帐户不同。
  • opsss...对于一个错误,我认为我是使用我的其他电子邮件地址登录的!!!!现在我会回来只使用主要的!!!

标签: java spring spring-mvc aop spring-aop


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2015-02-19
    • 2016-08-13
    • 1970-01-01
    • 2019-07-09
    • 2015-06-10
    相关资源
    最近更新 更多