Spring的理念

Spring起航

为降低开发的复杂性,Spring采用了如下四种关键策略

  • 基于POJO的轻量级和最小侵入性编程
    在使用Spring的过程中,只需要将组件声明为POJO并为之加上特定的Spring注解(Spring的侵入性也仅限于此)就可以轻松使用,而无需实现特定的接口或者方法,或者遵循特定的模板规约。
  • 通过依赖注入和面向接口编程实现松耦合
    一个实际的应用,一般都会有多个类组成,这些类通过相互协作来完成特定个功能逻辑。按照传统做法(不考虑设计模式相关内容),每个对象负责管理与自己相互协作的对象(即它所依赖的对象),这会导致代码高度耦合和难以测试。耦合具有两面性(two-headed beast),一方面,紧耦合的代码难以测试、复用和扩展;另一方面耦合又是必须的,没有耦合的代码什么也做不了。结论:耦合是必须的,但必须小心管理。
    通过DI(依赖注入),对象的依赖关系将由系统中负责协调各个对象的第三方组件在创建对象时进行设定,对象自身无需管理他们之间的关系,只需要进行依赖声明即可。Spring通过应用上下文(ApplicationContext)装载Bean的定义,并把他们组装起来。Spring应用上下文全权负责对象的创建和组装。总之Spring通过DI来实现各个组件之间的松耦合
  • 通过AOP和惯例进行声明式编程
    Spring通过AOP允许你把分散在应用各处的功能分离出来形成可重用的组件。AOP一般被定义为使软件系统实现关注点分离的一项技术。一般来讲,系统中的每一个组件负责一个特定的功能,但有些组件除了负责自身的核心功能以外,还经常承担额外功能。诸如日志、事务管理、权限认证和安全等这样的系统功能经常融入到自身具有核心业务逻辑的组件中,这些系统功能通常被称为横切关注点,因为它会跨越系统的多个组件,被各个模块或服务调用。
    aop_focus_demo.png
    AOP能够使这类系统功能模块化,并以声明的方式应用到它们需要影响的模块或组件中去。所造成的结果是这些组件(如学生服务、课程服务等)会更加关注自身的业务,完全不需要了解系统功能(或服务,如日志、安全等)所带来的复杂性。
    我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志等关注点与核心业务逻辑相分离。
    aop.png
  • 通过AOP和模板减少样板代码
    样板代码的一个场景是使用JDBC查询数据库。一个应用中,应该有许多的功能模块需要查询数据库,而每次查询数据库我们都需要先获取连接,然后创建Statement对象,然后创建一个收集结果的ResultSet对象,然后再查询,最后关闭ResultSet,关闭Statement,关闭连接。更恶心的是我们还要处理SQLException(这是一个checked exception,虽然我们捕获到之后啥也干不了,但是还要捕获)。在所有的查询实现中,除了处理查询结果的那部分代码,其余代码在每个地方都一样,这样就存在大量的重复代码。
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
   conn = dataSource.getConnection();
   stmt = conn.prepareStatement("select id,name from employee where id = ?");
   stmt.setLong(1, id);
   rs = stmt.executeQuery();
   Employee employee = null;
   if (rs.next()) {
      employee = new Employee();
      employee.setId(rs.getLong("id"));
      employee.setName(rs.getString("name"));
   }
   return employee;
}catch (SQLException e){

}finally {
   if (rs != null) {
      try {
         rs.close();
      } catch (SQLException e1) {

      }
   }
   if (stmt != null) {
      try {
         stmt.close();
      } catch (SQLException e2) {

      }
   }
   if (conn != null) {
      try {
         conn.close();
      } catch (SQLException e3) {

      }
   }
}

Spring可以通过模板封装来消除这种样板式代码,Spring的JdbcTemplate是的执行数据库操作时,可以避免传统的JDBC样板代码。使用Spring jdbcTemplate简化后的代码如下:

posted @ 2023-01-31 14:29  小张同学哈  阅读(26)  评论(0)    收藏  举报