博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring @Configuration 和 @Component 区别(精简版)
阅读量:4284 次
发布时间:2019-05-27

本文共 4039 字,大约阅读时间需要 13 分钟。

Spring @Configuration 和 @Component 区别

内部原理其实也是挺复杂的,用最简单的语言汇总以下两者的区别,只要理解的就ok了,深入了解的话可以继续搜索下其他的文档。

汇总版本

@Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

 

@Configuration 注解本质上还是 @Component,因此 <context:component-scan/> 或者 @ComponentScan 都能处理@Configuration 注解的类。

 @Configuration 注解的 bean 都已经变成了增强的类

案例描述

@Bean 注解方法执行策略

@Configuration    
public
class MyBeanConfig {
@Bean
public Country country(){
return
new Country();
}
@Bean
public UserInfo userInfo(){
return
new UserInfo(country());
}
}

特别重要!!特别重要!!--》直接调用 country() 方法返回的是同一个实例,因为注解是@Configuration增强版本类

 

但是如果是变成@Component之后,此时返回的就不是一个实例了,每次都会创建一个实例

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

@Component    
public
class MyBeanConfig {
@Bean
public Country country(){
return
new Country();
}
@Bean
public UserInfo userInfo(){
return
new UserInfo(country());
}
}

修正版本:此时也是一个实例(用@Autowired 注入)

  • 这种方式可以保证使用的同一个 Country 实例。
@Component    
public
class MyBeanConfig {
@Autowired
private Country country;
@Bean
public Country country(){
return
new Country();
}
@Bean
public UserInfo userInfo(){
return
new UserInfo(country);
}
}

===============================部分知识点=======================================

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

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

 

转载地址:http://dpdgi.baihongyu.com/

你可能感兴趣的文章
Linux应用程序在内存地址布局
查看>>
Linux应用编程之静态库和动态库
查看>>
静态链接库设计
查看>>
动态链接库设计
查看>>
文件编程之库函数方式
查看>>
与时间相关的函数编程
查看>>
Linux进程控制相关概念
查看>>
c标准中的预定义宏
查看>>
*(volatile unsigned long *) 语法
查看>>
Linux多进程程序设计
查看>>
Linux进程间通讯基础
查看>>
Linux信号通讯编程
查看>>
信号量互斥编程
查看>>
信号量同步编程
查看>>
共享内存通讯编程
查看>>
Linux消息队列通讯编程
查看>>
多进程与多线程的优缺点
查看>>
Linux多线程程序设计
查看>>
网络协议基础
查看>>
Linux网络编程模型
查看>>