使用Spring框架的原因/优点(面试题)
面试题:使用Spring框架的原因
Spring框架的主要作用之一就是创建对象,但是,创建对象本身是一件非常简单的事情,例如:
User user = new User();
但是,在实际开发项目时,一个项目中的类会非常多,需要创建的对象也非常多,并且,类与类之间的依赖会比较复杂,如果直接创建对象,会导致耦合度较高,不利于项目的管理和维护!
所以用Spring创建对象,会降低耦合度,耦合度低更加易于管理和维护。
依赖的举例解释:
例如以前的代码:
public class UserJdbcDao {//把数据库编程相关的内容直接写在这个方法里面,里面写JDBC方法
public void reg() {
// 通过JDBC实现插入用户数据到数据库中
}
public void login() {
// ...
}
public void changePassword() {
// ...
}
}
另外,还有:
// 处理用户注册的Servlet
public class UserRegServlet {
public UserJdbcDao userDao = new UserJdbcDao();
// 处理用户注册的方法
public void doPost() {//重写其中的doPost方法
// 将用户提交的注册信息写入到数据库中,但是,此处并不会编写JDBC相关代码,应该是调用方法来完成
userDao.reg();
}
}
在一个项目中,还可能有UserLoginServlet
用于处理用户登录,或者还有UserChangePasswordServlet
等其它Servlet类,在处理用户请求时,都会涉及到数据库相关操作,则这些Servlet类中都需要添加:
public UserJdbcDao userDao = new UserJdbcDao();
这样的代码,就可以称之为UserRegServlet
等类是依赖于UserJdbcDao
的!
如果后续需要将UserJdbcDao
换掉,例如不再使用JDBC来实现数据库编程,而是使用MyBatis框架来实现,那么就要替换UserJdbcDao
为UserMyBatisDao
,则原有的public UserJdbcDao userDao = new UserJdbcDao();
这句代码就全部都需要替换,一个项目中,可能有几十个甚至几百个Servlet中都有类似的代码,则这几十甚至几百个Servlet类的源代码都需要调整为例如:
public UserJdbcDao userDao = new UserJdbcDao();
替换为:
public UserMyBatisDao userDao = new UserMyBatisDao();
则这样的代码是不易于管理和维护的!而且随着技术进步,以后这句代码也可能会改。
那么如何解决这个问题?
1.用接口解决
为了解决这个问题,可以先声明一个接口:
public interface UserDao {
//接口内写抽象方法
void reg();
void login();
void changePassword();
}
并且,让DAO类都实现该方法,例如:
public class UserJdbcDao implements UserDao {
// 重写接口中的抽象方法
}
public class UserMyBatisDao implements UserDao {
// 重写接口中的抽象方法
}
则声明DAO的代码就可以改为:
这么写的好处是,以前左边右边都要更改,现在只改右边就行了,工作量小了一半
public UserDao userDao = new UserMyBatisDao();
//“用接口来声明,new的是实现类的对象”体现了多态,
//这也是多态的主要表现:
//1.父类来声明,new子类的对象
//2.用接口来声明,new的是实现类的对象
当存在依赖关系时,应该尽量的依赖接口,而不是依赖于某个具体的类,如果直接依赖于某个类,就是耦合度较高的表现!
耦合度低更加易于管理和维护。
把代码从耦合度高调整为耦合度低,这也是称之为解耦的表现。
2.工厂模式解决
然后,还可以使用“设计模式”中的“工厂模式”进一步优化以上代码!例如:
public class UserDaoFactory {
public static UserDao newInstance() {
return new UserJdbcDao();
}
}
则以上声明DAO的代码可以进一步调整为:
public UserDao userDao = UserDaoFactory.newInstance();
可以发现,以上代码中完全没有体现实现类的名称,后续,如果需要更换所使用的实现类,则以上代码也不需要进行任何调整!唯一需要修改的位置就只有工厂方法的返回值!
//就是改这句话就行
return new UserJdbcDao();//改成
return new UserMyBatisDao();
所以,使用接口及工厂方法,就可以有效的提高代码的管理和可维护性!
在这个过程中,起到关键作用的就是工厂类!在实际编写项目时,为每个所使用的类都创建对应的工厂是非常不现实的!而Spring框架就相当于一个庞大的万能工厂,可以由它创建任何所需的对象,当开发人员需要某个对象时,从Spring容器中获取即可!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!