什么是SpringIOC?如何理解SpringIOC? - Go语言中文社区

什么是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):

     <!-- 建立依赖 -->
   <dependencies>
       <!-- 导入spring核心jar -->
       <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.6.RELEASE</version>
       </dependency>
   </dependencies>
   
  <!-- 配置1.8jdk的环境 -->
  <build>
    <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
           <soure>1.8</soure>
           <target>1.8</target>
               <!--设置字符集 -->
           <ceEncoding>UTF-8</ceEncoding>
         </configuration>
       </plugin>
     </plugins>
  </build>
2.创建Spring容器文件(即xxx.xml,这里我命名为SprinIOC.xml)

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

窗机SpringIOC.xml的路径
在SpringIOC.xml中引入dtd规则(dtd规则任何java版本都适用,高版本java一般需要schema规则引入)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
			"https://www.springframework.org/dtd/spring-beans-2.0.dtd">
   <beans>

  </beans>

SpringIOC.xml中内容解释:
在这里插入图片描述

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

在这里插入图片描述

//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的配置代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
			"https://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
 <description>SpringIOC</description>
  <bean id="classa" class="testspringIOCDI.ioc.ClassA"></bean>
 <!--  id 唯一标识,class 提供类,必须包含无参构造,相当于 ClassA classa=new ClassA(); -->
</beans>

一个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的一个特点之一,即安全性强!,而且,降低了耦合,使配置和代码形成了分离。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40572806/article/details/89604016
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢