Spring的入门案例3

1.Spring的加载机制

Spring的入门案例3

 

2.代理模式:

房东       黑中介     住户

 

任务:

房东:把房出租,换点零花钱

中介:帮房东出租房屋(最基本的任务),获取中介费

住户:有床就行

 

代理模式图:

Spring的入门案例3

代理的特点:

1.代理对象应该实现被代理者相同的接口

2.代理应该完成自己的本职工作(房东想做的事情)

3.完成额外的操作

 

代理的意义:

在完成自己本职工作的同时,完成了额外的操作,对方法进行了额外的扩展。

 

3.静态代理(思想):

场景:为软件中添加事务操作

代码分析:

Spring的入门案例3

问题分析:

1.更新数据库的方法都需要添加事务控制,如果该方法有100个,需要编写同样的代码100  代码复用性特别的差

2.业务处理类和事务控制类,紧紧的耦合在一起,如果将来做扩展,需要修改原有代码。  耦合性较高

 

静态代理:

需要解决的问题:

需要将事务代码和业务代码进行分离。同时满足功能需要。

 

代理的实现:

Spring的入门案例3

 

静态代理的优点和缺点:

优点:

能够将业务处理和事务控制进行分离,实现了解耦

 

缺点:

1.代码大量的重复,只要有更新数据库的操作,必须添加事务控制

2.静态代理只能代理一类业务,如果需要处理其他业务,需要重新定义代理对象。   代理对象不能通用

 

4.动态代理模式:

JDK的动态代理模式:

 

Spring的入门案例3

 

Spring的入门案例3

Spring的入门案例3

CgLib动态代理:

Spring的入门案例3

Spring的入门案例3

 

 

说明:

JDK的动态代理需要目标对象必须实现接口,否则不能生成代理对象

cgLib动态代理不需要接口也能生成代理对象,因为生成的代理对象是目标对象的子类。

 

cglib动态代理:

class service.UserServiceImpl$$EnhancerByCGLIB$$485b4ba7

 

JDK的动态代理:

class com.sun.proxy.$Proxy6

 

一般情况下,使用JDK居多,特定环境下才使用cglib

如果目标对象有接口则采用JDK动态代理,如果目标对象没有接口采用cglib动态代理。

JDK创建代理对象的速度较快。

代理对象的运行速度cgLib快

 

 

5.动态代理

Spring的入门案例3

6.AOP介绍:

面向切面编程

OOP:面向对象

AOP:弥补了面向对象的不足

 

Spring的入门案例3

说明:

程序正常执行时,有固定的轨迹。当执行到某一个特定的点时,程序执行的轨迹发生了改变,在代理对象中执行应有的操作。执行完成之后回到正常的执行轨迹中。

 

7.Spring中的AOP

1.名词解释:

1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。       ------  一个类

2.连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。

 客户端调用的方法

3.通知(Advice):在切面的某个特定的连接点上执行的动作。

切面中的方法

 

 

3.切入点(Pointcut):匹配连接点的断言。

就是一种判断规则,如果满足了判断则会执行切面中的通知。

如果没有满足规则,程序不能执行通知方法

4.目标对象(Target Object): 被一个或者多个切面所通知的对象。

被代理者

 

8.AOP入门案例:

1.引入jar 5jar

Spring的入门案例3

 

2.定义切面类

Spring的入门案例3

 

3,定义连接点

Spring的入门案例3

4.定义通知

Spring的入门案例3

 

5.配置切面:

Spring的入门案例3

 

9.通知的类型

1.环绕通知

在目标方法执行之前,执行之后都要执行

 

2.前置通知(Before advice)

在目标方法执行之前执行

 

3.后置通知(After returning advice)

在目标方法执行之后执行

 

4.异常通知(After throwing advice)

目标方法执行后抛出异常才执行

 

5.最终通知(After (finally) advice)

在目标方法执行之后 都会执行的通知

说明:

5大通知类型中,环绕通知功能最为强大,因为环绕通知,可以控制目标方法是否执行。

以后可以使用环绕通知做 权限控制,事务控制,日志收集和处理,

检测程序的执行性能(时间)

 

注意事项:

Spring的入门案例3

 

10.切入点表达式的写法

粒度:按类匹配   粗粒度

1.within表达式

Within(包名.类名)     within(service.UserServiceImpl)  匹配UserServiceImpl的全部操作

within(service.*)  

匹配service包下一级子类

within(service..*)

匹配service包下的所有的子孙类

 

 

11.AOP的调用原理

1.spring容器解析到AOP标签时,开启启动AOP的相关配置

2.当解析到切入点表达式时,该表达式会进入spring内存中保留

3.当解析到切面类时,首先会为切面创建对象。并且根据切入点表达式,和通知的匹配关系进行绑定。

 

4.如果从容器中获取对象时,如果该对象与切入点表达式中的规则匹配。

则会为其创建代理对象,如果该类实现了接口,则会为其创建JDK的代理,如果该类没有实现接口,则会采用cglib进行代理。代理对象创建完成后,交给用户使用。

 

5.当代理对象执行方法时,则会执行与切入点表达式绑定的通知方法。