![Spring MVC+MyBatis开发从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/459/34061459/b_34061459.jpg)
3.4 Spring IoC的依赖注入方式
Spring通过依赖注入实现IoC,常用的依赖注入方式有三种:Setter方法依赖注入、构造方法依赖注入和注解依赖注入。
实际上,依赖注入(Dependency Injection,DI)和IoC是同一个概念,因为在ApplicationContext.xml配置文件中,Bean和Bean之间通过REF来维护的时候是相互依赖的,所以叫作依赖注入,也就是反转控制。
简而言之,在通常情况下,一个类不能完成复杂的业务处理,会有多个类一起合作完成,就会出现在一个类中调用另外一个类的方法,此时需要给依赖的对象赋值,也就是在程序运行过程中动态地给组件(成员变量)赋值,这种方式就叫作依赖注入。
3.4.1 Setter方法依赖注入
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P67_13646.jpg?sign=1739572458-Two7AGu9kXgl5QVWiQCjueaL99l0GY5Z-0-6a3f1c7d93a2338d60f5ab6034b70f5b)
Setter方法依赖注入在实际项目开发中有非常广泛的应用。Setter方法依赖注入比较直观,把需要注入的类写成属性,给它设置一个Set方法即可,实现代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P67_55422.jpg?sign=1739572458-UUadoYNyfW8VUoUdnQuMwhKfxh7uyWSo-0-94358eb0422b03abba845f6f954ad0e7)
在配置文件中将类B注入类A中,代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P67_55423.jpg?sign=1739572458-auJpn103fDbTB5WT3moX5sfoAROkCbOf-0-1163c665e5822a73a2b11ca7e0df3578)
3.4.2 构造方法依赖注入
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_13844.jpg?sign=1739572458-s1PDn4zY890yQwQjJmr4lmK7DKfHlMDH-0-a349339fd9a99d00f9ad243ad4812f86)
与Setter方法依赖注入类似,构造方法依赖注入时,首先把需要注入的类写成属性,然后使用构造方法进行依赖注入,实现代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_55425.jpg?sign=1739572458-NIQr3k6SiCz8qggEPobrzkYFxBMF4ssL-0-93d9bd27292d8eeff3d376c746ef7a35)
在配置文件中进行配置,代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_55426.jpg?sign=1739572458-3xDnW1CB24vlFs47X4PwvsXkCy1JtTmF-0-67a8f2f922571b33974f07324100bf38)
3.4.3 注解依赖注入
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_13845.jpg?sign=1739572458-4RM3j5SVWAgVW9y0pWyjwQBHj1GJB16d-0-ea6fef6632727ebc065330e75d4dbb41)
常用的注解依赖注入方式有Autowired、Required、Qualifier、Resource、Configuration和Bean等。
1. Autowired
Autowired:自动按照类型注入。类型不唯一时,会将属性名作为Bean的ID在容器中查找。
代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_55427.jpg?sign=1739572458-nfBjR7HLGzNJIG82n4XiRweL87ZAIyRG-0-a32de4ee53abd31926f80e3f92ee0a02)
配置文件的代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P68_55428.jpg?sign=1739572458-KvBKdm35SUL64Vyhj0NFZNZHHQ07GuaF-0-0c1a77958dc10f366b51ab2e00176868)
2. Required
Required:应用于Bean属性的Setter方法。如果要使用该注解依赖注入方式,那么该注解的属性必须在配置文件中设置,否则容器会抛出一个BeanlnitializationException异常。
代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P69_55430.jpg?sign=1739572458-VG5l2ySYENrbKoUQfFkBRjBqJ2QSD5aa-0-8ce9655447c986d3951caf31fb52686c)
3. Qualifier和Resource
Qualifier:在按照类型注入的基础上,再按照Bean的ID注入。Qualifier在给类成员注入数据时,不能独立使用,但是在给方法的形参注入数据时可以独立使用。属性Value用于指定Bean的ID。
这个Qualifier标识表明了哪个实现类才是我们所需要的。修改、调用代码时应添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一。
代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P69_55431.jpg?sign=1739572458-syB1dtlsS39DFocxuYofg9w7hpvr7y6e-0-6e486153416a76d5aad11744ca3e2e36)
Resource:使用属性Name指定Bean的ID,一般默认按照属性名依赖注入,如@Resource("属性名")。但如果属性名匹配不上,则使用类型依赖注入。
4. Configuration和Bean
Configuration:表示这个类可以使用Spring IoC容器作为Bean定义的来源。
Bean:返回一个对象,该对象被注册为Spring应用程序上下文中的Bean。
提示:不需要配置XML文件,直接采用注解即可。
代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P70_55432.jpg?sign=1739572458-o6mLkGGyDwfcjbsQt4GvDgFf9UOSCINA-0-7062935086fb40fc5046dfabbf5fad88)
使用类的反射获取对象,代码如下:
![](https://epubservercos.yuewen.com/20FD4C/18225432008786906/epubprivate/OEBPS/Images/Figure-P70_55433.jpg?sign=1739572458-U9H2jJbhhE00FxVeVdYZPZQWAwxPny92-0-82c4900e850c7add079db4fefc0da3c5)