【问题标题】:Are the Spring @PostConstruct and @PreDestroy method's annotations annotations a form of AOP?Spring @PostConstruct 和@PreDestroy 方法的注解注解是AOP 的一种形式吗?
【发布时间】:2014-11-17 11:10:48
【问题描述】:

我对 Spring @PostConstruct@PreDestroy 方法的注解有以下疑问。

所以@PostConstruct注解意味着被注解的方法是在对象创建后和使用setter方法完成依赖注入后自动执行的

@PreDestroy 在 ApplicationContext 关闭之前自动执行。

我的疑问是:@PostConstruct@PreDestroy 注释是否是 AOP 的一种形式?

【问题讨论】:

    标签: java spring aop spring-aop postconstruct


    【解决方案1】:

    两者都是 EE 规范的一部分,不是 spring。

    请参阅各自的文档 herehere 了解更多详细信息。

    【讨论】:

    • 这两个注释都被定义为 J2EE 规范的一部分。但是,Spring 允许您将这些相同的标准注释用于其自身(非 EE)目的。
    【解决方案2】:

    AOP 是一种编程范式,请参阅here。如果我正确理解您的问题,您所问的是 AOP 范围内的“@PostConstruct 和 @PreDestroy”。我的回答是 yes ,至少因为它们是使用非 OOP 的反射开发的。

    注意:

    AOP 包括支持 源代码级别的关注点模块化。

    【讨论】:

    • Tnx,我的意思是在我看来这两个注释在 AOP 范围内,因为当它执行特定事件时(在对象构造和 @PostConstruct 的 setter 注入之后和 ApplicationContext 之前为@PreDestroy 关闭)带注释的方法会自动执行。我的推理正确吗?
    【解决方案3】:

    正如 Bond 所提到的,这些是 Java EE 注释,而不是 Spring 注释 - 但是与许多注释一样,Spring 支持它们(就像 Springs @Autowired 与 EE @Inject 等一样)。

    然而,我不会说反射不是 OOP——虽然它可能违背纯粹的封装,但它是主要 OOP 语言的组成部分,这是有充分理由的。反射的使用也不意味着 AOP。

    AOP 通常用于在方法之前/之后/周围调用一些东西 - 在那里不可见的代码 - 并且通常由注释表示(如 Springs @Transactional),但也可以在其他地方声明(配置) .另一方面,@PostConstruct@PreDestroy 主要是生命周期方法,是一种将在特定时间发生的钩子——它们所做的任何事情都明确地在代码中。

    所以这里没有隐藏任何方面,绝对没有典型的 AOP 含义中的方面。唯一隐藏的是在正确的时刻调用它的魔法。但是虽然 Java 不直接支持 AOP,但不需要 AOP 库,只需要简单的反射。我怀疑有人会调用 JVM 的关闭挂钩 AOP。

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      相关资源
      最近更新 更多