Spring代理模式

1.静态代理

抽象主题 :Subject

public interface Subject {
    public String add();
}

目标对象:ReSubject

public class ReSubject implements Subject {
    public String add() {
        System.out.println("ok!");
        return "";
    }
}

代理对象:Psubject

public class Psubject implements Subject {

    private Subject reSubject;

    public Subject getReSubject() {
        return reSubject;
    }

    public void setReSubject(Subject reSubject) {
        this.reSubject = reSubject;
    }

    public String add() {
        System.out.println("开启!");
        return reSubject.add();
    }
}

单侧

 //静态代理
    @Test
    public void test12(){
        Subject subject=new ReSubject();
        Psubject psubject=new Psubject();
        psubject.setReSubject(subject);
        psubject.add();
    }

2.动态代理

接口

public interface IUserDAO {
    public String add();
    public String edit();
}

public class UserDAOImpl implements IUserDAO{
    public String add() {
        System.out.println("add");
        return "add";
    }

    public String edit() {
        System.out.println("edit");
        return "edit";
    }
}

单侧

//动态代理
    @Test
    public void test13(){
       final IUserDAO dao=new UserDAOImpl();
       IUserDAO pp=(IUserDAO) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               System.out.println("开启");
               method.invoke(dao,args);
               return null;
           }
       });
       pp.add();
       pp.edit();
    }

3.cglib动态代理

public class Userservice {
    public void delete(){
        System.out.println("ok");
    }
}

单侧(两种方式)

 /*cglib动态代理*/
    @Test
    public void test14(){
        final Userservice servive=new Userservice();
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(servive.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("开启");
                methodProxy.invoke(servive,objects);
                return null;
            }
        });
       /* enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler() {
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("开启");
                method.invoke(servive,objects);
                return null;
            }
        });*/
        Userservice aa =(Userservice) enhancer.create();
        aa.delete();
    }

时间: 2024-10-12 13:17:06

Spring代理模式的相关文章

spring代理模式 service远程调用,插件执行

最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下. 1.远程service调用过程 首先看一下类的继承结构 封装调用处理过程 封装service调用接口 封装service请求信息 封装请求信息处理类 先描述一个调用过程: 平台在controller里面获取service的时候都是通过lookup方式(就是用了spring查找service的bean对象的代理对象),远程的service配到配置文件里面,所以在lookup的时候,如果配置文件中有的service,返

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

代理模式 与 Spring AOP

AOP:在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(例如Logging.Security),这样的逻辑称为Cross-cutting concerns,将Cross-cutting concerns独立出来设计为一个对象,这样的特殊对象称之为Aspect,Aspect-oriented programming着重在Aspect的设计上以及与应用程序的织入(Weave). 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把

代理模式及其在spring与struts2中的体现

代理模式 代理模式有三个角色组成: 1.抽象主题角色:声明了真实主题和代理主题的共同接口. 2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口. 3.真实主题角色:定义真实的对象. 我们先来看传统方式下一个Proxy的实现实例. 假设我们有一个UserDAO接口及其实现类UserDAOImp: UserDAO.java: public interface UserDAO { public void saveUser(User user); } UserDAOImp.ja

Java 设计模式(八) Proxy(代理)模式及Spring引申

Proxy 基本概念 代理模式(Proxy pattern)是一种使用率非常高的模式: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫作委托模式,它是一项基本设计技巧 Proxy中的角色 Subject(抽象主题类):既可以是抽象类也可以是抽象的接口 RealSubject(具体的主题角色):是被委托角色或者说是被代理角色 Proxy(代理主题角色):是委托类或者代理类: 它负责对真实的角色的应用 把Subject定义的方法限制委托给RealSubject实现 在RealSubjec

从代理模式到Spring AOP

什么是代理模式 假如我喜欢上隔壁班的翠花,但是我没胆量向她送花,这时候我需要一个铁杆哥们帮我做这件事, 很明显这哥们是个代理,是去执行任务的,但是花实际上是我"送"的,代理和我一样会送花这个动作,直接上代码. 1 public interface IProcess { 2 void SendFlower(); 3 } 1 public class Studnet1 implements IProcess { 2 3 @Override 4 public void SendFlower(

Spring学习五、Java配置Spring与代理模式

九.使用Java的方式配置Spring JavaConfig是Spring的一个子项目,在Spring4之后,成为了核心功能 @Configuration public class MyConfig { @Bean public User getUser() { return new User(); } } 纯Java配置,在SpringBoot中随处可见 十.代理模式 代理模式是SpringAOP的底层! 代理模式的分类 静态分类 动态代理 10.1 静态代理 角色分析: 抽象角色:一般会使用

【设计模式】代理模式:静态代理,动态代理,spring aop

代理模式分为静态代理和动态代理.我们拿链家来举例子,我们本人是真实的对象,有真实的业务需求:需要去找房子:链家是中介,是代理类,他来帮我执行找房子的这个操作. 静态代理: 1.实现一个接口 public interface SearchHome { public void search(); } 2.构建实现接口的委托类 public class Master implements SearchHome { @Override public void search() { System.out.

【Spring入门系列】代理模式和AOP

代理模式概述 代理是一种设计模式,提供了对目标对象另外的访问方式,通过代理对象访问目标对象.这样可以在目标对象功能实现的基础上,增加额外的功能,从而达到扩展目标对象功能的效果.简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式. 静态代理 这种代理方式需要代理对象和目标对象实现一样的接口. 优点:可以在不修改目标对象的前提下扩展目标对象的功能. 缺点:1.冗余,由于代理对象要实现与目标对象一致的接口,会产生过多的代理类.2.不易维护,一旦接口增加方法,