Spring的入门案例3
1.Spring的加载机制
2.代理模式:
房东 黑中介 住户
任务:
房东:把房出租,换点零花钱
中介:帮房东出租房屋(最基本的任务),获取中介费
住户:有床就行
代理模式图:
代理的特点:
1.代理对象应该实现被代理者相同的接口
2.代理应该完成自己的本职工作(房东想做的事情)
3.完成额外的操作
代理的意义:
在完成自己本职工作的同时,完成了额外的操作,对方法进行了额外的扩展。
3.静态代理(思想):
场景:为软件中添加事务操作
代码分析:
问题分析:
1.更新数据库的方法都需要添加事务控制,如果该方法有100个,需要编写同样的代码100次 代码复用性特别的差
2.业务处理类和事务控制类,紧紧的耦合在一起,如果将来做扩展,需要修改原有代码。 耦合性较高
静态代理:
需要解决的问题:
需要将事务代码和业务代码进行分离。同时满足功能需要。
代理的实现:
静态代理的优点和缺点:
优点:
能够将业务处理和事务控制进行分离,实现了解耦
缺点:
1.代码大量的重复,只要有更新数据库的操作,必须添加事务控制
2.静态代理只能代理一类业务,如果需要处理其他业务,需要重新定义代理对象。 代理对象不能通用
4.动态代理模式:
JDK的动态代理模式:
CgLib动态代理:
说明:
JDK的动态代理需要目标对象必须实现接口,否则不能生成代理对象
cgLib动态代理不需要接口也能生成代理对象,因为生成的代理对象是目标对象的子类。
cglib动态代理:
class service.UserServiceImpl$$EnhancerByCGLIB$$485b4ba7
JDK的动态代理:
class com.sun.proxy.$Proxy6
一般情况下,使用JDK居多,特定环境下才使用cglib
如果目标对象有接口则采用JDK动态代理,如果目标对象没有接口采用cglib动态代理。
JDK创建代理对象的速度较快。
代理对象的运行速度cgLib快
5.动态代理
6.AOP介绍:
面向切面编程
OOP:面向对象
AOP:弥补了面向对象的不足
说明:
程序正常执行时,有固定的轨迹。当执行到某一个特定的点时,程序执行的轨迹发生了改变,在代理对象中执行应有的操作。执行完成之后回到正常的执行轨迹中。
7.Spring中的AOP
1.名词解释:
1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。 ------ 一个类
2.连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。
客户端调用的方法
3.通知(Advice):在切面的某个特定的连接点上执行的动作。
切面中的方法
3.切入点(Pointcut):匹配连接点的断言。
就是一种判断规则,如果满足了判断则会执行切面中的通知。
如果没有满足规则,程序不能执行通知方法
4.目标对象(Target Object): 被一个或者多个切面所通知的对象。
被代理者
8.AOP入门案例:
1.引入jar 5个jar包
2.定义切面类
3,定义连接点
4.定义通知
5.配置切面:
9.通知的类型
1.环绕通知
在目标方法执行之前,执行之后都要执行
2.前置通知(Before advice):
在目标方法执行之前执行
3.后置通知(After returning advice):
在目标方法执行之后执行
4.异常通知(After throwing advice):
目标方法执行后抛出异常才执行
5.最终通知(After (finally) advice):
在目标方法执行之后 都会执行的通知
说明:
5大通知类型中,环绕通知功能最为强大,因为环绕通知,可以控制目标方法是否执行。
以后可以使用环绕通知做 权限控制,事务控制,日志收集和处理,
检测程序的执行性能(时间)
注意事项:
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.当代理对象执行方法时,则会执行与切入点表达式绑定的通知方法。