今天又重新复习了一下Spring 对之前对之前一些模糊的知识点的认识更深刻了
写一篇博客来记录一下我认识中的IOC和如何在Spring中实现DI
1.什么叫做控制反转
控制反转是指一个对象A获得一个对象B的过程 由主动获得(new 关键字)变成了由IOC容器赋予(被动获得) 这个过程可以以被称为控制反转
2.控制反转的主要实现方式
控制反转主要又分为两种实现方式
- 依赖查找
- 依赖注入
依赖查找主要包括依赖拖拽和上下文依赖查找
依赖注入主要包括 构造函数方法注入、Setter方法注入、接口注入和基于注解的依赖注入
Spring 使用依赖注入实现控制反转
3.控制反转的目的
解耦
3.IOC在Spring中的实现
IOC 在Spring 中以 DI(dependency injection) 的方式实现,Spring 实现DI的常用方式有三种,setter注入,构造器注入,和其他方式注入
4.下面是演示setter注入和构造器注入的简单例子
示例类如下
public class User {
private String name;
private String id;
public User(){}
public User(String name, String id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
}
setter方式注入
<bean id="user" class="com.yan.dao.User">
<property name="name" value="zzd"/>
<property name="id" value="1234"/>
</bean>
上面的示例当仅在iOC容器中注册需要用到java类中的无参构造方法,当给类中的方法赋值就,须同时用到java类中的有set方法和无参构造
property还有很多子标签 如<array>,<list>,<set>… 见名知意 它们分别代表给数组,list集合,set集合赋值如下格式
<array/.....>
<value></value>
</array>
构造器注入
构造器注入似乎又分为有参构造器注入和无参构造器注入,但无参构造器注入好像没办法单独注册属性值
通过参数的索引注入
<bean id="user" class="com.yan.dao.User">
<constructor-arg index="0" value="z"/>
<constructor-arg index="1" value="1234"/>
</bean>
通过参数的名字注入
<bean id="user" class="com.yan.dao.User">
<constructor-arg name="name" value="z"/>
<constructor-arg name="id" value="12345"/>
</bean>
通过参数的顺序注入
<bean id="user" class="com.yan.dao.User">
<constructor-arg type="java.lang.String" value="z"/>
<constructor-arg type="java.lang.String" value="1231"/>
</bean>
ps:这种注入方式当存在多个参数时或根据注入时的顺序和参数的位置一一对应来赋值 上面那种xml 会产生 (name=z,id=1231) 当我将其颠倒顺序结果就会不一样了
<bean id="user" class="com.yan.dao.User">
<constructor-arg type="java.lang.String" value="1231"/>
<constructor-arg type="java.lang.String" value="z"/>
</bean>
上面那种的结果会变成(name=1231,id=z)
其他注入方式
此外还又使用注解注入和其他的引入外部约束的方式(例如p命名空间 c命名空间)