Spring IoC 实现 - 注解方式

98 阅读3分钟

Spring IoC 注解实现概述

知识回顾:

  • xml 配置文件方式实现 IoC,本质上是在 xml 中定义 bean,告诉 Spring 要创建哪些 bean,以及 bean 的属性如何注入。

注解方式实现 IoC:

  • 用注解标记 bean。
  • 用注解标记 bean 的属性如何注入。
  • Spring 扫描代码里的注解,创建 bean,完成依赖注入。

注解方式实现 IoC 的步骤

第一步:引入 spring-context 依赖

image.png

不要选择 6.x 的版本,Spring6 不支持 JDK 8,选择 5.x 的版本。

第二步:定义类

image.png

image.png

第三步:使用注解进行标注

image.png

image.png

第四步:配置 Spring 扫描路径

image.png

第五步:从 Spring IoC 容器中获取 bean

image.png

标记 bean 的注解 @Component、@Service、@Controller、@Repository

  • @Component 注解: Spring 扫描到装饰有 @Component 注解的类,会给这个类创建 bean 并放入 Spring IoC 容器。
  • @Component 注解的 value 是 bean 的 id,如果没有配置 value,那么取类名首字母小写为 bean id。

image.png

  • @Service、@Controller、@Repository: 这三个注解上都有 @Component,这三个注解的作用跟 @Component 是一样的。
  • 区别在于这三个注解用于装饰不同层的类。 @Controller 装饰 Controller 层, @Service 用于装饰 Service层, @Repository 用于装饰 Dao 层。
  • 如果只看实际效果的话, @Component 、@Service、@Controller、@Repository 是一样的。

image.png

image.png

image.png

实现注入的注解 - @Value

@Value 用于注入简单类型的属性。可以作用在字段、方法(set方法)、参数(构造方法的参数)上。

image.png

  • @Value 作用在字段上

image.png

  • @Value 作用在 set 方法上

image.png

  • @Value 作用在构造方法的参数上

image.png

实现注入的注解 - @Autowired

@Autowired 用于注入 bean 类型的属性。可以作用在字段、set方法、构造方法的参数、构造方法上。

image.png

  • @ Autowired 作用在字段上

image.png

  • @ Autowired 作用在 set 方法上

image.png

  • @ Autowired 作用在构造方法上

image.png

  • @ Autowired 作用在构造方法的参数上

image.png

image.png

  • @Autowired 优先根据类型装配。
  • 先按照属性的类型寻找 bean,如果该类型只找到一个bean,直接装配
  • 如果该类型找到多个bean,再在这些类型匹配的 bean 之中找与属性名称匹配的,找到则装配
  • 在多个类型匹配的 bean 中找不到名称匹配的,装配失败,抛异常。
  • @Autowired 可配合 @Qualifier 使用, @Qualifier 用于指定使用装配 bean 的名称

image.png

实现注入的注解 - @Resource

  • @Resource 优先根据名称装配。名称是 @Resource 的 name,如果不配置 name,以属性名为名称。
  • 先按名称寻找 bean,找到则检查类型是否匹配,类型匹配注入,类型不匹配抛异常
  • 按照名称找不到 bean,按属性的类型寻找,若按类型只找到一个 bean 则装配,按类型找到多个则抛异常。

image.png

image.png

IoC 全注解式编程

用 Java 类替换 spring xml 配置文件

image.png

使用 AnnotationConfigApplicationContext

image.png

使用 Spring IoC 优化 Spring IoC 启示录代码

Service 层

image.png

image.png

Dao 层

image.png

工具类

image.png

Controller 层

image.png

Controller 层使用 SpringMVC,Dao 层用 Spring 集成 MyBatis,可以使代码将更加优雅。