首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

@Configuration 和 @Component 的区别 ,别再瞎用了!

一句话概括就是  中所有带  注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

理解:调用类中的@Bean注解的方法,返回的是同一个示例;而调用类中的注解的方法,返回的是一个新的实例。

注意:上面说的调用,而不是从spring容器中获取! 见最下面的示例 1 及 示例 2

下面看看实现的细节。

@Configuration 注解

从定义来看, 注解本质上还是,因此  或者  都能处理注解的类。

标记的类必须符合下面的要求:

配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。

配置类不能是final 类(没法动态代理)。

配置注解通常为了通过 注解生成 Spring 容器管理的类,

配置类必须是非本地的(即不能在方法中声明,不能是 private)。

任何嵌套配置类都必须声明为static。

方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 ,也不会被特殊处理,只会作为普通的 bean)。

@Bean 注解方法执行策略

先给一个简单的示例代码:

相信大多数人第一次看到上面  中调用 时,会认为这里的 Country和上面方法返回的 Country 可能不是同一个对象,因此可能会通过下面的方式来替代这种方式:

实际上不需要这么做(后面会给出需要这样做的场景),直接调用方法返回的是同一个实例。

@Component 注解

注解并没有通过 cglib 来代理 方法的调用,因此像下面这样配置时,就是两个不同的 。

有些特殊情况下,我们不希望 被代理(代理后会变成)时,就得用 ,这种情况下,上面的写法就需要改成下面这样:

这种方式可以保证使用的同一个 Country 实例。

示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例

第一个bean类

第二个bean类

测试类 I

本测试类为一个配置类,这样启动项目是就可以看到测试效果,更加快捷;也可以使用其他方式测试见下面的测试类 II

启动项目,查看输出结果:

测试类 II

浏览器访问项目,查看结果;输入

示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。

测试代码,只需要将改为即可!其他的均不变

测试 :

控制台和浏览器展示,均符合预期!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230222A07OC800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券