【Spring】 核心概念:DI 依赖注入的几种方式 [ 编程杂谈 ]
大数据男孩 文章 正文
明妃
{{nature("2022-09-12 18:38:19")}}更新setter 注入
setter 注入方式,就是 Spring 利用
对象的set 方法
,结合书写配置的规则
进行注入
对象的格式
添加 set 方法
public class NameServiceImpl implements NameService {
private NameDao nameDao;
public String name;
// 简单类型注入
public void setName(String name) {
this.name = name;
}
// 引用类型注入
public void setNameDao(NameDao nameDao) {
this.nameDao = nameDao;
}
public void save() {
System.out.println(this.name + " service save ...");
nameDao.getName();
}
}
配置文件
<!-- 管理对象 -->
<bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
<bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
<!-- 引用类型写法 -->
<property name="nameDao" ref="nameDao"/>
<!-- 简单类型写法 -->
<property name="name" value="bigdataboy"/>
</bean>
例子代码:https://pan.bigdataboy.cn/s/n8RFW
构造器 注入
构造器的输入,不外乎需要注意
参数是怎么注入的
对象格式
public class NameServiceImpl implements NameService {
public NameDao nameDao;
public String name;
// 常规写法
public NameServiceImpl(NameDao nameDao, String name) {
this.nameDao = nameDao;
this.name = name;
}
public void save() {
System.out.println(this.name + " service save ...");
nameDao.getName();
}
}
配置文件
构造器的注入,因为
解耦
,所以有几种写法
<!-- 管理对象 -->
<bean id="nameDao" class="cn.bigdataboy.dao.impl.NameDaoImpl"/>
<bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
<!-- 这里的 name 是参数名称,这样还是耦合,所以还有其他写法 -->
<constructor-arg name="nameDao" ref="nameDao"/>
<constructor-arg name="name" value="bigdataboy"/>
<!-- 通过类型匹配 -->
<!-- <constructor-arg type="cn.bigdataboy.dao.NameDao" ref="nameDao"/>-->
<!-- <constructor-arg type="java.lang.String" value="bigdataboy"/>-->
<!-- 通过索引(参数位置) -->
<!-- <constructor-arg index="0" ref="nameDao"/>-->
<!-- <constructor-arg index="1" value="bigdataboy"/>-->
</bean>
例子代码:https://pan.bigdataboy.cn/s/XmVTK
依赖自动装配
要实现自动,那肯定是需要写法规范,不然框架也不知道你要怎么装
- 自动装配是利用 set 方法实现的。
- 自动装配
只能
对引用类型进行装配
,不能
对简单类型进行装配
。 - 自动和手动配置能
搭配使用
,自动装配的优先级小于手动
。
五种自动装配模式
byName
对象里的 set 方法的名字,需要与配置文件的 Bean id 相对应,不然会找不到。
byType
这个模式就不需要 id 和 set 对应了
例子代码:https://pan.bigdataboy.cn/s/254HZ
集合类型注入
集合类型的注入只是在配置文件的写法有区别,会有多个原素
对象的格式
public class NameServiceImpl implements NameService {
private int[] array;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties properties;
public void setArray(int[] array) {
this.array = array;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public void save() {
System.out.println("array: " + Arrays.toString(this.array));
System.out.println("list: " + this.list);
System.out.println("set: " + this.set);
System.out.println("map: " + this.map);
System.out.println("properties: " + this.properties);
}
}
配置文件
格式还是简单
<bean id="nameService" class="cn.bigdataboy.service.impl.NameServiceImpl">
<property name="array">
<array>
<value>100</value>
<value>200</value>
</array>
</property>
<property name="list">
<list>
<value>100</value>
<value>200</value>
</list>
</property>
<property name="set">
<set>
<value>100</value>
<value>200</value>
</set>
</property>
<property name="map">
<map>
<entry key="name" value="bigdataboy"></entry>
</map>
</property>
<property name="properties">
<props>
<!-- 这个有点特殊 -->
<prop key="name">bigdataboy</prop>
</props>
</property>
</bean>
例子代码:https://pan.bigdataboy.cn/s/Y4jSb
{{nature('2020-01-02 16:47:07')}} {{format('12641')}}人已阅读
{{nature('2019-12-11 20:43:10')}} {{format('9527')}}人已阅读
{{nature('2019-12-26 17:20:52')}} {{format('7573')}}人已阅读
{{nature('2019-12-26 16:03:55')}} {{format('5017')}}人已阅读
目录
标签云
一言
评论 0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}