作用:用于标记一个类作为Spring的配置类,配置类可以包含@Bean注解的方法,用于定义和配置bean,作为全局配置。实例代码
@Configuration public class MyConfiguration { @Bean public Mybean mybean(){ return new Mybean*(); } }
@Bean:用于标记一个方法作为Spring的bean工厂方法。当一个方法被@Bean注解标记时,Spring会将该方法的返回值作为一个bean,并将其添加到Spring容器中。
在启动时,Spring 会扫描带有 @Configuration
注解的类,并在 Spring 容器中注册通过 @Bean
注解定义的 Bean,这些 Bean 将被作为依赖注入到其他需要的类中
Configuration注解的代理机制
定义:@Configuration
的代理机制是 Spring 框架在解析配置类时,确保通过配置类中定义的 @Bean
方法,始终返回同一个单例 Bean 的关键机制。它解决了 Spring 容器中 Bean 的重复创建问题,并确保所有依赖的组件都使用相同的实例。这种机制被称为CGLIB 代理机制。
工作流程:
-
扫描到
@Configuration
类:Spring 启动时会扫描所有标记了@Configuration
的类。@Configuration注解默认@Configuration(proxyBeanMethods=true)。 -
代理类生成:Spring 使用 CGLIB 创建该类的一个代理类,该代理类继承自原始配置类,并对所有标记了
@Bean
的方法进行增强。 -
Bean 实例缓存:当调用
@Bean
方法时,代理类会负责检查 Spring 容器中的 Bean 缓存。如果存在相应的实例,直接返回,否则调用原始的方法来创建实例。 -
确保单例:无论
@Bean
方法在其他地方被调用多少次,代理机制都会确保返回的始终是容器中的同一个实例。
Configuration与Component的区别:
-
@Configuration
是用于定义配置类的,它可以包含多个@Bean
方法;@Component
主要是标注某个类为 Spring 容器中的 Bean,但它不具备@Configuration
类的配置能力。 -
@Component
注解虽然也会将类注册为 Bean,但是它不会创建 CGLIB 代理类。因此,如果在@Component
类中使用@Bean
方法,那么这些@Bean
方法在调用时会返回不同的实例;@Configuration
则会通过代理机制,确保@Bean
方法创建的是单例。