Spring与IOC
控制反转(IOC,Inversion of Control)是一个概念,是一种思想。是将在传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对象控制权的转移,从程序代码本身反转到外部容器。
IOC的实现方式多种多样,当前比较流行的方式有两种:依赖注入和依赖查找,其中依赖注入的方式应用更为广泛。
依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境给组件,程序代码需要提供具体的查找方式。
依赖注入:Dependebcy Injection,DI,程序代码不做定位查询,这些工作由容器自行完成。
依赖注入DI是指程序在运行的过程中,若需要调用另一个对象协助是。无需在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持POJO之间依赖关系的管理。
依赖注入是目前最优秀的解耦方式。依赖注入使得Spring的Bean之间以配置文件的形式组织在一起,而不是以硬编码的形式耦合在一起。
Spring开发实例
一、引入相关的jar包
1、导入相关的Spring的jar包:
2、导入日志相关的jar包和Junit的相关jar包:
二、新建applicationContext.xml用来当做Spring的配置文件
<?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.xsd">
</beans>
该配置和文件的内容可以通过在官网下载Spring先关jar包时可以在里面找到,路径为:
spring-framework-4.2.1.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html
三、创建相关的包结构,如下图:
四、在接口中创建相关的方法并在实现类中实现
接口中的方法为:
public interface IStudentService {
void some();
}
实现方法为:
public class IStudentServiceImpl implements IStudentService{
public void some(){
System.out.println("执行some()方法");
}
}
五、在applicationContext.xml配置文件中添加bean,用于定义实例对象,一个实例对应一个bean,代码如下:
<?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.xsd">
<!-- bean definitions here -->
<!-- id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,
Bean 与 Bean 间的依赖关系也是通过 id 属性关联的。
class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。 -->
<bean id="studentService" class="com.springdemo.ServiceImpl.IStudentServiceImpl"></bean>
</beans>
六、编写测试类
public class Test {
public static void main(String[] args) {
//获取容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象
IStudentService service = (IStudentService)context.getBean("studentService");
service.some();
}
}
小结:
如果在该例子中不适用Spring方法,那么就需要在测试类中定义IStudentServiceImpl类的对象,在将该对象实例化之后,调用相关的方法,在该例子中并没有体现出Spring的优势,但是当在具有多个类的时候,还使用传统的方法相对来说比较繁琐,而且也不符合大型工程中面向接口编程的要求。此时使用Spring的方式进行定义,可以通过ApplicationContext context来获取ClassPathXmlApplicationContext("applicationContext")中的内容,之后从容器中获取接口对象,就可以使用接口对象调用接口中定义的方法(此时的方法已经在实现类中被实现)。