@Configuration、@Component、@Controller等
@Configuration、@Component、@Controller都属于 Spring 标识组件类的注解,核心关系是:@Component是最基础的通用注解,@Configuration和@Controller都是@Component的派生注解。
@Component:是 Spring 组件扫描的根注解,标注的类会被 Spring 容器识别并实例化为 Bean,适用于通用的组件类。@Controller:是分层架构专用注解,继承自@Component,专门标注 MVC 架构中的控制器类,Spring MVC 会识别该注解并处理请求映射(如@RequestMapping)。@Configuration:同样继承自@Component,专门标注配置类,类中可通过@Bean注解定义第三方组件或复杂逻辑的 Bean;Spring 对@Configuration类会做CGLIB 动态代理,确保@Bean方法调用时返回单例 Bean,而普通@Component类的@Bean方法则不会有此代理增强。
@Bean和@Component等
@Component标注的类本身是单例 Bean(默认作用域singleton),类中用@Bean定义的方法,生成的 Bean 作用域默认也是singleton。- 不管是在
@Component还是@Controller、@Configuration这类派生注解类中,@Bean的默认作用域都是单例,只有添加@Scope("prototype")注解,才能将对应的 Bean 设置为多例。 - 唯一的区别是
@Configuration类会被 CGLIB 代理,保证内部@Bean方法互相调用时返回单例;而@Component及派生类不会被代理,内部@Bean方法直接调用会生成新实例,但容器中管理的该 Bean 仍然是单例。