精通Spring:读书笔记(3)

精通Spring:读书笔记(三)

Spring模块划分:
         a)    Spring核心模块: 提供了IoC容器,即依赖注入。其中BeanFactory是最为重要的概念,这对于理解IoC起到关键的作用。对于理解ApplicationEvent也很重要。
         b)    Spring AOP模块: 实现了AOP联盟中定义的AOP编程实现。提供拦截器实现事务管理等。
         c)    Spring上下文(Context)模块: 直接位于Spring核心模块之上,Spring上下文模块除了继承Spring核心模块的功能外,还添加了用于资源绑定、事件移植、资源装载已经透明地装载上下文等功能。对于Web应用和J2EE应用尤为有效。
         d)    Spring Web模块: 提供面向Web应用集成的功能。ContestLoaderServlet和ContextLoaderListener,正是Web模块提供的。
         e)    Spring DAO模块: 提供了JDBC抽象层,使得开发者不用再去编写RDBMS交互、非业务功能的JDBC代码。提供编程方式和声明方式控制事务。
         f)    Spring ORM模块: 为当前流行的O/R Mapping技术提供集成:Hibernate、iBATIS等。借助于Spring框架提供的简单事务声明,开发者能够很容易实现对O/R Mapping中操作的事务控制。
         g)    Spring Web MVC模块: 提供的MVC实现。

JavaBean和POJO区别:
    JavaBean类需满足JavaBean规范,比如采用标准的setter\getter方法设置成员变量。POJO只是普通的Java类。可以认为,JavaBean类都是POJO,但POJO类未必是JavaBean。

命名服务JNDI:
         a)    Spring出现的背景: Web容器和J2EE应用服务器提供了大量的企业级服务,而开发J2EE应用在很多时间都需要在J2EE API级开始,不利于提高开发效率;以及如何在应用中有效地使用这些平台服务。开发者通过使用Spring对J2EE API提供的服务抽象,再加上Spring IoC容器和Spring AOP框架的集成支持,能够快、稳健地开发出优秀的企业级应用。
         b)    JNDI: 即Java命名目录服务。类似于DNS,将对象赋予有意义的名字。在DNS中,通过逻辑名能实现对IP地址的映射。在JNDI中,通过预先绑定的名字能够找到目标服务或者对象。将应用对象存储在某注册中心,从而改善Java应用,这就是JNDI。开发者可以将:数据源、Hibernate的SessionFactory、JTA事务管理器等存储在供应商提供的命名与目录服务器中。
         c)    Spring的支持: 通过提供Spring JNDI抽象,使得开发者能够将JNDI查找操作定义在配置文件中,不需要在Java代码中硬编码。在Spring配置文件定义了JNDI后,其他的JavaBean能够直接使用它,提高开发效率。
         d)    借助于Spring框架,实现对JNDI的访问,开发者通过如下3种方式:
                  a)    开发者实现AbstractJndiLocator抽象类
                  b)    使用JndiObjectFactoryBean(主要用于产品部署场合)
                  c)    使用JndiObjectTargetSource(主要用于产品开发场合)

         e)    JndiTemplate: 仅仅将jndi.properties放置在应用执行的classpath中,不能够满足实际应用需求,此时可以借助于JndiTemplate解决这种问题。Spring BeanFactory将会创建jndiTemplate单例,供整个Spring应用使用。可以针对不同的JNDI上下文,配置不同的JndiTemplate。

事务服务----JTA:
         a)    支持变成式和声明式事务: 开发者不需要同具体的事务管理实现进行交互。
         b)    优势:
                  a)    对于手工控制事务,即程序控制事务的编程方式而言,Spring提供的事务抽象易于使用。无
                  b)    无论底层的事务API是什么,Spring都能够提供一致的编程模式。
                  c)    Spring支持声明式事务管理,依赖于Spring AOP模块提供的功能。
                  d)    能够同Spring的DAO抽象集成。
                  e)    在不同的事务间切换,只会涉及到Spring配置文件的修改,不会涉及到代码的修改。
         c)    Spring提供的事务管理器仅仅是对现有的事务实现API(Hibernate、JDBC、JTA)进行封装。
         d)    事务移植性:
                           a)    int PROPAGATION_REQUIRED = 0, 它表明当前方法必须运行在事务中。如果调用其客户处于事务中,则该方法直接使用该事务;否则,启动新的事务。
                           b)    int PROPAGATION_SUPPORTS = 1, 当前方法可以运行在事务中,也可以不运行在事务中。看当前客户是否处于事务中。
                           c)    int PROPAGATION_MANDATORY = 2, 必须运行在事务中,否则抛出异常。
                           d)    int PROPAGATION_REQUIRES_NEW = 3,当前方法必须运行在一个新的事务中,无论客户如何,都将信启动事务。
                           e)    int PROPAGATION_NOT_REQUIRED = 4, 当前方法不能够运行在事务中。如果当前处于事务中,则将事务挂起。
                           f)    int PROPAGATION_NEVER = 5, 当前方法的客户不能处于事务中,否则抛出异常。
                           g)    int PROPAGATION_NESTED = 6, 当前方法支持嵌入式事务,即允许事务嵌套。
         e)    Spring声明式事务支持:
                  a)    借助于Spring AOP提供了类似EJB CMT的功能,能够对POJO进行事务性声明。
                  b)    Spring框架提供的声明式事务能够适应任何操作环境:JDBC、Hibernate、JDO等。
                  c)    Spring还提供了声明式的回滚规则。
                  d)    Spring还提供了通过元数据、指定方法名、自动代理等方式定义事务策略。
         f)    Spring编程式事务支持:
                  a)    编程式事务比声明式事务更具灵活性。因为Spring AOP实现的拦截器只能拦截方法级的调用。
                  b)    直接使用TransactionTemplate,线程安全,Spring框架开发Team推荐使用。
                  c)    直接使用PlatformTransactionManager实现。类似于使用JTA API。

         g)    使用TransactionTemplate, 通常采用回调机制实现方法调用。线程安全的。