《Spring 技术手册--林信良》
***第一章:例子BusinessFactory很好解释了IoC与依赖注入的原理。
***第四章:例子静态代理与动态代理很好地解释了A0P的原理。
***IOC
高层模块不依赖于低层模块,而模块必须依赖于抽象
实现必须依赖抽象,而不是抽象依赖与实现
应用程序不应该依赖于容器,而是容器服务于应用程序
***建议有两个以上的对象需要注入相同的依赖是,才考虑使用Spring IoC容器来进行依赖注入。
***IOC有两种实现方式
Dependency Injection和Service Locator
***DI
保留抽象接口,让组件依赖于抽象接口,当组件要与其他实际对象发生依赖关系时,由抽象接口来注入依赖的实际对象。
程序不依赖与实现,但程序与实现都依赖与抽象。(即程序调用接口,实现类实现接口)
***DI的三种实现方式
Type 1 IOC:Interface injection
Type 2 IOC:Setter injection(推荐)
Type 3 IOC:Constructor injection
***Spring中的两种基本的依赖注入方式是Setter injection和Constructor injection,另外针对非Singleton的依赖注入,还提供了Method Injection。
***具体来说,BeanFactory就是Spring所提供的IOC容器
***BeanFactory只有在真正需要Bean对象时(使用getBean()时),才会建立实际的Bean实例,而不是在一开始建立BeanFactory时就建立Bean实例;如果使用ApplicationContext,则会预先针对Bean定义文件的内容,将所有的Bean实例化。如果不想这样,可以在<bean>上设置“lazy-init”属性为true。
****BeanFactory
负责读取Bean定义文件;
管理对象加载,生成;
维护Bean对象与Bean对象之间的依赖关系;
负责Bean的生命周期;
***相对于实现BeanPostProcesssor接口的Bean对Spring框架产生了依赖较大;BeanFactoryPostProcesssor对Spring框架的依赖较为可以接受,如p81的PropertyPlaceholderConfiger与PropertyOverrideConfiger是不错的方法。
***Spring的Singleton主要针对“一个IOC维护一个Bean实例”与设计模式上的Singleton不同,设计模式上的Singleton,是指对每个ClassLoader所载入的类产生一个实例。
***Cross-cutting concerns
在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(如logging,security),这样的逻辑称为横切关注点。
***Aspecet
将横切关注点的动作或任务独立出来设计成一个特殊服务对象称之为Aspecet,这些对象不介入特定业务逻辑。
***Advice
对横切关注点的行为或所提供服务的具体实现,如日志的具体实现(invoke()方法)。
***Joinpoint
Advice在应用程序执行时加入业务流程的点或时机(某个方法的前或后或异常)。
***Spring只支持方法的Joinpints,也就是Advices将在方法的执行前后被应用,Spring不支持Field成员的Joinpoint(破坏对象的封装性)。
***Pointcut
定义了感兴趣的Jointpoint(Advice的应用时机)。在Spring中,使用PointcutAdvisor提供Pointcut实例,具体结合Advice,Spring内建的Pointcut都有对应的的PointcutAdvisor。
***Spring2.0中声明的Pointcut主要包括两个部分:
Pointcut表达式(expression)
Pointcut签名
***Spring2.0中提供三种实现AOP的方式
一是实现Spring API的传统方式
二是基于XML设置
三是使用@AspectJ的Annotation支持
***AOP
着重与Aspects的辨识,设计可重用使用的Advices,就如OOP重视对象辨识,设计可重复使用的对象一样。
***Spring AOP主要是通过动态代理完成,可用于代理任何的接口。另一方面,Spring也可以使用CGLib代理,用以代理类,像一些遗留类(Legacy classes)。
***.我对Spring AOP概念的理解(maybe是错的)
a Aspect--对象
b Advice--方法(处理逻辑)
c Pointcut--条件(一系列连接点JoinPoint的集合,它指明了处理方式Advice将在何时被触发,即处理条件)
乱想:
class Aspect{
Advice()
{
。。。
Jointpoint(不是很好)
特点业务逻辑方法
Jointpoint
。。。
}
main()
{
if(Pointcut)
{
Advice
}
}
}
不要用AOP在服务器上记录日志,或者在服务器上打印不必要的调试信息,因为日志输出是单线程操作,对系统只能有害无益。
***Introduction
可以为某个已经编写或编译完的类,在执行期间动态地加入一些方法或行为,而不用修改或新增任何一行程序代码。在Spring中,Introduction是一种特殊的Advice
***Weave
Advice被应用到对象之上的过程织入(Weave),AOP中织入有几个时间点:
编译时期;类加载时期;执行时期
***第五六章:
a。在用hibernate时,要抽象IDAO接口,然后用hibernateAPI实现IDAO,
这样业务层只调用IDAO,实现业务层与持久化层的松耦合。
b。Spring中整合Hibernate时,用声明事务管理,不要用编程事务管理。
***异常
Java的异常有Checked exception和Unchecked exception两种。
Spring的DAO框架并不丢出与数据库技术相关的异常,Spring所有的异常都是org.springframwork.dao.DataAccessException的子类,一个与数据库技术无关的通用异常,而且DataAccessException是RuntimeException的子类,也就是说它是属于Unchecked Exception,不用强迫使用try。。。catch来处理,可以处理也也直接将异常抛出到上层应用程序。
org.springframwork.dao包下提供一致的异常处理层次,DataAccessException是这个层次的基础类,它继承自org.springframword.core包的NestedRuntimeException,而NestedRuntimeException继承自RuntimeException,因此对于应用程序中的DataAccessException的子类,可以选择处理它或者忽略它,由最上层的应用程序或是最好由JVM来处理。
***事务
Spirn用AOP实现的自动事务代理功能,用的是Around Advice,在方法前开始事务,在方法执行后提交事务
Spring中对JDBC的事务管理加以封装,Spring事务管理的抽象关键在于org.springframwork.transaction.PlatformTransactionManager接口实现,PlatformTransactionManager接口有许多具体的事务实现类,如DataSourceTransactionManager,HIbernateTransactionManager等。
TransactionException死Unchecked Exception。
Spring提供两种事务管理:
编程式的事务管理(实现细粒度的事务管理):基于PlateformTransactionManager实现;基于TransactionTemplate
声明式的事务管理(Spring事务管理相关的API可以不用介入程序中):
Spring2.0的声明式事务管理包括:基于XML Schema;基于Annotation
Spring2.0基于XML Schema事务管理中:事务是系统层面的服务,也就是一个Aspcet,其具体来说就是一个Advice,可以使用<tx:advice>标签来提供这个Advice,它需要设置一个TransactionManager,并在当中使用<tr:attributes>来设置事务相关属性。
***第七章:
a。Spring Web MVC 与Struts很相似,如Spring中的controller相当于Struts的Action等。
《SpringGuide》
****IOC
即由容器控制程序之间的关系,控制权由传统的应用代码转到了外部容器,控制权的转换即时所谓的反转。
****DI
即组件之间的依赖关系由容器在运行期决定,即由容器动态的将某种依赖关系注入到组件中。
****BeanWrapper与BeanFactory
BeanWrapper实现针对单个Bean的属性设定操作,而BeanFactory则是针对多个Bean的容器管理
****BeanFactory与Application Context
BeanFactory的使用方式类似一个API而非Framwork style,而Application Context提供了一个更为框架化的实现,它覆盖了BeanFactory的所有功能,并提供了更多特性,如国际化,资源访问,事件传播,多实例加载等。
****Web Context
ApplicationContext可以通过编程加载,在web应用中,Spring提供了可配置的ApplicationContext加载机制,可以在Web.xml中进行配置实现由web应用加载。
****Spring的事务管理
实际上是基于动态AOP机制实现的,为了实现动态AOP,Spring在默认情况下会使用Java Dynamic Proxy,Dynamic Proxy要求代理的对象必须实现一个接口,该接口定义了准备进行代理的方法;对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib实现这一功能。
****AOP的一个重要特点是源代码组成无关性,为实现这一特性,AOP往往通过预编译方式(如AspectJ)和运行期动态代理模式(如Spring AOP和Boss AOP)实现。
****Spring AOP中的动态Proxy模式是基于Java Dynamic Proxy(面向interface)和CGLib(面向Class)实现。
****基于Java Dynamic Proxy返回的代理类,是目标类所实现接口的另一个实现版本;而CGLib返回的动态代理类,则是目标代理类的一个子类。
****CGLib可以在运行期对Class行为进行修改。