【发布时间】:2017-03-08 11:46:28
【问题描述】:
来自https://projects.spring.io/spring-framework/我有一个spring框架的hellpworld程序。我删除了注释@Configuration。但是程序仍然可以像以前一样运行。为什么? @Configuration 这里的角色是什么?
【问题讨论】:
标签: spring
来自https://projects.spring.io/spring-framework/我有一个spring框架的hellpworld程序。我删除了注释@Configuration。但是程序仍然可以像以前一样运行。为什么? @Configuration 这里的角色是什么?
【问题讨论】:
标签: spring
您仍然可以使用@Component 标记类,以使@Bean 实例可用于编程。当你这样做时,它被称为精简模式。在这种模式下,你不能使用 'inter-bean references' ,这意味着通过方法引用其他实例。
另一方面,带有@Configuration 类的@Bean 被包装在侧面cglib 包装器中,可以拦截对此bean 方法的任何调用,并且可以从上下文返回bean 实例。意味着您可以使用“bean 间引用”。
通常,@Bean 方法在 @Configuration 类中声明。 在这种情况下,bean 方法可能会引用其他 @Bean 方法 通过直接调用他们相同的类。这确保了参考 bean 之间是强类型和可导航的。这种所谓的 'inter-bean references' 保证尊重范围和 AOP 语义,就像 getBean() 查找一样。这些是语义 从需要的原始“Spring JavaConfig”项目中知道 每个此类配置类在运行时的 CGLIB 子类化。作为一个 因此,@Configuration 类及其工厂方法不得 在此模式下被标记为最终或私有。
@Bean 方法也可以在非类中声明 用@Configuration 注释。例如,bean 方法可能是 在 @Component 类甚至是普通的旧类中声明。在这样的 在这种情况下,@Bean 方法将以所谓的“精简”模式进行处理。
精简模式下的 Bean 方法将被视为普通工厂方法 容器(类似于 XML 中的工厂方法声明),带有 正确应用范围和生命周期回调。包含类 在这种情况下保持不变,并且没有异常约束 对于包含类或工厂方法。
与 @Configuration 中 bean 方法的语义相反 精简模式不支持类,“bean 间引用”。 相反,当一个 @Bean-method 在 lite 中调用另一个 @Bean-method 模式,调用是标准的Java方法调用;春天确实 不要通过 CGLIB 代理拦截调用。
而且, @Configuration 使您能够结合其他注释使用许多其他功能
导入其他配置 @Import(DatabaseConfig.class)
资源导入@PropertySource("classpath:config.properties")
启用组件扫描@ComponentScan(basePackages = { "com.sample.*" })
标记配置文件@Profile("production")
启用功能@Enablexxxx
【讨论】: