Spring配置类的相关注解@Configuration@Component@Bean@ComponentScan


@Configuration和@Component#

@Component想当于@Configuration#

@Configuration注解的定义:

Copy
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class )
String value() default "";
}

两者的区别#

在@Component类中使用方法或字段时不会使用CGLIB增强(及不使用代理类:调用任何方法,使用任何变量,拿到的是原始对象,后面会有例子解释)。
而在@Configuration类中使用方法或字段时则使用CGLIB创造协作对象(及使用代理:拿到的是代理对象);当调用@Bean注解的方法时它不是普通的Java语义,而是从容器中拿到由Spring生命周期管理、被Spring代理甚至依赖于其他Bean的对象引用。
在@Component中调用@Bean注解的方法和字段则是普通的Java语义,不经过CGLIB处理。

Copy
@Configuration //和使用@Component 做对比
public static class Config {
/*
使用@Component注解需要加这个,才能保证是一个实例
@Autowired
private SimpleBean simpleBean;
*/
@Bean
public SimpleBean simpleBean() {
return new SimpleBean();
}
@Bean
public SimpleBeanConsumer simpleBeanConsumer() {
return new SimpleBeanConsumer(simpleBean());
}
}

@Component注解并没有通过 cglib 来代理@Bean方法的调用

@Configuration 配置类 加载过程参考:https://www.jb51.net/article/153430.htm


@Bean#

  • @Configuration标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
  • @Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象
Copy
/*
@Configuation等价于<Beans></Beans>
@Bean等价于<Bean></Bean>
*/
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

@ComponentScan#

用于指定 Spring 在初始化容器时要扫描的包,用注解标识的类会被 Spring 自动扫描并且装入 Bean 容器中,作用和在 Spring 的 xml 配置文件中的:<context:component-scan base-package="com..."/>是一样的

posted @   编程迷悟  阅读(683)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
阅读排行:
· 一天 Star 破万的开源项目「GitHub 热点速览」
· 别再堆文档了,大模型时代知识库应该这样建
· 瞧瞧别人家的日期处理,那叫一个优雅!
· C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)
· 在Avalonia/C#中使用依赖注入过程记录
点击右上角即可分享
微信分享提示
CONTENTS