什么是SpringIOC?如何理解SpringIOC?

一、IOC简介

本文章中案例工程代码下载
IOC是inverse of control的简写,译为控制反转,是一种创建对象的思想。那什么又是控制反转呢?就是将创建对象的权力交给Spring容器,其实就是让Spring容器帮你创建对象,而你不需要在javel代码中new对象了。在没学IOC之前,在java代码中,如果你想创建类名为ClassA的对象classa,你是怎么创建对象的呢?是不是这样:

ClassA  classa=new ClassA();

但是,学了IOC之后,我们想要获取对象classa就不需要写以上语句来获取了,而是加载Spring容器,Spring容器就会创建classa对象,我们直接拿过来使用就可以了。那怎么通过IOC获取classa对象呢?请接着往下看!(本文章演示案例代码已经上传,可以到本人博客资源处下载参考学习)。

二、IOC思路

要想实现IOC控制反转,从中获取想要的对象,需要有以下条件:

  1. 想要获取对象的类或者接口和接口的实现类
  2. 创建对象的Spring容器
  3. 用来获取容器中指定对象的类的对象
  4. 用来使用从容器中获的对象的类。

解释如下:
第一,如,我们目的是想获取出类ClassA的classa,而ClassA是InterfaceA接口的实现类;
第二,那我们就需要从容器中获取,容器就是Spring配置文件xxx.xml文件,xxx.xml文件自定义是applicationContext.xml文件,也可以自定义名字,但一定得是文件;在xml文件容器中,我们需要根据规则写配置创建classa对象的代码;
第三,然后我们要加载该xml文件,用来加载Spring容器文件的类的接口是ApplicationContext接口,它有两个子实现类,分别是FileSystemXmlApplicationContextClassPathXmlApplicationContext,这两个类都可以用来加载xxx.xml文件,该文件被加载后就会创建出classa对象放在容器中等待被获;而获取方式就是通过刚刚加载xml后FileSystemXmlApplicationContext对象或lassPathXmlApplicationContext对象调用getBean()方法获取classa对象。
第四,知道如何获取classa对象后,我我们可以在其他类中获取并使用。

三、IOC实现获取对象案例操作

下面,我们用代码实现一下SpringIOC反转控制,我们现在的目的是利用IOC的方式获取类ClassA的对象classa,并使用classa对象。(ClassA是InterfaceA接口的实现类)

1.Spring工程搭建

用eclipse创建maven工程(需要在eclipse导入maven插件,eclipse中也有自带maven插件),工程名为testspringIOCDI,利用maven中的pom.xml文件导入Spring框架所需要的jar包。在pom.xml文件导包(spring、jdk):

     
   
       
       
        org.springframework
        spring-context
        5.1.6.RELEASE
       
   
   
  
  
    
       
         org.apache.maven.plugins
         maven-compiler-plugin
         
           1.8
           1.8
               
           UTF-8
         
       
     
  
2.创建Spring容器文件(即xxx.xml,这里我命名为SprinIOC.xml)

在容器文件/src/main/resources目录下建立SpringIOC.xml文件

什么是SpringIOC?如何理解SpringIOC?_第1张图片
在SpringIOC.xml中引入dtd规则(dtd规则任何java版本都适用,高版本java一般需要schema规则引入)。



   

  

SpringIOC.xml中内容解释:
什么是SpringIOC?如何理解SpringIOC?_第2张图片

3.提供javabean,即创建InterfaceA接口和其实现类ClassA

什么是SpringIOC?如何理解SpringIOC?_第3张图片

//InterfaceA接口
package testspringIOCDI.ioc;
public interface InterfaceA {
   public String getInfo();
	 public void method();
}
//创建InterfaceA的实现类ClassA
package testspringIOCDI.ioc;
public class ClassA implements InterfaceA {
	public ClassA(){}
	public String getInfo() {
		// TODO Auto-generated method stub
		return "企业管理系统模块:实现公告发布、修改、删除等操作";
	}
	 public void method(){
		 System.out.println("I'm classA");		 
	 }
}
4.在Spring容器(SpringIOC.xml)中写创建ClassA类的对象classa的配置代码



 SpringIOC
  
 

一个bean标签就是创建一个对象。

5.获取javabean(即classa对象)并使用

创建ClassA类的测试类IOCTest,用来测试获取并使用classa对象。
IOCTes类:

package testspringIOCDI.ioc;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
 * @author CenterLogo
 *create date :2019年4月25日 下午5:42:28
 */
@SuppressWarnings("unused")
public class IOCTest {
	/**
	 * Test method for {@link testspringIOCDI.ioc.ClassA#getInfo()}.
	 */
	@Test
	public void testGetInfo() {
	//通过(加载)xml容器获取上下文实例//通过规则指定xml文件
		ApplicationContext context=new FileSystemXmlApplicationContext("/src/main/resources/SpringIOC.xml");
		
		//方式一:根据xml中配置的ID获取的对象(ID唯一),返回Object需要强转类型
		InterfaceA ia=(InterfaceA) context.getBean("classa");
		System.out.println("方式一"+ia.getInfo());
		
	//方式二:根据ID,指定接口类型的类型获取对象(不需要强转类型)
		InterfaceA ia2=context.getBean("classa",InterfaceA.class);
		System.out.println("方式二:"+ia2.getInfo());
		
	//方式三:根据接口类型获取对象(xml配置只有一个实现类的情况下)
		InterfaceA ia3=context.getBean(InterfaceA.class);
		System.out.println("方式三:"+ia3.getInfo());
		context=null;//释放处理
	}
}

测试结果为:

方式一企业管理系统模块:实现公告发布、修改、删除等操作
方式二:企业管理系统模块:实现公告发布、修改、删除等操作
方式三:企业管理系统模块:实现公告发布、修改、删除等操作

是不是感觉使用IOC获取对象很很麻烦,还不如new简单?其实,你有没有发现,在这个案例里,在测试类中获取到classa对象只能看interface接口,而看不到ClassA类,这就体现了IOC的一个特点之一,即安全性强!,而且,降低了耦合,使配置和代码形成了分离。

你可能感兴趣的:(ssn框架)