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 如果需要转载,请注明出处,谢谢!!