一、什么是依赖注入?
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、注入 List4、注入 Set5、注入 Map6、注入 Properties
一、什么是依赖注入?
DI (Dependency Injection):依赖注入是指在 Spring IOC 容器创建对象的过程中,将所依赖的对象通过配置进行注入。我们可以通过依赖注入的方式来降低对象间的耦合度。
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使对象之间的耦合越小越好。
对于 Spring IOC 容器而言我们更多的是使用它的依赖注入。 Spring 创建对象的过程叫做 IOC,创建对象时给对象属性赋值叫做 DI,所以我们可以认为 IOC 和 DI 是同一个事情。
继承 实现 依赖 关联 聚合 组合
1.1、 依赖关系(Dependency)【依赖关系】:是一种使用的关系, 即一个类的实现需要另一个类的协助, 所以要尽量不使用双向的互相依赖
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系. 聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
【代码体现】:成员变量
【箭头及指向】:带空心菱形的实心线,菱形指向整体
继承 = 实现 > 组合 > 聚合 > 关联 > 依赖
二、 为什么使用依赖注入? 1、开闭原则 1.1、定义OCP (Open Close Principle): 软件本身应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
1.2、 开闭原则优点易扩展。开闭原则的定义就要求对扩展开放。
易维护。软件开发中,对现有代码的修改是一件很有风险的事情,符合开闭原则的设计在扩展时无需修改现有代码,规避了这个风险,大大提交了可维护性。
高内聚是指相关度比较高的部分尽可能的集中,不要分散。
低耦合就是说两个相关的模块尽可以能把依赖的部分降低到最小,不要产生强依赖。
在使用依赖注入时,如果注入的是 Bean 对象,那么要求注入的 Bean 对象与被注入的 Bean 对象都需要 Spring IOC 容器来实例化。
1、通过 Set 方法注入需要为注入的成员变量提供 Set 方法。
1.1、 配置文件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、 配置文件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 表示使用全局配置设置。
通过 bean 标签中的 autowier 属性配置自动注入。
有效范围:仅针对当前 bean 标签生效。
3.2、 全局自动注入
通过 beans 标签中的 default-autowire 属性配置自动注入。
有效范围:配置文件中的所有 bean 标签都生效。
四、 依赖注入的数据类型 1、注入 Bean 对象
方式一:
方式二:
2、注入基本数据类型和字符串
方式一:
content
方式二:
测试代码:
private UsersDao usersDao;
private String username;
private int userage;
·············································································
3、注入 List
测试代码:
private Listlist; private List users;
················································
4、注入 Set
value1 value2
或者 或者......
测试代码:
private SetusersSet;
··········································
5、注入 Map
方式一:
测试代码:
private Mapmap;
···············································
方式二:
测试代码:
private MapusersMap;
·························································
6、注入 Properties
Content
测试代码:
private Properties properties;
···········································
provalue1 provalue2
结束!!



