当前位置: 首页 > 后端技术 > Java

为什么需要春天?这才是它解决的真正问题!

时间:2023-04-01 18:07:02 Java

目的:对比传统方式和Spring注入方式创建对象,达到解耦的目的。以Service层调用Dao层为例。方法一:传统方法1.服务层/***@author:Prannt*@description:服务层*@program:Test*/publicclassUserService{publicvoidadd(){System.out.println("serviceadd...");UserDaodao=newUserDaoImpl();dao.查询();}}2.UserDao接口/***@description:接口中只有一个抽象方法*/publicinterfaceUserDao{voidquery();}3.UserDao接口的实现类/***@description:接口的实现类,重写查询方法*/publicclassUserDaoImplimplementsUserDao{@Overridepublicvoidquery(){System.out.println("daoquery...");}}//测试公共类test{@Testpublicvoidtest1(){UserServiceservice=newUserService();服务.add();}}SpringBoot的基础就不介绍了,推荐这个实用教程:https://github.com/javastacks...测试结果:结论1:从上面的流程可以看出查询方式在UserService类中直接调用实现类。一旦实现类出现问题,UserService会立即报错,高度耦合方式二:Spring注入对象1.xml文件配置bean2.服务层importDao.UserDao;/***@author:Prannt*@description:*@program:Demo01*/publicclassUserService{publicvoidadd(){System.out.println("serviceadd...");dao.update();}//创建dao类型属性,生成对应的set方法privateUserDaodao;publicvoidsetDao(UserDaodao){this.dao=dao;}}3.UserDao接口publicinterfaceUserDao{voidupdate();}4.接口实现类publicclassUserDaoImpl实现UserDao{@Overridepublicvoidupdate(){System.out.println("Daoupdate...");}}推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...testimportService.UserService;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassTestBean{@TestpublicvoidtestBean(){ApplicationContextcontext=newClassPathXmlApplicationContext("bean2.xml");UserServiceuserService=context.getBean("userService",UserService.class);用户服务.add();}}测试结果结论2:观察上面的过程,在UserService类中,并没有直接新建实现类,而是通过在外部配置文件中注入Dao,利用“第三方文件”达到解耦的目的。总结第一种传统的创建对象的方式,就像图1中的齿轮组,如果一个齿轮出现问题,可能会影响整个齿轮组的正常运行。使用Spring注入对象就像图2中的齿轮,使用第三方xml文件使得任意两个齿轮之间没有必然联系。B档坏了,不会影响A、C、D档。齿轮组的相互依赖性降至最低。