【发布时间】:2017-05-27 16:05:17
【问题描述】:
当我使用 Spring 框架时,我经常看到 2 个术语基于 java 和基于注释的配置/自动装配。
基于 Java 的配置/自动装配与基于注释的配置/自动装配不同还是两者兼而有之?
如果它们不同,你能告诉我它们之间有什么不同吗?
【问题讨论】:
标签: spring
当我使用 Spring 框架时,我经常看到 2 个术语基于 java 和基于注释的配置/自动装配。
基于 Java 的配置/自动装配与基于注释的配置/自动装配不同还是两者兼而有之?
如果它们不同,你能告诉我它们之间有什么不同吗?
【问题讨论】:
标签: spring
有两种配置 Spring 的方法。一种是为您的 Java 代码添加注释。这是基于java的,这是基于注释的,并且是自动装配的。 所以基于java和基于注解是一回事。
另一种配置Spring的方法是使用xml文件。
使用哪个是讨论的问题Xml configuration versus Annotation based configuration
【讨论】:
@Beans和注解配置@Components不是一回事
它们相似,但有细微的差别。
你可以跳过@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
【讨论】:
以下是基于注解与基于 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 的类。
【讨论】:
@Bean时,有没有什么方法可以注册一个没有new关键字的bean?
@Component 声明您的类或者您可以使用@Bean 自己创建一个实例。通过使用组件扫描,您可以告诉您的容器要查找哪些包来创建 bean。即在使用 java 配置时需要它。
@Bean 注释时,您是在告诉 spring 容器“您正在为它创建实例”。即在这种情况下,创建实例是您的责任。
基于 Java 的配置:
官方 Spring 文档是指使用带有 @Configuration 注释并包含 @Bean 方法作为“Java 配置”的 Java 类来配置您的 bean。这使您可以完全摆脱应用程序中的所有 XML(至少就 Spring 而言)。这种支持是在 Spring 3.0 中添加的,并且变得更加强大。
换句话说,不需要配置文件。如果您的应用程序一切正常。
基于注解的配置:
从 Spring 2.5 开始,可以使用注解来配置依赖注入。因此,您可以通过在相关类、方法或字段声明上使用注释将 bean 配置移动到组件类本身,而不是使用 XML 来描述 bean 连接。
也就是说,还有 XML 配置文件,但是 bean 连接,是使用注解配置的。
注意:注解注入在 XML 注入之前执行。因此,对于通过这两种方法连接的属性,后一种配置将覆盖前者。
注:注解连线在 Spring 容器中默认是不开启的。因此,我们可以使用基于注解的接线,我们需要在 Spring 配置文件中启用它。
【讨论】: