Spring中DI介绍
DI-Dependency Injection:依赖注入
bean对象中需要依赖一些其他组件或者对象,依赖关系由容器在运行时决定
两种方式处理依赖注入:
基于配置形式
基于注解形式
基于配置形式注入依赖
有参构造函数注入依赖
public class User {
private String name;
private UserInfo userInfo;
public User(String name,UserInfo userInfo) {
this.name = name;
this.userInfo = userInfo;
}
<bean id="user" class="com.tulun.Spring.IOC.ObjectUse.User">
<!--
通过有参构造函数实例
constructor-arg:有参构造使用改标签
name属性:表示是属性名
value属性:属性赋值,给定字符串参数,给基本引用类型/基本类型赋值
ref属性:属性赋值,给自定义对象赋值
-->
<constructor-arg name="userInfo" ref="userInfo"/>
<constructor-arg name="name" value="大哥"/>
</bean>
set方法注入依赖
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
}
bean配置:
<bean id="user1" class="com.tulun.Spring.IOC.ObjectUse.User">
<property name="name" value="hello"/>
</bean>
其他类型数据介绍
public class User {
private String name;
private UserInfo userInfo;
//list类型
private List<String> lists;
//map类型
private Map<String,String> maps;
//set类型
private Set<String> sets;
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
public void setLists(List <String> lists) {
this.lists = lists;
}
public void setMaps(Map <String, String> maps) {
this.maps = maps;
}
public void setSets(Set <String> sets) {
this.sets = sets;
}
<property name="lists" >
<!--list属性注入-->
<list >
<value>张三</value>
<value>李四</value>
</list>
</property>
<property name="maps">
<!--map类型数据注入-->
<map>
<entry key="k1" value="k11"/>
<entry key="k2" value="k22"/>
</map>
</property>
<property name="sets">
<!--set类型数据注入-->
<set>
<value>set1</value>
<value>set2</value>
</set>
</property>
基于注解形式注入依赖
@Value() //注入普通类型属性
@Autowired 注入对象类型
@Resource 注入对象类型
都是在属性上添加
@Component
public class User {
@Value("tulun") //针对普通类型的数据
private String name;
@Autowired //注入对象类型
@Resource //注入对象类型
private UserInfo userInfo;
问题:
//注入对象类型
@Autowired 和@Resource 异同点??
循环依赖的问题:
如果是使用构造函数的方式注入依赖,有可能会无法解决循环依赖的问题
解决问题:
对于会产生循环依赖的问题的这些类可以通过setter方法注入,可以解决循环依赖
DI使用Demo:
依赖注入:
通过set方法赋值:
集合类型数据赋值: