IOC推导概述
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
分析实现
我们使用原来的方式写一段代码测试:dao—>service—>前端
思考:现在前端传递或者调用不会变,所有操作都是我们程序猿来实现;
解决方案:前端操作,后台不变;留一个调用的接口
IOC的原型。
IOC的本质
控制反转 (inversion of Control):IOC
他是一种设计思想。 根据这个思想有实现的方式,DI : 依赖注入。
本质就是设置接口 , set方法,是一种抽象思维
反转: 从被动到主动 , 程序猿主动控制 到 被动接受 , 由编写代码,编写接口,程序具有高度配置性和动态性;
让程序的耦合性大大降低。方便模块独立:----> 微服务。解耦
IOC推导
1.在IDE中新建一个项目,关于Maven项目的创建我之前的博客有详细的步骤,在这里不再赘述,在创建好的大项目中导入junit
包,方便我们进行测试,junit
的依赖是
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
关于依赖的如何导入的详细步骤在我之前的博客中也有详细的讲解
上图所示是我创建好的项目
2.在创建完成项目后我在java目录下新建层级目录
在最下面的java目录下分别创建dao和service目录来作为整个程序的数据库和服务器部分
在test目录下的java目录下的程序相当于前端
3.在dao目录中
UserDao
接口中:
package com.westos.java.dao;
public interface UserDao {
public void getUser();
}
在impl目录下新建类来继承UserDao
package com.westos.java.dao.impl;
import com.westos.java.dao.UserDao;
public class getUser implements UserDao {
public void getUser() {
System.out.println("查找用户");
}
}
至此dao目录下文件创建完成
4.在service目录中:
新建Service
接口,这个接口的内容为:
package com.westos.java.service;
public interface Service {
public void Getuser();
}
新建impl
目录存放实体类,实体类Serviceimpl
的内容为:
package com.westos.java.service.impl;
import com.westos.java.dao.UserDao;
import com.westos.java.dao.impl.getUser;
import com.westos.java.service.Service;
public class Serviceimpl implements Service {
private UserDao userDao1;
public void Getuser() {
userDao1 = new getUser();
userDao1.getUser();
}
}
service目录编写完成
5.开始进行测试
代码为:
package com.westos.java;
import com.westos.java.service.impl.Serviceimpl;
public class Test {
@org.junit.Test
public void test(){
Serviceimpl service = new Serviceimpl();
service.Getuser();
}
}
运行测试程序
程序运行成功,这就可以看做是从前端给service层发送请求,之后service层操作数据库来查找用户的一个流程
但是存在一种情况,在dao层中有许多实体类,那么服务层该如何选择就成为了一个问题,我们在dao层的实体类目录impl目录中新建两个类而且都实现了接口UserDao
使用Oracle查找
package com.westos.java.dao.impl;
import com.westos.java.dao.UserDao;
public class getUserOracle implements UserDao {
public void getUser() {
System.out.println("使用Oracle查找");
}
}
使用MySql查找
package com.westos.java.dao.impl;
import com.westos.java.dao.UserDao;
public class getUserMysql implements UserDao {
public void getUser() {
System.out.println("使用MySql查找");
}
}
如果从前端发来的请求是使用MySql进行查找,那么我们就需要对service层的代码进行改动,改动后为:
package com.westos.java.service.impl;
import com.westos.java.dao.UserDao;
import com.westos.java.dao.impl.getUser;
import com.westos.java.service.Service;
public class Serviceimpl implements Service {
private UserDao userDao1;
public void Getuser() {
userDao1 = new getUserMysql();
userDao1.getUser();
}
}
运行结果为:
运行成功,这次改动是对service层的代码进行改动,test层也就是模拟的前端的代码没有改变
但是在实际开发中不可能因为用户的一次改动就改动服务层的代码,这样会很麻烦,我们需要将控制权交给前端,要这样做需要怎么改动代码呢?
我们需要对service层中的Serviceimpl类进行一些改动:
package com.westos.java.service.impl;
import com.westos.java.dao.UserDao;
import com.westos.java.dao.impl.getUserMysql;
import com.westos.java.service.Service;
public class Serviceimpl implements Service {
private UserDao userDao1;
public void setUserDao1(UserDao userDao){
this.userDao1 = userDao;
}
public void Getuser() {
userDao1.getUser();
}
}
对test层的测试代码也做相应的改变:
package com.westos.java;
import com.westos.java.dao.impl.getUserOracle;
import com.westos.java.service.impl.Serviceimpl;
public class Test {
@org.junit.Test
public void test(){
Serviceimpl service = new Serviceimpl();
service.setUserDao1(new getUserOracle());
service.Getuser();
}
}
运行测试程序:
通过这样,就将控制权权交给了test层也就是模拟的前端,
如果想要使用Mysql来进行查找只需要对测试层的测试代码进行改动就行,这就是IOC思想,就是实现对象创建的权利的转换