依赖注入是时下最流行的IoC实现方式, 依赖注入分为 接口注入(Interface Injection), Setter方法注入(Setter Injection) 构造器注入(Constructor Injection)
其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。
构造器依赖注入
构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
使用案例
1、导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.17</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.17</version>
<scope>compile</scope>
</dependency>
2、创建实体类
package com.walker.spring.entity;
public class ConstructorEntity {
private String name;
private String age;
public ConstructorEntity(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
3、beans.xml
<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- constructor-arg:构造参数
index:索引,代表第几个参数
value:值-->
<bean id="constructorEntity" class="com.walker.spring.entity.ConstructorEntity">
<constructor-arg index="0" value="walker aaaa"/>
<constructor-arg index="1" value="20"/>
</bean>
</beans>
4、编写测试方法并执行
public void testConstructor(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ConstructorEntity constructorEntity = (ConstructorEntity) context.getBean("constructorEntity");
System.out.println(constructorEntity.getName());
System.out.println(constructorEntity.getAge());
}
之后再main方法中执行 返回结果:
walker aaaa
20
Setter方法注入
Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
使用案例
1、导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.17</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.17</version>
<scope>compile</scope>
</dependency>
2、创建实体类
package com.walker.spring.entity;
import lombok.Data;
public class TestEntity {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3、创建beans.xml
<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--id:容器的id 可以自定义
class: 实体类的全路径
property:属性-->
<bean id="testEntity" class="com.walker.spring.entity.TestEntity">
<property name="name" value="Hello World!" />
<property name="age" value="18"/>
</bean>
</beans>
4、测试
package com.walker.spring;
import com.walker.spring.entity.TestEntity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
TestEntity testEntity = (TestEntity) context.getBean("testEntity");
System.out.println(testEntity.getName());
System.out.println(testEntity.getAge());
}
}
5、返回结果
Hello World!
18
返回的结果是beans.xml中设置的
构造器依赖注入和 Setter方法注入的区别
构造函数注入 | setter注入 |
---|
没有部分注入 | 有部分注入 | 不会覆盖 setter 属性 | 会覆盖 setter 属性 | 任意修改都会创建一个新实例 | 任意修改不会创建一个新实例 | 适用于设置很多属性 | 适用于设置少量属性 |
两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。
|