SSH框架之理解Spring的IOC反转控制&DI依赖注入--入门小实例

SSH框架之理解Spring的IOC反转控制&DI依赖注入–入门小实例

IoC反转控制的理解

1.我们在Jave EE开发时,需要分为web层、业务层、数据层,实现在web层操作业务层类,业务层操作数据层类。这个时候我们在web层创建类对象时的写法

//这样做的缺点是每当有一个业务类对象时都要为其单独创建一个Service,后期要是想要修改功能的时候要在原来写好的类里修改,并不利于扩展。
UserService userService = new UserService();

2.为了解决这个问题,我们使用了易于扩展维护的接口,通过为借口提供不同的实现类。假如将接口定义为叫声,那么实现类便可以是鸟叫,狗叫,鸭叫等等。

//这样做仍然会到哦之程序紧密的耦合,当你需要修改实现类代码时,要返回去更改源程序。
UserService userService = new UserServiceImpl();

3.因此想到了在接口和实现类中间加上一层(工厂),把他们隔离开,接口直接找工厂讨要实现类。进一步的我们将工厂和实现类接触耦合,达到不通过主动实例化实现类,而将这个控制权交给Spring框架。而实现这一步骤的途径就是通过反射和配置文件来达成的。

(图片来自传播智客 于洋)
在这里插入图片描述

IoC快速入门实例

版本: Spring3.2.0-RELEASE

项目所需的jar包

除了四个核心包,再加上需要的log4j和commons-logging。
在这里插入图片描述

1.创建一个新的web项目,导入log4j.properties.并在包下创建一个简单的接口类。

log4j.properties

log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
 
#Console  
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.layout=org.apache.log4j.TTCCLayout  
 
#DEBUGFile
log4j.appender.DFile = org.apache.log4j.FileAppender
log4j.appender.DFile.File = E://DEBUG.log
log4j.appender.DFile.layout = org.apache.log4j.PatternLayout
log4j.appender.DFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
log4j.appender.DFile.Threshold = DEBUG
log4j.appender.DFile.Append = false
 
#ERRORFile
log4j.appender.EFILE = org.apache.log4j.FileAppender
log4j.appender.EFILE.File = E://ERROR.log
log4j.appender.EFILE.layout = org.apache.log4j.PatternLayout
log4j.appender.EFILE.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
log4j.appender.EFILE.Threshold =ERROR

在这里插入图片描述

package cn.wjl.quickstart;

public interface IHelloService {

	public void sayHello();
}

在这里插入图片描述

2.创建一个实现类,用来实现刚刚的IHelloService接口。

在这里插入图片描述

创建一个测试类

在这里插入图片描述

接下来我们写使用IOC方式实现控制反转

3. 在src下配置applicationContext.xml

step1. 导入约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

Step2. 为实现类配置bean
在这里插入图片描述
Step3. 在测试类中实现
在这里插入图片描述

package cn.wjl.spring.a_quickstart;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

//测试程序
public class HelloServiceTest {
	public static void main(String[] args){
		//传统写法紧密耦合
		  IHelloService helloService = new HelloServiceImpl();
		   helloService.sayHello();
		   
		//工厂+反射+配置

		//创建工厂,实例化配置文件
		  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		//通过工厂,根据配置名称,获得实例对象
		  IHelloService helloService2 = (IHelloService)applicationContext.getBean("HelloService");
		  helloService2.sayHello();
		  
	     //控制反转:对象的创建权被反转给了Spring框架
		  
	}
}

结果:可以看到两种方式打印出来结果一致

在这里插入图片描述

DI(Dependency Injection)依赖注入

既然spring框架已经通过IoC反转控制帮我们创建了对象,那么创建的这个对象需要依赖的属性该怎么写入呢?这就是DI依赖注入的功能,它通过为bean标签设置property属性值来为IoC控制反转所创建的类注入其所依赖的属性。看下面的例子就好理解了。

传统的方式

我们在刚刚的实现类中加入一个函数,让它实现对String类型info属性的依赖,并且修改sayHello()函数,对应的显示我们写入的info。
在这里插入图片描述

package cn.wjl.quickstart;

public class HelloServiceImpl implements IHelloService {
	
	private String info;

	public void sayHello(){
		System.out.println("say hello"+info);
	}
	
	//HelloServiceImpl实例化对象依赖String类型info
	public void setInfo(String info){
		this.info = info;
	}
	
}

在这里插入图片描述
结果
在这里插入图片描述
可以看到我们不仅得需要自己手动创建实现类HelloServiceImpl的实例化对象,也得自己为其添加依赖的info参数。
我们就会想,既然Spring通过IoC帮我们配置了实现类的创建,哪实现类需要依赖的属性它能不能管管呢?
这就是DI的作用

修改applicationContext.xml文件,加入依赖属性的配置

在这里插入图片描述

对应我们在test类中测试一下

package cn.wjl.quickstart;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloServiceTest {

	public static void main(String[] args){
		//传统的接口实现方法
		HelloServiceImpl helloservice = new HelloServiceImpl();
		helloservice.setInfo("小明");
		helloservice.sayHello();
		
		//IOC控制反转方式
		//首先引入配置
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		HelloServiceImpl helloService2 = (HelloServiceImpl)applicationContext.getBean("HelloService");
		helloService2.sayHello();
		
	}
}

结果:得到了一样的输出,说明属性注入成功了

在这里插入图片描述

总结:IoC和DI的区别

IoC控制反转实际上是spring框架通过配置文件获取到了创建对象的控制权,我们可以从代码中看出,我们获取到的对象都是通过配置文件传递给我们的。而DI依赖注入是指spring在创建对象的过程中将对象依赖的属性通过配置的方式进行注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值