一、Spring IOC概念
IOC全称Inversion of Control,被译为控制反转。
IOC是指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建、注入。第三方框架一般是通过配置方式指定注入哪一个具体实现,从而降低了对象之间的耦合度。
IOC按实现方法不同,可以分为依赖注入DI(Dependency Injection)和依赖查找两种,Spring容器是采用DI方式实现了IOC控制,IOC是Spring框架的基础和核心;
从IOC概念来看,IOC帮我们干了两件事,一就是创建对象,二就是管理对象之间的关系。通过IOC中文的翻译,控制反转我们也更容易理解了,以前我们想要调用一个类中的方法,我们必须主动new对象,然后再调用方法。现在呢?Spring替我们把这件事干了,现在我们由主动创建对象转变为被动注入,以前的主动权在我们手里,现在主动权在Spring手里,以前我们创建的对象的硬编码转变为动态注入了,这也提高了我们程序的健壮性,降低了耦合度。我觉得这就是IOC的核心所在。
DI全称是Dependency Injection ,被译为依赖注入。
DI的基本原理就是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立关联,因此容器的工作就是创建bean时注入那些依赖关系。
IOC是一种思想,而DI是实现IOC的主要技术途径。
DI主要有两种注入方式,即Setter注入和构造器注入。
setter注入
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现setter方式的注入。
public class Hello {
public void sayHello() {
System.out.println("say hello");
}
}
public class HelloSpring {
private Hello hello;
//setter注入
public void setHello(Hello hello) {
this.hello = hello;
}
public void sayHello() {
hello.sayHello();
}
}
在applicationContext.xml中配置注入参数
//告诉Spring容器实例化Hello Bean
<bean id="hello" class="com.spring.demo.Hello"></bean>
//实例化HelloSpring时将hello通过setter方法注入到HelloSpring中
<bean id="helloSpring" class="com.spring.demo.HelloSpring">
//property表示属性,也就是成员变量
//name表示成员变量的名称
//ref表示引用,也就是将id为hello的bean作为参数注入
<property name="hello" ref="hello">
</bean>
setter注入图解
同样我们以Hello为例,演示一下Constructor(构造器)注入
public class Hello {
public void sayHello() {
System.out.println("say hello");
}
}
public class HelloSpring {
private Hello hello;
//根据规范使用有参构造必须向外界提供无参数构造
public HelloSpring(){}
//Constructor注入
public HelloSpring(Hello hello) {
this.hello = hello;
}
public void sayHello() {
hello.sayHello();
}
}
在applicationContext.xml中配置注入参数
//告诉Spring容器实例化Hello Bean
<bean id="hello" class="com.spring.demo.Hello"></bean>
//实例化HelloSpring时将hello通过Constructor注入到HelloSpring中
<bean id="helloSpring" class="com.spring.demo.HelloSpring">
//constructor-arg表示构造器参数
//index表示第几个参数,也就是参数的索引,从0开始
//ref表示引用,也就是将id为hello的bean作为参数注入
<constructor-arg index="0" ref="hello"/>
</bean>
我想通过Spring中的依赖注入我们就能知道,java中甚至是所有编程语言中规范的重要性了,如果没有遵守JavaBean规范,那么Spring就根本无法为我们工作。当然其他依赖JavaBean规范的框架也都无法为我们服务。