Spring:@Bean可以在没有@Configuration的情况下工作

23

我有一个基于Spring框架的helloworld程序,代码来自https://projects.spring.io/spring-framework/。我删除了@Configuration注解,然而程序仍能像以前一样运行。为什么?@Configuration在这里起到了什么作用?

1个回答

26
你仍然可以使用@Component标记类,使@Bean实例可供程序使用。当你这样做时,它被称为lite模式。在此模式下,你不能使用“inter-bean references”,即通过方法引用其他实例。
另一方面,带有@Configuration类的@Bean被包装在cglib包装器中,在该包装器中,对该bean方法的任何调用都可以被拦截,并且可以从上下文返回bean实例。这意味着你可以使用“inter-bean references”。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html

  1. @Configuration类中的@Bean方法

通常,@Bean方法是在@Configuration类中声明的。 在这种情况下,bean方法可以通过直接调用同一类中的其他@Bean方法来引用它们。这确保了bean之间的引用具有强类型和可导航性。这些所谓的“inter-bean references”保证遵守作用域和AOP语义,就像getBean()查找一样。这些是从原始的“Spring JavaConfig”项目中知道的语义,该项目要求在运行时对每个这样的配置类进行CGLIB子类化。因此,在此模式下,@Configuration类及其工厂方法不得标记为final或private。

  • @Bean Lite模式
@Bean方法也可以在未注解@Configuration的类中声明。例如,在@Component类或甚至普通的旧类中可以声明@Bean方法。在这种情况下,@Bean方法将以所谓的“lite”模式进行处理。 lite模式下的@Bean方法将被容器视为普通工厂方法(类似于XML中的factory-method声明),并且范围和生命周期回调将得到正确应用。在这种情况下,包含类保持不变,对于包含类或工厂方法,没有不寻常的约束。

与@Configuration类中的@Bean方法的语义相反,在lite模式下不支持“inter-bean引用”。相反,在lite模式下,当一个@Bean方法调用另一个@Bean方法时,该调用是标准的Java方法调用; Spring不通过CGLIB代理拦截调用。

除此之外,@Configuration还提供了许多其他与其他注释结合使用的功能,如:

导入其他配置@Import(DatabaseConfig.class)

资源导入@PropertySource("classpath:config.properties")

启用组件扫描@ComponentScan(basePackages = { "com.sample.*" })

标记配置文件 @Profile("production")

启用功能 @Enablexxxx

http://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接