三层的概念: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{@Overridepublic 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{@Overridepublic 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{@Overridepublic 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();@Overridepublic 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();@Overridepublic 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获取valueString 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");@Overridepublic 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");@Overridepublic void save() {System.out.println("==========Controller层的新增方法=========");service.save();}
}
测试结果(运行成功):