容器-注入

问题:

在 Spring 中,用@Bean将组件添加到容器后,为什么在@Controller等组件中还需要用@Autowired自动注入一遍?

回答:

@Bean@Autowired是 Spring IoC(控制反转)机制中两个核心且互补的步骤,作用不同,缺一不可:

  1. @Bean:负责 “注册组件到容器”

    • 作用:告诉 Spring 创建指定对象,并将其放入容器中管理(相当于 “把工具放进仓库”)。
    • 例:用@Bean定义DataSource(数据库连接池),Spring 会创建该实例并保存到容器,但此时它仅存在于容器中,未被其他组件使用。
  2. @Autowired:负责 “从容器中获取并注入组件”

    • 作用:当某个组件(如@Controller@Service)需要依赖容器中的其他组件时,告诉 Spring“从容器中找一个该类型的组件,注入给我使用”(相当于 “从仓库取工具”)。
    • 例:UserController需要DataSource操作数据库,用@Autowired标注DataSource字段,Spring 会自动从容器中找到已注册的DataSource实例并注入。

总结

  • @Bean是 “存”:将组件注册到容器,作为依赖的 “提供者”;
  • @Autowired是 “取”:从容器获取依赖并注入,作为依赖的 “使用者”。
    两者结合实现组件解耦:组件无需自己创建依赖,由 Spring 统一管理和注入,这是 Spring IoC 的核心思想。

1.@Autowired

自动装配,原理:Spring调用  容器.getBean

2.@Qualifier

@Qualifier("zhangsan") //指定名字 精确指定,如果容器中有多个名字,可以指定组件名
可以指定名字自动装配

3 & 4

3.@Primary

@Primary //如果一个接口有多个实现类,使用@Primary注解,可以指定默认的实现类 (主组件)

4.@Resource

@Resource 也是自动注入

问题:@Autowired 和 @Resource 的区别?

共同点:

均用于 Spring 的依赖注入,可将容器中的 Bean 注入到目标组件中。

区别:

  1. 来源不同

    • @Autowired:Spring 框架自带(org.springframework 包)
    • @Resource:JDK 自带(javax.annotation 包,属于 Java EE 规范)
  2. 默认注入方式

    • @Autowired:默认按类型(byType) 匹配 Bean
    • @Resource:默认按名称(byName) 匹配 Bean
  3. 多 Bean 场景处理

    • @Autowired:需配合 @Qualifier 注解指定 Bean 名称
    • @Resource:可直接通过 name 属性指定 Bean 名称
  4. 支持的注入位置

    • @Autowired:支持字段、构造方法、setter 方法
    • @Resource:支持字段、setter 方法,不支持构造方法
  5. 属性差异

    • @Autowired:仅支持 required 属性(控制是否必须注入,默认 true)
    • @Resource:支持 name(指定 Bean 名)、type(指定 Bean 类型)等属性

@AutoWired //自动注入组件的,基本类型不可以注入

@Value :

  1. @Value(“字面值”):直接赋值
  2. @Value(“${key}”) :动态从配置文件中取出某一项的值
  3. @Value(“#{SpEL}”):Spring Expression Language:Spring 表达式语言
  4. 更多写法在Spring.io 官网查看
    @Value(“${key : 默认值}”)//取不到的时候是默认值

PropertySource()

说明属性来源,把指定的文件导入容器中,供我们使用
1.classpath:cat.properties  : 从自己的项目类路径下找
2.classpath*:Log4j-charsets.properties : 从所有包的类路径下找

ResourceUtils.getFile(路径)

工具类,获取文件

tmpF440.png


注入组件的方法

实验 内容 目标
实验1 @Autowired 理解自动装配
实验2 @Qualifier 理解类型/具名注入
实验3 @Primary 理解多组件注入方式
实验4 @Resource 扩展其他非Spring注解支持
实验5 setter方法注入 理解setter方法注入
实验6 构造器注入 理解构造器注入
实验7 xxxAware 理解感知接口
实验8 @Value 理解配置文件取值
实验9 SpEL 理解Spring表达式基本使用
实验10 @PropertySource 理解 properties文件注入
实验11 @Profile 理解多环境

原生方式启动ioc容器,需要配置xml文件,具体看视频,了解即可
https://www.bilibili.com/video/BV14WtLeDEit?spm_id_from=333.788.videopod.episodes&vd_source=5e4f6f78c6de6ba4386afe617a1f26be&p=33