一、DI(依赖注入)
依赖注入(Dependency Injection)
要理解DI,我们需要理解 “依赖注入”这几个字的意思,我们先简单拆分一下吧。
依赖:
- 谁的依赖?对象的依赖,就如同下文的User类,每一个用户对象,都依赖一个name属性,因为这个属性组成了这个对象的具体信息。
- 依赖谁?依赖Spring容器ApplicationContext,因为bean对象的全部创建都依赖于容器。
注入:
- 注入什么?注入值,注入到对象属性值中。
- 谁来注入的?由Spring容器来注入的。
以上是我个人简单理解,当然你也可以 简单理解成给对象的属性赋值 。
下面案例将演示使用 xml配置文件 进行基于构造器的四种依赖注入。
二、基于构造器的四种依赖注入
项目结构:
创建一个User类,有一个有参构造器。
public class User {
private String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
编写配置文件。
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 第一种(推荐):基于参数名解析,使用name属性注入 -->
<bean id="user1" class="com.shengjava.pojo.User">
<constructor-arg name="name" value="长生"/>
</bean>
<!-- 第二种:基于参数下标解析,使用index属性注入,第一个参数下标为0 -->
<bean id="user2" class="com.shengjava.pojo.User">
<constructor-arg index="0" value="长生"/>
</bean>
<!-- 第三种(不推荐):基于参数类型匹配,使用参数类型注入 -->
<bean id="user3" class="com.shengjava.pojo.User">
<constructor-arg type="java.lang.String" value="长生"/>
</bean>
<!-- 第四种:基于ref引用,使用ref属性注入 -->
<bean id="user4" class="com.shengjava.pojo.User">
<constructor-arg ref="str"/>
</bean>
<bean id="str" class="java.lang.String">
<constructor-arg type="java.lang.String" value="长生"/>
</bean>
</beans>
测试类
public class UserTest {
@Test
public static void main(String[] args) {
// create and configure beans(现在我们的对象都是Spring进行管理了,我们可以去Spring的容器ApplicationContext中获取。context:上下文、环境的意思)
ApplicationContext context = new ClassPathXmlApplicationContext("pojos.xml");
// retrieve configured instance(从上下文context中获取对象)
User user1 = context.getBean("user1", User.class);
User user2 = context.getBean("user2", User.class);
User user3 = context.getBean("user3", User.class);
User user4 = context.getBean("user4", User.class);
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
System.out.println(user4);
}
}
输出
User{name='长生'}
User{name='长生'}
User{name='长生'}
User{name='长生'}
参考官方文档:1.4.1. Dependency Injection
相关
我的该分类的其他相关文章,请点击:【Spring + Spring MVC + MyBatis】文章目录