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

问题描述 投票:7回答:2

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

spring
2个回答
9
投票

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

另一方面,带有@Configuration类的@Bean包含在side cglib包装器中,可以拦截对这个bean方法的任何调用,并且可以从上下文返回bean实例。意味着你可以使用'bean间引用'。

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

  1. @Configuration类中的@Bean方法

通常,@ Node方法在@Configuration类中声明。在这种情况下,bean方法可以通过直接调用它们来引用同一个类中的其他@Bean方法。这可确保bean之间的引用是强类型和可导航的。这种所谓的“bean间引用”保证尊重范围和AOP语义,就像getBean()查找一样。这些是从最初的“Spring JavaConfig”项目中已知的语义,它需要在运行时对每个这样的配置类进行CGLIB子类化。因此,在此模式下,不得将@Configuration类及其工厂方法标记为final或private。

  • @Bean Lite模式

@Bean方法也可以在未使用@Configuration注释的类中声明。例如,bean方法可以在@Component类中声明,甚至可以在普通的旧类中声明。在这种情况下,@Bean方法将在所谓的“精简”模式下处理。

lite模式中的Bean方法将被容器视为普通工厂方法(类似于XML中的工厂方法声明),并正确应用范围和生命周期回调。在这种情况下,包含类保持不变,并且包含类或工厂方法没有异常约束。

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

而且,@ Configuration使您能够结合其他注释使用许多其他功能

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

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

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

标记简介@Profile(“生产”)

启用功能@​​Enablexxxx

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


0
投票

我在没有Spring Boot的情况下使用Spring Framework 4.3.17.RELEASE。

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

AppConfig没有注释@configuration

@ComponentScan(basePackages={"tn.esprit.repository", "tn.esprit.service", "tn.esprit.conf"})
@Import(DataConf.class)
@EnableTransactionManagement
//@Transactional
public class AppConfig {

@ComponentScan@import在没有@configuration的情况下运作良好。任何解释?这是特定的4.3版本?

© www.soinside.com 2019 - 2024. All rights reserved.