@Configuration
public class MyConfig {
@Bean
public ServiceA aService(){
return new ServiceA();
}
@Bean
public ServiceB bService(){
return new ServiceB(aService());
}
}
@Configuration(proxyEnabled = false) // Lite mode, same effect as @Component
public class MyConfig {
@Bean
public ServiceA aService() {
return new ServiceA();
}
@Autowired
@Bean
public ServiceB bService(ServiceA aServiceBean){
return new ServiceB(aServiceBean);
}
}
7条答案
按热度按时间0s0u357o1#
@Configuration 指示类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些Bean生成Bean定义和服务请求
@Component表示带注解的类是“组件”。在使用基于注解的配置和类路径扫描时,此类类被视为自动检测的候选类。
@Configuration是使用@Component进行元注解的,因此@Configuration类是组件扫描的候选对象
您可以在此处查看更多信息:
http://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html
@Configuration 也是 @Component ,但 @Component 不能像 @Configuration 那样工作。
r7knjye22#
其实答案并不完整,是不是真的:
@Component表示带注解的类是“组件”。在使用基于注解的配置和类路径扫描时,此类类被视为自动检测的候选类。
但是你可以创建例如MyConfiguration.java类,然后用
@Component
构造型,并添加@Beans
声明到其中。这样它看起来就像一个配置,主要区别在于,当带有@Configuration
@Bean
注解类使用 CGLIB 代理时,在第一次调用之后,在代码中进行调用以从上下文返回bean,而不是像使用@Component和@Bean时那样再次执行方法并创建另一个示例zujrkrfu3#
它们之间有一个非常微妙的区别。让我对此提供一个非常快速的展望。
请考虑以下情况:
请注意,
ServiceB
bean依赖于ServiceA
,这不是自动连接的。相反,它的编写方式意味着创建了一个新的示例,而实际上不是由Spring创建的。您,作为程序员,使用了new
关键字。因此,如果我们使用
@Configuration
,那么它使用CGLIB代理,在这种情况下,它创建一个由Spring上下文管理的单例bean。如果你多次调用它,它返回由Spring创建的同一个bean--类似于自动装配效果。然而,如果您使用
@Component
,它将不会执行此代理,并且在每次调用方法时只会返回一个新示例,而不是提供Spring托管示例。(请记住,Spring bean是由Spring容器管理的东西,作为开发人员,您的工作是将它们拉入,例如使用@Autowired
。同样的
@Component
效果也可以通过@Configuration(proxyEnabled= false)
来实现(这也被称为bean light模式处理)。因此,在light模式下,您最终会执行以下操作:Refer here for a more elaborate explanation
希望能有所帮助!编码快乐!
ckx4rj1h4#
@Configuration-它类似于beans.xml,但它是基于Java的Bean配置。这意味着使用此注解进行注解的类是配置Bean的位置,并且将成为自动检测的候选对象。在此类中,方法使用@Bean进行注解,它将返回该类的对象。
范例:
@Component-如果类未标记@Component,则无法自动连接(@Autowired)任何类。这意味着当您要使用注解自动连接任何类时,该类应使用@Component进行注解。
范例:
参考的Spring文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html
p8h8hvxi5#
默认情况下,
@Component
与@Configuration
一起导入。控制器、服务和资料档案库是子组件(与配置沿着)。它们也是自动检测的候选组件。4sup72z86#
我在@雷乌斯的答案上延伸。
1.@Configuration指示类声明一个或多个
@Bean
方法,并且可以由Spring容器处理,以在运行时为这些Bean生成Bean定义和服务请求。1.如果查看
@Configuration
类,您将看到它是用@Component
进行元注解的。@Bean
使我们能够以任何我们喜欢的方式定义依赖关系,这就是为什么@Bean
注解位于方法之上,我们手动创建一个bean对象并从该方法返回它。@Component
使我们能够快速定义依赖关系,这就是为什么@Component
位于类之上。我们只在需要的地方注入它。总的来说,这三点说明了-为了快速定义一个bean,我们可以用
@Component
来注解类。为了定义我们喜欢的bean(支持自定义需求),我们可以在一个@Configuration
注解的类中使用@Bean
来编写bean定义。dgsult0t7#
除了reos强调的差异。
@Configuration不能被@Component替换的原因如下:
不同之处在于如何处理bean间的依赖关系。有关示例的详细说明,请参考以下链接:Difference between Configuration and Component