《Spring从入门到精通》第三章 Spring基础概念

时间:2022-04-11 14:52:20

3.1 反向控制/依赖注入

3.1.1 反向控制(IOC)
反向控制是一种模式,决定着容器装配组件的方式,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
“实现必须依赖抽象,而不是抽象依赖实现”就是“反向控制的一种表现方式”,类似于面向接口编程。

3.1.2 依赖注入(DI)
Martin Fowler探究了“反向控制”的原理,提出“它们反转了哪方面的控制”的问题后,并为其起了一个新名字“依赖注入”。
含义:通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中(通过Bean)。
全称:Inversion of Control 反向控制
Dependency Injection 依赖注入

3.2 依赖注入的3种实现方式

3.2.1 接口注入(interface injection)
如果要完成依赖关系注入的对象,必须实现IBusiness接口。

public interface IBusiness{
public void createDI(DataBase db);
}

public class Business implements IBusiness{
private DataBase db;
public void createDI(DataBase db){
this.db=db;
}

public void getData(){
db.getData();
}
}

public class TestBusiness{
private Business bus=new Business();

public void getData(){
business.createDI(new OracleDataBase());
business.getData();
}
}

3.2.2 Set注入(setter injection)
用set方法注入

public class Business implements IBusiness{
private DataBase db;
public void setDataBase(DataBase db){
this.db=db;
}

public void getData(){
db.getData();
}
}

3.2.3 构造注入(constructor injection)
用构造方法注入

public class Business implements IBusiness{
private DataBase db;
public Business(DataBase db){
this.db=db;
}

public void getData(){
db.getData();
}
}

3.3将HelloWorld示例改为构造注入方式实现

3.3.1 修改HelloWorld.java
3.3.2 修改config.xml

<beans>
<!--定义一个Bean -->
<bean id="HelloWorld" class="com.gc.action.HelloWorld">
<constructor-arg index="0">
<value>HelloWorld
</value>
</constructor-arg>
</bean>
</beans>
  • constructor-arg 用来表示是通过构造方式来注入参数的。
  • index=”0” 表示是构造方法中的第一个参数,如果只有一个参数,可省略

3.3.3 编写测试程序TestHelloWorld.java
3.3.4 运行测试程序并查看输出结果

3.4 使用哪种注入方式

在对象建立时就准备好所有的资源,使用构造注入;在对象建立好后,使用set注入来进行设定。

  • 构造注入在生成实例时把实例与参数之间的依赖关系一同建立。如果参数很多,不便记忆。
  • set有明确的名称

3.5 小结

spring的核心是个IOC容器,用户可以用构造注入或set注入的方式来实现自己的业务对象。