概述
文章目录
- 一、什么是依赖注入?
- 1、类的关系
- 1.1、 依赖关系(Dependency)
- 1.2、聚合(Aggregation)
- 2、关系强度
- 二、 为什么使用依赖注入?
- 1、开闭原则
- 1.1、定义
- 1.2、 开闭原则优点
- 2、高内聚,低耦合
- 三、 依赖注入的方式
- 1、通过 Set 方法注入
- 1.1、 配置文件
- 1.2、 Bean 对象
- 2、通过构造方法注入
- 2.1、 配置文件
- 2.2、 Bean 对象
- 3、自动注入
- 3.1、 局部自动注入
- 3.2、 全局自动注入
- 四、 依赖注入的数据类型
- 1、注入 Bean 对象
- 2、注入基本数据类型和字符串
- 3、注入 List
- 4、注入 Set
- 5、注入 Map
- 6、注入 Properties
一、什么是依赖注入?
DI (Dependency Injection):依赖注入是指在 Spring IOC 容器创建对象的过程中,将所依赖的对象通过配置进行注入。我们可以通过依赖注入的方式来降低对象间的耦合度。
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使对象之间的耦合越小越好。
对于 Spring IOC 容器而言我们更多的是使用它的依赖注入。 Spring 创建对象的过程叫做 IOC,创建对象时给对象属性赋值叫做 DI,所以我们可以认为 IOC 和 DI 是同一个事情。
1、类的关系
继承 实现 依赖 关联 聚合 组合
1.1、 依赖关系(Dependency)
【依赖关系】:是一种使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
1.2、聚合(Aggregation)
【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系. 聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
2、关系强度
继承 = 实现 > 组合 > 聚合 > 关联 > 依赖
二、 为什么使用依赖注入?
1、开闭原则
1.1、定义
OCP (Open Close Principle): 软件本身应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
1.2、 开闭原则优点
易扩展。开闭原则的定义就要求对扩展开放。
易维护。软件开发中,对现有代码的修改是一件很有风险的事情,符合开闭原则的设计在扩展时无需修改现有代码,规避了这个风险,大大提交了可维护性。
2、高内聚,低耦合
高内聚是指相关度比较高的部分尽可能的集中,不要分散。
低耦合就是说两个相关的模块尽可以能把依赖的部分降低到最小,不要产生强依赖。
三、 依赖注入的方式
在使用依赖注入时,如果注入的是 Bean 对象,那么要求注入的 Bean 对象与被注入的 Bean 对象都需要 Spring IOC 容器来实例化。
1、通过 Set 方法注入
需要为注入的成员变量提供 Set 方法。
1.1、 配置文件
<bean id="usersDao" class="com.bjsxt.dao.impl.UsersDaoImpl"/>
<bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
<bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl">
<property name="usersDao">
<ref bean="usersDaoMybatis"/>
</property>
</bean>
1.2、 Bean 对象
public class UsersServiceImpl implements UsersService {
private UsersDao usersDao;
public UsersDao getUsersDao() {
return usersDao;
}
public void setUsersDao(UsersDao usersDao) {
this.usersDao = usersDao;
}
public UsersServiceImpl(){
System.out.println("Init.......");
}
@Override
public void addUsers() {
usersDao.insertUsers();
//System.out.println("UsersService addUsers .....");
}
}
2、通过构造方法注入
Bean 对象中需要提供有参的构造方法
2.1、 配置文件
<bean id="usersDao" class="com.bjsxt.dao.impl.UsersDaoImpl"/>
<bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
<bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl">
<!-- 通过set方式注入-->
<!-- <property name="usersDao">-->
<!-- <ref bean="usersDaoMybatis"/>-->
<!-- </property>-->
<!-- 通过构造方法注入-->
<!-- name:根据参数名称识别参数
index:根据参数位置识别参数
type:根据参数类型识别参数-->
<constructor-arg name="usersDao" ref="usersDaoMybatis"/>
</bean>
2.2、 Bean 对象
private UsersDao usersDao;
public UsersServiceImpl(UsersDao usersDao){
this.usersDao = usersDao;
}
3、自动注入
自动注入的方式有两种,一种是全局配置自动注入,另一种是局部配置自动注入。
无论全局配置或局部单独配置,都有 5 个值可以选择:
no:当 autowire 设置为 no 的时候,Spring 就不会进行自动注入。
byName:在 Spring 容器中查找 id 与属性名相同的 bean,并进行注入。需要提供 set 方法。
byType:在 Spring 容器中查找类型与属性名的类型相同的 bean,并进行注入。需要提供 set 方法。
constructor:仍旧是使用 byName 方式,只不过注入的时候,使用构造方式进行注入。
default:全局配置的 default 相当于 no,局部的 default 表示使用全局配置设置。
3.1、 局部自动注入
通过 bean 标签中的 autowier 属性配置自动注入。
有效范围:仅针对当前 bean 标签生效。
<bean id="usersDaoMybatis" class="com.bjsxt.dao.impl.UsersDaoMybatisImpl"/>
<bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl" autowire="byType">
</bean>
3.2、 全局自动注入
通过 beans 标签中的 default-autowire 属性配置自动注入。
有效范围:配置文件中的所有 bean 标签都生效。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byType">
四、 依赖注入的数据类型
1、注入 Bean 对象
方式一:
<property name="FieldName">
<ref bean="BeanID"/>
</property>
方式二:
<property name="FieldName" ref="BeanID"/>
2、注入基本数据类型和字符串
- 方式一:
<property name="FieldName">
<value>content</value>
</property>
- 方式二:
<property name="FieldName" value="Content"/>
测试代码:
private UsersDao usersDao;
private String username;
private int userage;
·············································································
<bean id="usersService" name="name1,name2,name3" class="com.bjsxt.service.impl.UsersServiceImpl" >
<property name="usersDao" ref="usersDao"/>
<property name="username" value="Corey"/>
<property name="userage" value="20"/>
</bean>
3、注入 List
<property name="FieldName" >
<list>
<value/>或者<bean/>或者<ref/>......
</list>
</property>
测试代码:
private List<String> list;
private List<Users> users;
················································
<property name="list">
<list>
<value>value1</value>
<value>value2</value>
</list>
</property>
<property name="users">
<list>
<bean class="com.bjsxt.pojo.Users">
<property name="username" value="Corey"/>
<property name="userage" value="20"/>
</bean>
<bean class="com.bjsxt.pojo.Users">
<property name="username" value="admin"/>
<property name="userage" value="20"/>
</bean>
</list>
</property>
4、注入 Set
<property name="FieldName" >
<set>
<value/>或者<bean/>或者<ref/>......
</set>
</property>
测试代码:
private Set<Users> usersSet;
··········································
<property name="usersSet">
<set>
<bean class="com.bjsxt.pojo.Users">
<property name="username" value="Corey-set"/>
<property name="userage" value="20"/>
</bean>
<bean class="com.bjsxt.pojo.Users">
<property name="username" value="admin-set"/>
<property name="userage" value="20"/>
</bean>
</set>
</property>
5、注入 Map
- 方式一:
<property name="FieldName" >
<map>
<entry key="KeyName" value="Content"/>
</map>
</property>
测试代码:
private Map<String,String> map;
···············································
<property name="map">
<map>
<entry key="key1" value="value1"/>
<entry key="key2" value="value2"/>
</map>
</property>
- 方式二:
<bean id="users1" class="......">
<bean id="users1" class="......">
<property name="FieldName">
<map>
<entry key="key1" value-ref="users1"/>
<entry key="key2" value-ref="users2"/>
</map>
</property>
测试代码:
private Map<String,Users> usersMap;
·························································
<property name="usersMap">
<map>
<entry key="users1" value-ref="users1"/>
<entry key="users2" value-ref="users2"/>
</map>
</property>
</bean>
<bean id="users1" class="com.bjsxt.pojo.Users">
<property name="username" value="Corey-map"/>
<property name="userage" value="20"/>
</bean>
<bean id="users2" class="com.bjsxt.pojo.Users">
<property name="username" value="admin-map"/>
<property name="userage" value="20"/>
</bean>
6、注入 Properties
<property name="FieldName" >
<props>
<prop key="KeyName">Content</prop>
</props>
</property>
测试代码:
private Properties properties;
···········································
<property name="properties">
<props>
<prop key="pro1">provalue1</prop>
<prop key="pro2">provalue2</prop>
</props>
</property>
结束!!
最后
以上就是清新草莓为你收集整理的Spring_ 依赖注入 详细讲解一、什么是依赖注入?二、 为什么使用依赖注入?三、 依赖注入的方式四、 依赖注入的数据类型的全部内容,希望文章能够帮你解决Spring_ 依赖注入 详细讲解一、什么是依赖注入?二、 为什么使用依赖注入?三、 依赖注入的方式四、 依赖注入的数据类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复