使用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框架来实现,那么就要替换UserJdbcDaoUserMyBatisDao,则原有的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容器中获取即可!

posted @ 2022-02-15 14:07  Charles博客  阅读(172)  评论(0编辑  收藏  举报