1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > SSH框架之理解Spring的IOC反转控制DI依赖注入--入门小实例

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

时间:2024-02-01 19:53:11

相关推荐

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 #DEBUGFilelog4j.appender.DFile = org.apache.log4j.FileAppenderlog4j.appender.DFile.File = E://DEBUG.loglog4j.appender.DFile.layout = org.apache.log4j.PatternLayoutlog4j.appender.DFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%nlog4j.appender.DFile.Threshold = DEBUGlog4j.appender.DFile.Append = false#ERRORFilelog4j.appender.EFILE = org.apache.log4j.FileAppenderlog4j.appender.EFILE.File = E://ERROR.loglog4j.appender.EFILE.layout = org.apache.log4j.PatternLayoutlog4j.appender.EFILE.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%nlog4j.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="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:util="/schema/util"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd/schema/util /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类型infopublic 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在创建对象的过程中将对象依赖的属性通过配置的方式进行注入。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。