【问题标题】:Java-based vs annotation-based configuration/autowiring基于 Java 与基于注释的配置/自动装配
【发布时间】:2017-05-27 16:05:17
【问题描述】:

当我使用 Spring 框架时,我经常看到 2 个术语基于 java 和基于注释的配置/自动装配。

基于 Java 的配置/自动装配与基于注释的配置/自动装配不同还是两者兼而有之?

如果它们不同,你能告诉我它们之间有什么不同吗?

【问题讨论】:

标签: spring


【解决方案1】:

有两种配置 Spring 的方法。一种是为您的 Java 代码添加注释。这是基于java的,这是基于注释的,并且是自动装配的。 所以基于java和基于注解是一回事。

另一种配置Spring的方法是使用xml文件。

使用哪个是讨论的问题Xml configuration versus Annotation based configuration

【讨论】:

  • java配置@Beans和注解配置@Components不是一回事
  • 我问过 John Thompson(springframework.guru),他说“他们是一体的”。嗯。现在让我很困惑
【解决方案2】:

它们相似,但有细微的差别。

你可以跳过@Component,而不是在你的类上使用@Component注解(这是基于注解的配置),而是使用@Bean注解方法,它返回这个类的一个新实例。(这个是基于 Java 的配置)。

对于最简单的应用程序,它并没有什么不同,但它会影响诸如“查找方法注入期间的动态子类化”之类的东西,如果您在抽象方法上有 @Lookup 注释,Spring 会自动执行魔法并覆盖它抽象方法返回 @Component 带注释的 bean。

Spring 不能为引用 @Bean bean 的方法进行这种自动子类化。在这种情况下,您需要使用自己的子类手动覆盖该方法。

您可以在 Spring 参考中找到基本的代码示例。 https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-lookup-method-injection

【讨论】:

    【解决方案3】:

    以下是基于注解与基于 java 的配置之间的区别,也许它会帮助您找到答案。

    1.Xml 配置:

    a) 在基于 xml 的配置中,您可以在 xml 文件中定义 bean 定义/依赖注入/自动装配。

    b)如果你只想在你的 XML 文件中给出 bean 的定义并且为了休息,你想使用注解,那么你必须在你的 XML 文件中定义context:annotation-config

    c)如果您只想对所有内容使用注释,那么您必须在 XML 文件中定义 context:component-scan

    2.基于 Java 的配置:如果你想使用基于 Java 的配置,那么你必须在你的类上使用 @Configuration 注释,你将使用它来加载容器。现在是 bean定义,你可以做两个。

    例子-

     @Bean 
       public HelloWorld helloWorld(){
          return new HelloWorld();
       }
    

    b) @Component/@Service/@Repository/@Controller/@RestController 覆盖你想充当 bean 的类。

    【讨论】:

    • 使用 Java 配置时,@Component 注解变得不必要。将Java配置和组件扫描混合使用真的可取吗?
    • 当我们在方法上使用@Bean时,有没有什么方法可以注册一个没有new关键字的bean?
    • @JohnO'Conner,如果您使用基于 java 的配置,您仍然必须告诉 spring 容器“您要通过容器实例化哪些类”,为此您可以通过 @Component 声明您的类或者您可以使用@Bean 自己创建一个实例。通过使用组件扫描,您可以告诉您的容器要查找哪些包来创建 bean。即在使用 java 配置时需要它。
    • @NisargPatil,在使用 @Bean 注释时,您是在告诉 spring 容器“您正在为它创建实例”。即在这种情况下,创建实例是您的责任。
    • @JohnO'Conner,在类上使用“@Configuration”时,该特定类不需要“@Component”注释。 “@Configuration”是“@Component”的超集。但是你需要用'@Component'注释类,这将在'@Configuration'注释类的'@Bean'注释方法中使用。这样 Spring 将能够在 Component-Scan 期间找到它们。
    【解决方案4】:

    基于 Java 的配置:

    官方 Spring 文档是指使用带有 @Configuration 注释并包含 @Bean 方法作为“Java 配置”的 Java 类来配置您的 bean。这使您可以完全摆脱应用程序中的所有 XML(至少就 Spring 而言)。这种支持是在 Spring 3.0 中添加的,并且变得更加强大。

    Source

    换句话说,不需要配置文件。如果您的应用程序一切正常。

    基于注解的配置:

    从 Spring 2.5 开始,可以使用注解来配置依赖注入。因此,您可以通过在相关类、方法或字段声明上使用注释将 bean 配置移动到组件类本身,而不是使用 XML 来描述 bean 连接。

    Source

    也就是说,还有 XML 配置文件,但是 bean 连接,是使用注解配置的。
    注意:注解注入在 XML 注入之前执行。因此,对于通过这两种方法连接的属性,后一种配置将覆盖前者。
    注:注解连线在 Spring 容器中默认是不开启的。因此,我们可以使用基于注解的接线,我们需要在 Spring 配置文件中启用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2012-01-15
      • 1970-01-01
      • 2013-03-13
      • 2016-08-02
      • 2015-12-06
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多