微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring-aop

代理模式
这是springAOP的底层
1.静态代理
2.动态代理


静态代理
角色:
1.抽象角色:一般为接口或者抽象类
javapublic interface Rent { public void rent(); }
2.真实角色:被代理
```javapackage com.zhang.demo01;

  public class Host implements Rent{
     public void rent(){
         System.out.println("租房");
     }
  }
  ```
  3.代理角色:代理真实角色,一般做一些附属工作
```java

package com.zhang.demo01;

public class Proxy {
private Host host;

public Proxy() {
}

public Host getHost() {
    return host;
}

public void setHost(Host host) {
    this.host = host;
}

public Proxy(Host host) {
    this.host = host;
}
public  void rent(){
    seeHouse();
    host.rent();
    qianHetong();
    shouFei();
}
public void seeHouse(){
    System.out.println("看房子");
}
public void shouFei(){
    System.out.println("收费");
}
public void qianHetong(){
    System.out.println("签合同");
}

}
4.客户端访问 javapackage com.zhang.demo01;

public class Client {
public static void main(String[] args) {
Host host = new Host();
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
```
好处:使真实角色更加简洁,公共业务分给代理,公共业务扩展时,方便集中管理
缺点:一个真实角色会有一个代理觉得,代码量翻倍

动态代理
1.动静角色一致
2.代理类为自动生成
3.动态代理分为两大类:基于接口的和基于类的
1.基于接口:jdk动态代理
2.基于类:cglib
3.Java字节码
好处:

动态代理万能模板

//自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Object target;//可以修改成自己的接口

    public void setTarget(Object target) {
        this.target = target;
    }

    //生成得到道理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);//此处target也可以改成自己接口
    }
    //处理代理类,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质就是反射
        Object result = method.invoke(target, args);//此处亦然
        return result;
    }
}
public class Client {
    public static void main(String[] args) {
        //真实角色
        Host host=new Host();
        //代理角色
        ProxyInvocationHandler phi = new ProxyInvocationHandler();
        //通过调用处理程序来处理我们要调用的接口
        phi.setRent(host);//设置代理对象
        Rent proxy = (Rent)phi.getProxy();
        proxy.rent();

    }
}

实现方法

aop
1.使用spring接口
导包:aop织入

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

2.使用spring api接口
3.使用自定义类(主要是切面)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐