首页 > 学院 > 开发设计 > 正文

Spring代理模式

2019-11-15 01:11:08
字体:
来源:转载
供稿:网友
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如果需要转载,请注明出处,谢谢!!

  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表