【问题标题】:Spring: @Bean can still work without @ConfigurationSpring:@Bean 仍然可以在没有 @Configuration 的情况下工作
【发布时间】:2017-03-08 11:46:28
【问题描述】:

来自https://projects.spring.io/spring-framework/我有一个spring框架的hellpworld程序。我删除了注释@Configuration。但是程序仍然可以像以前一样运行。为什么? @Configuration 这里的角色是什么?

【问题讨论】:

    标签: spring


    【解决方案1】:

    您仍然可以使用@Component 标记类,以使@Bean 实例可用于编程。当你这样做时,它被称为精简模式。在这种模式下,你不能使用 'inter-bean references' ,这意味着通过方法引用其他实例。

    另一方面,带有@Configuration 类的@Bean 被包装在侧面cglib 包装器中,可以拦截对此bean 方法的任何调用,并且可以从上下文返回bean 实例。意味着您可以使用“bean 间引用”。

    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 类及其工厂方法不得 在此模式下被标记为最终或私有。

    • @Bean 精简模式

    @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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2019-01-14
      • 2014-08-22
      相关资源
      最近更新 更多