你的位置:首页 > Java教程

[Java教程]Spring代理模式


Spring代理模式大致分为静态代理模式和动态代理模式。

二者区别:

静态代理模式:
灵活性不强;如果有1000个dao;就有1000个代理类;没有做到通用性

静态代理模式:

package StaticProxy;public interface PersonDao {    public void sava();    public void update();}

package StaticProxy;public class PersonDaoimpl implements PersonDao {  public String user = null;  PersonDaoimpl(){}  /**   * @return the user   */  public String getUser() {    return user;  }  /**   * @param user the user to set   */  public void setUser(String user) {    this.user = user;  }    PersonDaoimpl(String user){    this.user = user;  }    @Override  public void sava() {    // TODO Auto-generated method stub    System.out.println("进入方法");  }  @Override  public void update() {    // TODO Auto-generated method stub      }}

package StaticProxy;import JDKProxy.impl.PersonDaoImpl;//静态代理类public class personproxy implements PersonDao{  public PersonDaoimpl persondaoimpl;    public personproxy(PersonDaoimpl persondaoimpl){    this.persondaoimpl = persondaoimpl;  }    @Override  public void sava() {    // TODO Auto-generated method stub    if(persondaoimpl.getUser() != null){      persondaoimpl.sava();    }  }  @Override  public void update() {    // TODO Auto-generated method stub      }  }

测试类:

package StaticProxy;public class Test {    public static void main(String[] args) {    //创建代理类    personproxy pro = new personproxy(new PersonDaoimpl());    pro.sava();  }}

效果图:

 

动态代理模式:
JDK : proxy
要求:目标类要有实现接口

package JDKProxy;//接口public interface PersonDao {    public void sava(String name);  public void update(String name);  public String getUsername(String name);}

package JDKProxy.impl;import JDKProxy.PersonDao;public class PersonDaoImpl implements PersonDao {  private String user = null;    /**   * @return the user   */  public String getUser() {    return user;  }  /**   * @param user the user to set   */  public void setUser(String user) {    this.user = user;  }  public PersonDaoImpl(){}    public PersonDaoImpl(String user){    this.user = user;  }    @Override  public String getUsername(String name) {      System.out.println("这是getusername()方法");        return "oooo";  }  @Override  public void sava(String name) {        System.out.println("这是save()方法");      }  @Override  public void update(String name) {        System.out.println("这是update()方法");      }}

package JDKProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import JDKProxy.impl.PersonDaoImpl;/** * 代理工厂 * * @author Administrator * */public class JdkProxyFactory implements InvocationHandler {  private Object targetObject;  /**   * 生成代理对象   *   * @param targetObject   * @return   */  public Object createProxyObject(Object targetObject) {    this.targetObject = targetObject;    // 生成代理对象    // loader:目标类的加载器    // interfaces:目标类的所有接口    // 回调接口类    return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),        targetObject.getClass().getInterfaces(), this);  }  /**   * 代理类回调方法 在调用目标类方法的时候进行回调   * 调用目标类方法时进行拦截   */  @Override//环绕通知  public Object invoke(Object proxy, Method method, Object[] args)      throws Throwable {    PersonDaoImpl persondaoimpl = (PersonDaoImpl) this.targetObject;    Object invoke = null;        try {      //....begin():前置通知      if (persondaoimpl.getUser() != null) {        // 委派目标对象调用方法:调用的目标方法称为连接点        invoke = method.invoke(targetObject, args);      }      //.....commit():后置通知          } catch (Exception e) {      //callback():异常通知    }finally{      //close():最终通知    }        return invoke;  }}

测试:

package JDKProxy;import JDKProxy.impl.PersonDaoImpl;public class JdkProxyTest {  public static void main(String[] args) {    //创建动态代理工厂    JdkProxyFactory jdkproxy = new JdkProxyFactory();    //为目标类创建代理对象    PersonDao persondao = (PersonDao) jdkproxy        .createProxyObject(new PersonDaoImpl(""));    persondao.update("xxx");  }}

效果图;

 

您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦  如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 2276292708@qq.com如果需要转载,请注明出处,谢谢!!