您的位置:首页 > 编程语言 > Java开发

spring五天的学习,只需要五天学会spring

2013-11-29 22:49 399 查看
======================



 第一天

================

 



  1.Spring框架作用和优点

   Spring提供了一个整合应用平台。

   该框架具有IOC和AOP机制的实现,

   基于这些特性开发系统,

   可以提高系统结构的灵活性,

   降低组件之间的耦合度。

  

    在整合应用,

    我们会将应用程序的Action,DAO,Service组件交给Spring框架负责管理,

    使用Spring框架的IOC和AOP机制以低耦合方式建立关联。

 

 *2.Spring框架容器

    Spring框架提供了一个容器,主要在该容器中管理应用程序的各个组件,建立组件关联



   1)容器特性,如何实例化

    Spring容器首先具有工厂特性,除此之外还具备了IOC和AOP机制的实现。

   BeanFactory<-继承-ApplicationContext

   两个实现类:

   ClassPathApplicationContext

   FileSystemApplicationContext



   2)容器如何对Bean组件管理

    当将一个Bean组件交给Spring容器后,Spring容器可以负责创建、销毁该对象。



    *a.Bean对象创建模式

     Spring容器支持singleton和prototype两种模式创建对象。

     默认为singleton,如果想改变可以使用scope属性定义。

     (如果在Web整合应用,还支持request,session等值)



    b.Bean对象的创建时机

    singleton 模式对象在容器实例化时创建,

    通过lazy=true属性可以将创建推迟到getBean方法。

    prototype 模式对象在getBean方法时创建



   c.Bean对象初始化设置

   通过init-method属性可以指定一个方法当做初始化方法,

   在对象创建后自动执行。

  

   通过destroy-method属性可以指定一个销毁方法,

   在对象被垃圾回收前自动执行。

   (仅对singleton对象有效)

 

 

 

 *3.Spring框架的IOC机制

 



   1)IOC概念

    Inverse of Controller 被称为反向控制、控制反转。

    更确切的讲应该是控制的转移。

   意思是当两个组件之间具有使用关系时,

   原有将对象创建和关系指定逻辑交给了使用一方负责。

   最终导致了两个组件耦合度过高,

   为维护和组件替换带来的不便。

   采用了IOC机制后,

   会将对象创建和关系指定这些逻辑交给第三方框架或容器负责,

   将这些控制逻辑转移给了第三方负责,

   这样发生变更后,只需要修改第三方配置就可以了。



   2)DI概念(Dependency Injection)

    DI被称为依赖注入。Spring框架中IOC机制是通过DI技术实现的。

    DI注入技术有以下几种实现:



   *a.setter方式注入(推荐)

     依靠setter方法接收注入的对象实例

     --添加setter方法

     --采用<property>描述



   b.constructor方式注入

     依靠构造方法接收注入的对象实例

     --添加带参数构造方法

     --采用<constructor-arg>描述



 4.DI注入的使用

   可以通过注入技术注入各种不同类型的数据

   1)注入一个Bean对象

     采用ref="Bean的ID名称"

     <property name="costDao"

       ref="hibernateCostDao">

     </property>

   2)注入一个基本类型数据

     采用value="值"

     <property name="password"

         value="123456">

     </property>

   3)注入集合类型数据

      List,Set,Map,Properties

======================



 第二天

================



 1.Spring框架的AOP机制

 



   1)什么是AOP和优点

   Apsect Oriented Programming面向方面编程。

 面向方面编程是以OOP面向对象编程为基础。

 AOP关注的是共通处理问题,可以将共通处理封装成一个组件(方面组件),

 然后采用AOP机制可以以低耦合方式作用到指定的目标组件上。



   2)AOP使用步骤

    a.引入Spring的IOC和AOP开发包

    b.添加Spring容器配置文件

    c.将共通处理封装成一个独立Bean组件

    d.采用AOP配置将Bean组件作用到其它目标组件及其方法上



   3)AOP相关概念

     *a.方面(Aspect)

      方面指的封装共通处理的组件。可以灵活的切入到目标对象及方法上。

     *b.切入点(Pointcut)

      切入点用于指定目标对象及方法,利用特定表式指定目标对象及方法

     c.连接点(JoinPoint)

     连接点指的是方面和某一个目标方法的关联点。切入点是连接点的集合

     *d.通知(Advice)

      通知用于指定方面功能在目标对象方法上执行的时机。

      例如方法前、方法后、异常发生后等。

     e.目标组件(Target)

      使用方面功能的Bean组件,或者切入点指定的Bean组件

     f.动态代理(AutoProxy)

     动态代理机制是AOP机制的实现原理.

     Spring框架在使用AOP配置后,返回的Bean对象,

     是采用动态代理机制生成的一个新类型。

     该类型的方法负责去执行方面组件和目标组件的处理。

 Spring框架采用了两种方式生成动态代理类。

  --采用CGLIB工具生成(目标对象没有接口)

  public class 代理类 extends 原目标组件{

    // 重写原目标组件的方法

  }

  --采用JDK Proxy API生成(目标对象有接口)

  public class 代理类 implements 原目标组件接口{

    // 重写原目标组件的方法

 }

 

  *4)切入点表达式

    利用表达式指定目标组件及方法。

  *a.方法限定表达式

   execution(修饰符?

    返回类型 方法名(参数列表) throws异常?)

 示例1:匹配容器中所有组件以add开始的方法

    execution(* add*(..))

 示例2:匹配CostService组件的所有方法

    execution(*

      org.tarena.service.CostService.*(..))

 示例3:匹配service包下所有类的所有方法

    execution(* org.tarena.service.*.*(..))

 示例4:匹配service包下及其子包中所有类的所有方法

    execution(* org.tarena.service..*.*(..))

  

   *b.类型限定表达式

    within(类型)

   示例1:匹配CostService类中所有方法

    within(org.tarena.service.CostService)

   示例2:匹配service包下所有类的所有方法

    within(org.tarena.service.*)

   示例3:匹配service包及其子包所有类所有方法

    within(org.tarena.service..*)

  

   c.Bean名称限定表达式

     bean(Bean的id或name属性值)

  示例1:匹配id=costAction的Bean组件方法

     bean(costAction)

  示例2:匹配名称以DAO结尾的Bean组件方法

     bean(*DAO)

   d.参数限定表达式

     args(参数列表)

  示例1:匹配只有一个参数,并且符合Serializable类型

    args(java.io.Serializable) 

 (注意:上述表达式可以采用&&,||连接在一起)

 

  5)通知类型

   通知主要用于指定方面组件在目标组件方法上作用的时机。

    a.前置通知<aop:before>

     方面组件在目标方法之前调用

    b.后置通知<aop:after-returnning>

     方面组件在目标方法之后调用,如果目标方法抛出异常,将不再执行方面组件

    c.最终通知<aop:after>

     方面组件在目标方法之后调用,目标方法有无异常都会执行

    d.异常通知<aop:after-throwing>

     方面组件在目标方法抛出异常后执行。

    e.环绕通知<aop:around>

     方面组件在目标方法之前和之后都要执行

   try{

     // 前置通知--执行方面组件

     // 执行目标方法

     // 后置通知--执行方面组件

   }catch(Exception ex){

     // 异常通知--执行方面组件

   }finally{

     // 最终通知--执行方面组件

   }

 

  6)采用AOP记录异常日志信息

   a.编写记录异常信息的方面组件ExceptionBean

   b.将方面组件定义到Spring容器

   c.添加AOP配置,定义切入点,方面和通知元素



  7)Log4j工具简介

 Log4j是一款日志工具。

 优点:该日志器可以灵活的控制输出信息的级别和输出的方式。

 Log4j主要由以下3部分构成:

    a.日志器组件

 (Logger)

 提供了消息输出的方法,可以按消息级别输出

    b.输出器组件(Appender)

 用于指定消息采用哪种方式输出。例如以文件形式输出,以控制台形式输出

    c.布局器组件(Layout)

 用于指定消息输出的格式。

   一个日志器可以指定多个不同的输出器,每个输出器只能对应一个布局器。

==============



 第三天

===========



 1.Spring注解配置的使用

   注解技术源于JDK 5.0,从Spring2.5版本开始支持注解配置形式,可以替代原有的XML配置。

   注解可以在类定义、方法定义、成员定义前使用。



   1)<bean>元素和注入的配置

     可以采用组件扫描技术替代原有的<bean>定义和注入配置。

     使用方法如下:

     a.在applicationContext.xml中开启组件扫描功能,指定要扫描的package路径  

     b.如果需要将组件扫描到Spring容器,需要在组件类定义前使用以下注解标记。

      --@Controller

      --@Service

      --@Repository

      --@Component

     默认扫描到容器采用类名首字母小写当id值,

     如果需要指定可采用@Service("id值")格式指定。

     如果需要修改scope创建对象的模式,

     可使用@Scope("prototype")格式指定

    c.如果两个组件之间有注入关系,可以在变量定义前或setter方法前使用下面注解标记

     --@Resource

     --@Autowired

     如果不指定注入的id名,会采用类型匹配注入。

     @Resource(name="costDao")将指定的costDao对象注入。

 

   2)<aop>元素配置

     AOP注解配置的使用方法如下:

    a.在applicationContext.xml中开启AOP注解配置。

    b.在方面组件中使用以下注解标记。

    --@Aspect // 将Bean组件定义成方面,类定义前使用

    --@Pointcut// 定义切入点表达式,方法定义前使用。因此需要编写个空方法,才能使用该标记。

    --通知定义,@Around,@Before,

      @After,@AfterReturning,

      @AfterThrowing,在方法前使用

 

 2.利用Spring整合JDBC和Hibernate



  1)Spring框架对数据库访问技术提供了以下支持

    a.提供了一致的异常处理层次.提供了一套异常类型,例如DataAccessException  

    b.提供了编写DAO的一套工具类,主要有DaoSupport和Template两种封装类型。

 JDBC技术:JdbcDaoSupport,JdbcTemplate

 Hibernate技术:HibernateDaoSupport,

                 HibernateTemplate

    c.提供了事务管理的支持。只需要添加AOP配置即可。

 

   2)Spring和Jdbc技术的整合

   --新建工程,引入jar包

       (spring开发包,ojdbc.jar,dbcp开发包)

   --在src下添加applicationContext.xml

   --针对COST表编写实体类

   --编写CostDAO接口,定义要实现的方法

   --编写JdbcCostDAO实现类

    (继承JdbcDaoSupport,在方法体中使用JdbcTemplate类完成增删改查操作)

      update:用于增、删、改操作

      queryForObject:用于查询一条记录

      query:用于查询多条记录

      queryForInt:用于查询一个数值的

   --将JdbcCostDAO在Spring容器中定义

   --追加一个连接池,在Spring容器中定义一个dataSource组件对象Bean,

   并将该Bean组件对象给JdbcCostDAO注入。

 (JdbcDaoSupport里有一个setDataSource方法,

   接收容器注入的DataSource对象,

   利用DataSource对象实例化JdbcTemplate)

 

   3)Spring和Hibernate技术的整合

    --创建工程,引入开发包

    (spring开发包,ojdbc.jar,dbcp连接池,hibernate框架开发包)

    --在src下添加applicationContext.xml

    --针对数据表添加实体类和映射描述文件

      (Cost类,Cost.hbm.xml)

    --编写CostDAO接口

    --编写实现类HibernateCostDAO

     (继承HibernateDaoSupport,采用HibernateTemplate的方法完成增删改查)

      save():添加

      update():更新

      delete():删除

      load(),get():按主键查询

      find():执行HQL语句

    --在Spring容器配置HibernateCostDAO

  需要事先定义DataSource,SessionFactory

 组件对象,按DataSource-注入->

 SessionFactory-注入->

 HibernateCostDAO顺序建立关联

   提示:如果需要在DAO中使用Session,

   可以采用DaoSupport的getSession()获取,

   也可以通过HibernateTemplate.execute方法以回调方式使用。

   (参考spring_03_2中HibernateCostDAO.java的useSession()方法)

=====================



 第四天

================



 1.Spring框架整合Struts2步骤

   a.创建工程,引入开发包

     Struts开发包,Spring开发包

   b.添加Struts控制器配置和struts.xml配置文件

  *c.引入struts2-spring-plugin.jar整合包

     然后将<action>配置的class指定为Spring容器中Action组件定义的id值。

 (plugin.jar整合包提供一个StrutsSpringObjectFactory,采用该组件获取Action对象。

   该组件可以访问Spring容器,获取容器中定义的Bean对象)

  *d.在web.xml中添ContextLoaderListener组件,用于在启动服务器时实例化Spring容器

 



 2.struts-spring-plugin.jar作用

   该plugin.jar提供了一个StrutsSpringObjectFactory类,

   当引入该jar后,Struts2会采用该组件获取Action对象

  ObjectFactory在获取Action对象时,有以下两种途径:

 

 a.利用<action>元素的class属性值去Spring容器中寻找Bean对象,寻找规则是id=class值

  参考(ssh2-2.jpg结构图)

 b.如果利用<action>的class属性值去Spring容器获取不到Bean对象,

  ObjectFactory会利用反射机制创建一个Action对象,

  然后访问Spring容器,

  将容器中id名与Action属性一致的Bean对象注入给Action。

  参考(ssh2-1.jpg结构图)

 try{

  // 第一种利用class值去Spring获取Bean对象

 }catch(){

  // 第二种自己创建一个Action,之后将Spring中的Bean对象给Action属性注入。

  //注入规则是属性名=id值

 }

 

 3.SSH学习建议

   XML和注解配置,XML配置方式了解,学会使用注解配置形式。

  Struts2+Spring整合,建议采用ssh2-1.jpg结构整合。

   掌握:ssh2-1.jpg采用注解方法整合应用。

 (参考spring_04_4的demo2案例)

======================



 第五天

===================



 *1.重构netctoss系统的资费管理模块处理

  1)重构资费列表显示功能

   a.梳理处理流程

 /cost/list.action-->ListCostAction

 -->CostDAO.findAll/getTotalPages

 -->cost_list.jsp

   b.重构CostDAO的findAll/getTotalPages

    (参考原来总结过的Spring+Hibernate步骤)

   c.测试Spring容器中的DAO

   d.改造ListCostAction

    --引入struts-spring-plugin.jar

    --将Spring容器中的DAO给Action注入

   e.在web.xml中添加ContextLoaderListener配置,启动服务器时实例化Spring容器对象。

    

  2)重构资费修改操作

   a.梳理处理流程

 /cost/detail.action-->DetailCostAction

 -->CostDAO.findById-->cost_detail.jsp

   b.重构CostDAO.findById方法

     由于前面重构已经将CostDAO交给Spring容器管理,因此只要将findById实现就可以了

   c.重构DetailCostAction

     --将Spring容器中的DAO给Action注入

   d.测试功能

 *3)Spring对Hibernate延迟加载操作的支持

   为了支持Hibernate延迟加载操作,

   Spring提供了一个Filter组件,

   该组件为OpenSessionInViewFilter。

   可以在web.xml中定义该Filter。

   这样可以将Template方法关闭Session时机推迟到JSP解析之后。

   注意:定义在StrutsFilter之前才有效

 

 *2.Spring的事务管理

    Spring提供了以下两种事务管理方法

   *a.声明式事务管理

     以AOP配置的形式实现事务管理

  JDBC事务管理的方面组件:

  (DataSourceTransactionManager)

  Hibernate事务管理的方面组件:

   (HibernateTransactionManager)

   事务管理通知:<tx:advice>

   切入点:根据实际情况编写表达式

  -----如果采用注解方式配置事务------

   首先在applicationContext中开启事务注解

 <bean id="txManager"

  class="org.springframework.orm.hibernate3.HibernateTransactionManager">

  <property name="sessionFactory"

     ref="sessionFactory">

  </property>

 </bean>

 <tx:annotation-driven

  transaction-manager="txManager"/>

   然后在目标组件中,使用@Transactional.

   该标记可用在类定义和方法定前。类定义前指定全局,方法定以前指定当前方法。

   b.编程式事务管理(简单了解)

     在业务组件中添加事务管理代码.

    代码中使用TransactionTemplate控制事务

 

 3.Spring MVC框架

   1)了解Spring MVC主要实现

    Spring提供的MVC框架主要有以下实现组件:

    控制器DispatcherServlet,Controller

    映射处理器HandlerMapping

    视图解析器ViewResolver

    模型和视图ModelAndView

   

   2)了解Spring MVC的处理流程

    a.客户端发送请求,请求交给DispatcherServlet控制器

    b.DispatcherServlet控制器调用HandlerMapping映射器组件,

    根据请求找到对应的Controller组件

 (HandlerMapping组件负责维护请求和Controller组件的对应关系)

    c.控制器调用请求对应的Controller处理请求,也可以调用DAO实现对数据库的操作

    d.Controller处理完毕后,会返回一个ModelAndView对象。

 (ModelAndView负责封装响应数据和视图名)

    e.控制器会调用ViewResolver组件,

    根据ModelAndView信息,

    定位到指定的JSP,生成响应的HTML结果

    f.将响应结果输出,为客户浏览器显示

   3)入门示例

     --基于XML配置的示例

       a.引入spring ioc和springmvc开发包

       b.在src下添加applicationContext.xml

       c.在web.xml中添加DispatcherServlet配置,

       指定classpath:applicationContext.xml

       d.编写Controller组件,实现Controller接口,

       实现handleRequest方法。

       e.在Spring配置文件中定义Controller组件,

       定义handlerMapping和viewResolver组件

      

     --基于注解配置的示例(推荐)

       a.引入spring ioc和springmvc开发包

       b.在src下添加applicationContext.xml

       c.在web.xml中添加DispatcherServlet配置,

       指定classpath:applicationContext.xml

       d.在applicationContext.xml中定义

 AnnotationMethodHandlerAdapter(支持注解的handlerMapping组件)和viewResolver组件。

 开启组件扫描配置。

       e.编写Action组件。

       Action类定义前使用@Controller将Action扫描到容器。

 业务方法前使用@RequestMapping,指定该方法处理哪个请求

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: