三层的概念:https://developer.aliyun.com/article/1390024
一、新建一个项目
我新建好的项目名为spring__ioc_02,然后在 src-main-java 下建立三层(数据访问层、业务层和控制层)的包 dao、service 和controller、并在包下建立相应的接口和实现类
Project 只能一次有一个,我们想要让所有的项目出现在一列,就需要在现有 Project 基础上 New-Module
然后 next
Parent 改为 <None>;删掉我们依赖建立的目录 \Demo001\,若不删,新项目就会建立在 \Demo001\ 下,称为项目 Demo001 的子项目
然后 finish 即创建成功
(一)创建三层(控制层、业务层和数据访问层)对应的包,包下建立相应的接口和实现类
1、控制层
紫色为包名、绿色为接口名
package com.apesource.controller;
public interface IUserController {
//定义方法
public void save();
}
创建实现类
package com.apesource.controller;
//UserControllerImp 实现 IUserController 接口并重写方法
public class UserControllerImp implements IUserController{
@Override
public void save() {
System.out.println("==========Controller层的新增方法=========");
}
}
2、业务层
把 .controller 删掉写成 .service,就成功建立与 Controller 同级的包 service
同 Controller 步骤创建接口和实现类
package com.apesource.service;
public interface IUserService {
public void save();
}
package com.apesource.service;
public class UserServiceImp implements IUserService{
@Override
public void save() {
System.out.println("===========service层的新增方法===========");
}
}
package com.apesource.dao;
import java.sql.SQLOutput;
import java.util.SortedMap;
public interface IUserDao {
public void save();
}
package com.apesource.dao;
public class UserDaoImp implements IUserDao{
@Override
public void save() {
System.out.println("==========dao层的新增方法=========");
}
}
三层准备完毕、写测试类
(二)测试类
建一个与 Conterller 包同级的包 test,test里面建立一个 Test01 测试类
测试类不要忘了main 方法
1、高耦合方式
package com.apesource.test;
import com.apesource.controller.IUserController;
import com.apesource.controller.UserControllerImp;
import java.sql.SQLOutput;
public class Test01 {
public static void main(String[] args) {
IUserController controller=new UserControllerImp();
controller.save();
}
}
当然,dao 层为数据访问层、然后 service 层调用数据访问层,controller 层调用 service 层,所以目前的测试类执行有误,我们还需要对 service 层和controller 层做一定的处理,new 相应对象(高耦合)
package com.apesource.service;
import com.apesource.dao.IUserDao;
import com.apesource.dao.UserDaoImp;
public class UserServiceImp implements IUserService{
IUserDao dao=new UserDaoImp();
@Override
public void save() {
System.out.println("===========service层的新增方法===========");
dao.save();
}
}
package com.apesource.controller;
import com.apesource.service.IUserService;
import com.apesource.service.UserServiceImp;
public class UserControllerImp implements IUserController{
IUserService service = new UserServiceImp();
@Override
public void save() {
System.out.println("==========Controller层的新增方法=========");
service.save();
}
}
测试结果(运行成功):
2、低耦合方式
我们要实现解耦,先将 业务层和数据访问层的实现类的路径 拿出来放在 properties 文件中
dao=com.apesource.dao.UserDaoImp
service=com.apesource.service.UserServiceImp
建一个与 Conterller 包同级的包 util,util 里面建立一个 BeansFactory 工厂类,通过这个类实现解耦
package com.apesource.util;
import com.apesource.test.Test01;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class BeansFactory {
//按照用户需求以解耦的方式创建对象
public static Object getBean(String key){
try {
//1.创建工具类
Properties properties = new Properties();
//2.加载文件
InputStream inputStream =
Test01.class.getClassLoader().getResourceAsStream("beans.properties");
properties.load(inputStream);
//3.通过key获取value
String classPath = properties.getProperty(key);
return Class.forName(classPath).newInstance();
} catch (IOException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException exception) {
exception.printStackTrace();
}
return null;
}
}
package com.apesource.test;
import com.apesource.controller.IUserController;
import com.apesource.controller.UserControllerImp;
import java.sql.SQLOutput;
public class Test01 {
public static void main(String[] args) {
IUserController controller=new UserControllerImp();
controller.save();
}
}
当然,dao 层为数据访问层、然后 service 层调用数据访问层,controller 层调用 service 层,所以目前的测试类执行有误,我们还需要对 service 层和controller 层做一定的处理
package com.apesource.service;
import com.apesource.dao.IUserDao;
import com.apesource.dao.UserDaoImp;
public class UserServiceImp implements IUserService{
IUserDao dao= (IUserDao) BeansFactory.getBean("dao");
@Override
public void save() {
System.out.println("===========service层的新增方法===========");
dao.save();
}
}
package com.apesource.controller;
import com.apesource.service.IUserService;
import com.apesource.service.UserServiceImp;
public class UserControllerImp implements IUserController{
IUserService service = (IUserService) BeansFactory.getBean("service");
@Override
public void save() {
System.out.println("==========Controller层的新增方法=========");
service.save();
}
}
测试结果(运行成功):