(一).概念

DI,即“依赖注入”。“依赖注入”是一个过程,指的是IoC容器在创建Bean的时候,去提供运行时所依赖的资源(对象)。在上一篇博客中,我们使用了@Autowired这个注解,完成了依赖注入的操作。简单的来说,“依赖注入”指的就是“把对象取出来放到某个类的属性中”

Spring提供了三种DI的实现方式,下面一 一 介绍

(二).DI实现方式

1.属性注入

属性注入是使用@Autowired注解实现的。

可以正确注入对象

当我将@Autowired注解注释后,再运行,出错了。这是因为Spring已经将对象进行管理了,但是没有进行依赖注入,所以在调用print()方法的时候,由于没有依赖注入,所以helloRepository是null,所以就报了空指针异常

2.构造方法注入

此时,发现还可以正常运行。

当我添加了一个默认的构造方法后,发现,程序报错了。这是因为Spring在创建对象的时候,依靠的是“反射”。此时提供的两个构造方法,Spring不知道要用哪个了,然后就选择了不带参数的构造方法。由于不带参数的构造方法什么都没有干,所以就会导致helloRepository没有赋值成功,从而导致了空指针异常

当我提供了带有两个参数的构造方法,发现也是报错了。这也是因为构造方法太多了,导致Spring无法选择某个构造方法

解决方法:给构造方法加@Autowired注解,这是因为@Autowired可以指定使用的构造方法

3.Setter注入

(三).@Autowired的缺陷

当有多个StudentInfo类型的对象的时候,Spring就不知道注入哪个了,此时就会报错。

解决方式有三种

1.使用@Primary注解

使用@Primary注解,来确定默认的实现

2.使用@Qualifier注解

使用@Qualifier注解指定当前要注入的bean对象,在@Qualifier的value属性中,指定注入的bean的名称

注意:@Qualifier不能单独使用,必须配合@Autowired使用

3.使用@Resource注解

@Resource注解是按照bean的名称进行注入。通过name属性指定要注入的bean名称

(四).面试题

1.@Autowired 与 @Resource的区别

①.@Autowired是Spring独有的;@Resource是Java官方规范的
②.@Autowired默认是按照类进行注入,如果一个类有多个对象,则报错,可以配合@Qualifier来指定名称;@Resource是按照名称进行注入,如果按照名称找不到,则按照类型注入。
③.@Autowired支持构造方法注入,@Resource不能写在构造方法上
④.@Autowired(required=false)可以允许对象不存在,@Resource没有required属性,如果找不到对象,则直接报错

上图是@Autowired的装配顺序

2.Spring, Spring Boot 和Spring MVC的关系以及区别

①.Spring是底层核心基础框架

②.Spring MVC 是Spring生态下专门处理Web请求的MVC模块,属于Spring的一部分

③.Spring Boot 是基于Spring+Spring MVC 封装的快速开发脚手架,底层依旧依赖Spring核心

④.Spring为轻量级一站式企业开发框架,核心的两大功能是IoC依赖注入和AOP切面编程。原生需要大量XML/注解手动配置Bean、事务、第三方组件,可开发普通Java项目,Web项目。

⑤.Spring MVC 是Spring 内置的Web子框架,是基于MVC设置模式。核心调度器DispatcherServlet,专门处理HTTP请求,负责接口、页面请求跳转。单纯Spring MVC开发Web,仍然需要手动配置视图解析器,拦截器,Tomcat服务器等,配置繁琐

⑥.Spring Boot 是为简化Spring开发而生的脚手架,底层完全复用Spring Spring MVC。两大核心特性:Ⅰ.Starter起步依赖,一键整合MyBatis,Redis,Web等组件,不需要手动管理版本。Ⅱ.自动配置AutoConfiguration,根据以来自动装配Bean,极少XML。自动内嵌Tomcat,打包成jar直接运行,极大减少配置成本,是现在Web,微服务主流开发方案。

总结:Spring是地基,Spring MVC 是地基上盖Web页面的工具,SpringBoot是一套搭好模板,自带工具,不用手动砌砖的俗称建房套件

3.三种注入方式的优缺点

(1).属性注入

优点:简洁,方便

缺点:①只能用于IoC,如果是非IoC容器则不可用没并且只有在使用的时候才会出现“空指针异常”

           ②.不能注入一个Final修饰的属性

(2).构造方法注入

优点:①.可以注入Final修饰的属性②.注入的对象不会被修改③.依赖对象在使用前一定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在初始化阶段就会执行的方法④.通用性好,构造方法是JDK支持的,所以更换任何框架,都是适用的

缺点:注入多个对象时,代码会比较繁琐,构造器参数爆炸

(3).Setter注入

优点:方便在类实例之后,重新对该对象进行配置或者注入

缺点:①.不能注入一个Final修饰的属性②.注入对象可能会被改变,因为setter方法可能会被多次调用,就有被修改的风险

(五).修改代码

当我们介绍完了之后,就可以修改一下图书管理系统的代码了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐