Spring实战第三版

https://book.douban.com/subject/24714203/

因为将来要使用spring框架,所以粗粗地看了一下这本书,主要是想了解原理性方面的知识。第一部分看得比较仔细,后面第二三部分就是翻着看了。 这里我稍微总结了一些spring基本原理方面的知识,然后附带上这本书的 目录


spring框架里面几个基本和重要的概念

  1. POJO(plain ordinary java object) https://www.jianshu.com/p/6f3e2bd50cb1 就是最基本的Java对象,没有继承或者是实现接口什么的,也没有什么特殊的注解在上面。这种类/对象特别就是特别容易构造和装配,也很容易实现序列化和反序列化。
  2. Bean是POJO的扩展,允许通过配置进行构造和组装。这样一来,我们可以将Bean对象的行为(在代码里面完成)和Bean对象的构造(通过配置完成)分开,一个显而易见的好处就是容易进行单元测试,针对单元测试我们可以使用独立的配置来构造Bean对象。
  3. DI(Dependency Injection) 依赖注入可以解决灵活地构造Bean对象的问题。设想一个Bean对象A,它可能通过组合持有很多其他抽象对象(X, Y, Z),也就是说A依赖于X,Y,Z这三个对象。我们在构造对象A的时候,需要将X,Y,Z的子类传入,或者是通过其他setter接口将这些子类设置进去。这就是依赖注入的含义,通过初始化函数或者是setter接口将子类设置到Bean对象里面。
  4. AOP(Aspect Oriented Progamming) 面向切面编程。其实这个概念并不新,但是却很解决问题。我们可以在逻辑函数的入口/出口增加某一类hook函数,而这类hook函数独立于逻辑函数比如打印日志,验证身份或者是启动数据库事务等。AOP的实现在设计模式上可以对应到代理模式,或者是装饰器模式,但是设计模式并不能完全体现AOP的价值。
  5. 模板(template). spring里面的模板,仅仅是将某些重复的逻辑流程单独抽取出来,然后将可变/用户关心的部分单独暴露出来。比如RestTemplate(通过Restful接口访问请求), JdbcTemplate(通过JDBC执行某些数据库操作)等等

最开始,Bean的构造必须在XML配置里面指定。用户需要创建一个ApplicationContext ctx, 然后传入某个XML配置,这个配置里面说明了 1. 有哪些bean对象(通过id标识) 2. 如何初始化和设置这些bean对象。之后我们就可以调用类似 `ctx.getBean("beanId")` 来获取bean对象了。不过这种方式依然有点繁琐,spring通过好几种自动装配bean的方式来简化这个过程,到后面还支持注解装配 `@Autowired`以及自动检测Bean对象。需要指出的是,Bean对象默认是单例,但是也可以根据上下文每次创建新的Bean对象。


AOP是个比较大的话题,但是我们只需要了解几个基本概念就可以入手了:

  1. 通知(Advice). hook函数相对于业务函数什么时候执行 before/after/after-returning/after-throwing/around
  2. 连接点(joinpoint). 哪些点可以插入hook. 有些AOP实现可以在修改字段的时候触发, 但是spring AOP的连接点只有函数调用
  3. 切点(pointcut). 哪些业务函数要触发hook. 比如所有方法名称含有"executeSql", 或者是参数列表中有"String sql"这样的参数
  4. 切面(aspect). 通知(advice)和切点(pointcut)的结合
  5. 引入(introduction) 引入允许向现有的类添加新方法或属性(我不知道spring AOP能不能这么做)
  6. 织入(weaving) 将切面(aspect)在指定的连接点(joinpoint) 应用到目标对象中,通常是创建新的代理对象。织入点可以有好几种:a) 编译期 b)类加载期 c)运行期(spring AOP是通过这种方式织入的)