Day03
一、 注入接口类型的属性值
注入策略:先按照属性名作为id去匹配,成功则注入否则进行第二个规则,按照类型进行匹配,成功则注入否则进入第三个规则,搜索工程中接口的唯一实现类,找到则注入,找不到不做任何操作,找到多个报错,见下图:
如果工程中需要一个接口有多个实现类,解决方案:
- 通过Qualifier注解指定注入的id
- 修改类在Spring容器中的的id
二、 Spring 容器目前所学内容的好处
降低耦合度,Spring容器+面向接口编程是目前降低耦合度 做的最好的一种方案
三、 AOP:面向切面编程
代理:1.代理对象必须和被代理对象有相同的方法
2.代理对象除了做被代理者核心业务之外还要做其它额外操作
买房子demo实现流程:
- 创建客户、大老板、链家三个对象
- 创建接口类 限制大老板和链家有相同的方法
- 在链家中创建一个大老板的属性并且在构造方法中赋值
- 在链家中执行卖房的方法的时候同时执行大老板的卖房方法,并在方法之前后添加额外输出(带看和收中介费)
- 在客户类中的买房方法中创建链家 调用链家的卖房方法,创建测试类测试
四、 静态代理
解决了什么问题:把事务代码从service层中提取出来降低了耦合度,易于扩展
优点:低耦合
缺点:1.静态代理一个代理只能代理一个类
2.一个代理中重复代码太多 不能复用
五、动态代理JDK
优点:1.延续静态代理的优点 2.代码重用,一个动态代理类可以为多个Service生成代理对象
缺点:1.JDK的动态代理必须要求被代理类有接口
2.代理类中的方法是统一添加了事务或者权限控制代码,不容易进行方法的过滤
六、动态代理CGLib
CGLib动态代理方式是Spring框架中提供的代理方式
优点:1.延续jdk动态代理的优势 2.不需要必须有接口
缺点:代理类中的方法是统一添加了事务或者权限控制代码,不容易进行方法的过滤
七、Spring框架提供的AOP
- 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。 切面实际上指的就是一个类,做特定业务的类(事务切面、权限控制切面、日志等)
- 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 连接点指的是目标类中的各个方法
- 通知(Advice):在切面的某个特定的连接点上执行的动作。切面中的各个方法叫做通知
- 切入点(Pointcut):匹配连接点的断言。决定是否执行连接点的规则
- 目标对象(Target Object): 按原来的理解去记,被代理的对象
- AOP代理(AOP Proxy):代理对象
- 织入(Weaving):把切面添加到业务中的一个过程
通知类型:
- 前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
- 后置通知(After returning advice):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
- 异常通知(After throwing advice):在方法抛出异常退出时执行的通知。
- 最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
- 环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
八,SpringAOP实现过程:
- 导入jar包 5个
- 创建事务切面类
- 在切面类中添加通知方法
- 创建连接点
- 添加约束 导入约束文件
导入约束文件
- 在配置文件中配置切面
九、切入点表达式:
within(包名和类名)此种表达式力度太粗只能限定包和类 不能限定方法
举例1:
within(service.*) service包下面所有类的所有方法
举例2:
within(*.*)所有类的所有方法
举例3:
within(service..*) service包下所有类及所有子包下所有类的所有方法
举例4:
within(service.UserServiceImpl) service包下UserServiceImpl类下所有方法
为什么要用spring的Aop:
如果直接把事务写到Service中耦合度太高不易维护,代码重复太多,使用静态代理的话可以解决耦合度高的问题,单仍然存在代码重复太多而且每一个类都需要创建一个代理类,使用JDK动态代理解决了代码复用问题,但是这个类必须要求实现接口,使用CGLib动态代理解决了必须有接口的问题,但是两种动态代理的方式都不方便进行目标方法的过滤,使用Spring容器的Aop 通过切入点可以方便的过滤目标方法