目录
目录
文章目录
  1. 概述
  2. 笔记

Spring(学习笔记 二)

概述

  • Spring框架所使用的主要设计模式
    • 代理设计模式(实现AOP的基础)
      • 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法,一是修改原有的方法,但是这样做的的话违背了开闭原则,不是很好。二是采用一个代理类调用原来的方法,且对产生的结果进行控制,使用代理模式可以将功能划分的更加清晰,有助于后期维护。
    • 装饰器设计模式(实现框架整合的基础)

笔记

  • Spring框架的AOP:面向切面编程

    • 代理设计模式分类
      • 静态代理:通过自己定义类来实现代理设计模式。
        • 原型类、原型接口、代理类都需要自己实现。
        • 弊端:通常情况下,一个原型类对应一个代理类。
      • 动态代理:通过JDK提供的功能来生成类,来实现代理设计模式。
        • 自行定义原型类、原型接口
        • 系统自动生成原型类所定义的代理类
    • 代理设计模式的实现(静态代理)

      • 代理类、原型类、原型接口
      • 在代理类中切入代码

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        // 原型接口
        public interface Sourceable {
        public void talk() throws Exception;
        }
        // 原型类
        public class Source implements Sourceable {
        @Override
        public void talk() throws Exception {
        System.out.println("hello");
        }
        }
        // 代理类
        public class proxy implements Sourceable {
        private Source source;
        public proxyImpl(Source source) {
        super();
        this.source = source;
        }
        // 下面这种引入也是可以的,推荐上面那种引入方式
        // private Source source = new Source();
        @Override
        public void talk() throws Exceptions {
        System.out.println("Start");
        source.talk();
        System.out.println("End");
        }
        }
      • 其中代理类中的System.out.println("Start");System.out.println("End");就是切入的代码。

  • AOP在Spring框架中的应用,AOP代码的切入,只能切入到IoC创建的对象中。

    • 创建一个通知Advice:代码切入的方式(在什么情况下进行切入),如下
      • Interception:在原型类代码的执行过程中进行切入。
      • Before:在原型类代码执行前切入
      • After:在原型类代码执行后切入
      • Throw:在原型类代码执行异常时切入
      • Introduction: 在原型类代码执行完成后切入
    • 切入点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 创建一个通知
public class MethodAop implements org.aopalliance.intercept.MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
try {
System.out.println("开始事务");
Object object = method.proceed();
System.out.println("提交事务");
return object;
} catch(e) {
System.out.println("回滚事务");
}
}
}