当前位置: 首页 > news >正文

【Spirng】@Component和@Configuration和@Bean的区别

@Component,和@Component异同点

相同点:

  1. 可以标识该类实例被Spring-ioc容器管理
  2. 类中含有@Bean的方法,可以创建bean
  3. 作为配置类

不同点:

  1. @Configuration中所有带 @Bean 注解的方法都会被CGlib动态代理,因此调用该方法返回的都是同一个实例
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

@Configuration注解

     2. @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。


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

  1. 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
  2. 配置类不能是 final 类(没法动态代理)。
  3. 配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,
  4. 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
  5. 任何嵌套配置类都必须声明为static。
  6. @Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。

@Configuration 注解定义的 bean 方法中可以直接调用方法,不需要 @Autowired 注入后使用。

因为源码是直接调用CGlib动态代理的代理类,obtainBeanInstanceFromFactory 方法比较简单,就是通过 beanFactory.getBean 获取 Country,如果已经创建了就会直接返回,如果没有执行过,就会通过 invokeSuper 首次执行。

具体底层的实现原理可以去看一看这篇文章:configuration和component区别底层实现


@Bean注解

Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

  • value: name属性的别名,在不需要其他属性时使用,也就是说value 就是默认值
  • name: 此bean 的名称,或多个名称,主要的bean的名称加别名。如果未指定,则bean的名称是带注解方法的名称。如果指定了,方法的名称就会忽略,如果没有其他属性声明的话,bean的名称和别名可能通过value属性配置

相关文章:

  • 跟着江南一点雨学习springmvc(3)
  • 安卓手机使用Tasker实现应用级功能,屏幕翻译v9,翻译复制贴图
  • 一篇文章吃透 CSS3 属性: transition过渡 与 transform动画
  • 通讯录的动态版本
  • Docker搭建Kafka集群
  • WPS增加正则处理函数,简直如虎添翼
  • opencloudos容器镜像优化
  • 二.go语言条件与循环
  • 高阶函数1
  • 电子信息考研择校
  • 互联网数据管理平台
  • 本科行政管理毕业论文什么题目好写点?
  • kmp の 笔记
  • 最新网站证书提示风险的原因和几个解决方法
  • lambda表达式(C++11)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • ComponentOne 2017 V2版本正式发布
  • CSS 专业技巧
  • CSS实用技巧
  • Iterator 和 for...of 循环
  • Java-详解HashMap
  • JSONP原理
  • magento 货币换算
  • mysql外键的使用
  • Object.assign方法不能实现深复制
  • python 装饰器(一)
  • Python学习之路13-记分
  • Solarized Scheme
  • Sublime text 3 3103 注册码
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 类orAPI - 收藏集 - 掘金
  • 力扣(LeetCode)56
  • 如何用vue打造一个移动端音乐播放器
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ()、[]、{}、(())、[[]]命令替换
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (AngularJS)Angular 控制器之间通信初探
  • (arch)linux 转换文件编码格式
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)Java算法:二分查找
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)visual stdio 书签功能介绍
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET delegate 委托 、 Event 事件
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net实现头像缩放截取功能 -----转载自accp教程网