Spring day02

Posted on 2018-05-20 20:11  _wahaha  阅读(76)  评论(0)    收藏  举报

 

Spring提供了一站式解决方案:

        1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系

        2) Spring Web  Spring对web模块的支持。

                                                可以与struts整合,让struts的action创建交给spring

                                                spring mvc模式

        3) Spring DAO  Spring 对jdbc操作的支持  【JdbcTemplate模板工具类】

        4) Spring ORM  spring对orm的支持:

                                                  既可以与hibernate整合,【session】

                                                  也可以使用spring的对hibernate操作的封装

        5)Spring AOP  切面编程

        6)SpringEE   spring 对javaEE其他模块的支持

 

 

目标:

        1) 代理模式

                 静态代理

                动态代理

                 Cglib代理

        2)手动实现AOP编程 【代理模式】

        3)AOP编程

                  * 注解方式实现

                  * XMl配置方式实现

        4) Spring DAO 

                 Spring对jdbc操作的支持

 

 

1. 代理模式

1.1 概述

 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。

 

代理模式的关键点: 代理对象与目标对象。

 

1.2 静态代理

静态代理,

        1) 代理对象,要实现与目标对象一样的接口;

        2) 举例:

                         保存用户(模拟)

                                  Dao  ,  直接保存

                                  DaoProxy, 给保存方法添加事务处理

   总结静态代理:

        1)可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。

        2)缺点:

                 --》  因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。

                 --》  一旦接口增加方法,目标对象与代理对象都要维护。

 

解决:

        代理工厂?  可以使用动态代理。

 

1.3 动态代理

动态代理,

        1)代理对象,不需要实现接口;

        2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);

        3)  动态代理, JDK代理, 接口代理;

 

JDK中生成代理对象的API:

|-- Proxy

        static Object newProxyInstance(

ClassLoader loader,       指定当前目标对象使用类加载器

 Class<?>[] interfaces,     目标对象实现的接口的类型

InvocationHandler h       事件处理器

 动态代理总结:

        代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
        (class  $Proxy0  implements IuserDao)

  思考:

        有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?

        Class  UserDao{}

        // 子类的方式

        Class subclass  extends  UserDao{}

                                          

        以子类的方式实现(cglib代理)

 

 

1.4 Cglib代理

Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。

 

JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。

  CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。

 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

 

 

Cglib子类代理:

        1) 需要引入cglib – jar文件, 但是spring的核心包中已经包括了cglib功能,所以直接引入spring-core-3.2.5.jar即可。

        2)引入功能包后,就可以在内存中动态构建子类

        3)代理的类不能为final, 否则报错。

        4) 目标对象的方法如果为final/static, 那么就不会被拦截,即不会执行目标对象额外的业务方法。

 

       

在Spring的AOP编程中,

        如果加入容器的目标对象有实现接口,用JDK代理;

        如果目标对象没有实现接口,用Cglib代理;

AOP 面向切面的编程,

        AOP可以实现“业务代码”与“关注点代码”分离

分析总结:

        关注点代码,就是指重复执行的代码。

        业务代码与关注点代码分离,好处?

     关注点代码写一次即可;

     开发者只需要关注核心业务;

     运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】

 

 

如何分离?

        过程式/对象式/代理模式分离

3. AOP编程

3.1 概述:

Aop  aspect object programming  面向切面编程

        功能: 让关注点代码与业务代码分离!

关注点,

        重复代码就叫做关注点;

切面,

         关注点形成的类,就叫切面(类)!

         面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码”。

切入点,

        执行目标对象方法,动态植入切面代码。

        可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。

 

3.2 注解方式实现AOP编程

步骤:

1) 先引入aop相关jar文件           (aspectj  aop优秀组件)                                  

        spring-aop-3.2.5.RELEASE.jar   【spring3.2源码】

aopalliance.jar                            【spring2.5源码/lib/aopalliance】

aspectjweaver.jar                       【spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib】

aspectjrt.jar                                【spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib】

 

注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能会有问题。

                 需要升级aspectj组件,即使用aspectj-1.8.2版本中提供jar文件提供。

2) bean.xml中引入aop名称空间

 

 

3) 开启aop注解

 

4) 使用注解

@Aspect                                                        指定一个类为切面类            

@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入点表达式

 

@Before("pointCut_()")                                前置通知: 目标方法之前执行

@After("pointCut_()")                                  后置通知:目标方法之后执行(始终执行)

@AfterReturning("pointCut_()")             返回后通知: 执行方法结束前执行(异常不执行)

@AfterThrowing("pointCut_()")                  异常通知:  出现异常时候执行

@Around("pointCut_()")                              环绕通知: 环绕目标方法执行

3.3 XML方式实现AOP编程

 

Xml实现aop编程:

        1) 引入jar文件  【aop 相关jar, 4个】

        2) 引入aop名称空间

        3)aop 配置

                 * 配置切面类 (重复执行代码形成的类)

                 * aop配置

                         拦截哪些方法 / 拦截到方法后应用通知代码

3.4  切入点表达式

切入点表达式,

        可以对指定的“方法”进行拦截;  从而给指定的方法所在的类生层代理对象。

 

4. Spring对jdbc支持

 

使用步骤:

        1)引入jar文件

spring-jdbc-3.2.5.RELEASE.jar

spring-tx-3.2.5.RELEASE.jar

        2) 优化

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3