通过 spring aop 注解实现自动代理-mile米乐体育
最近在做一个数据对接项目,通过hessian与其他企业对接数据。但是公司电脑不能上网只能通过代理上网。如果每个方法都写代理的代码太繁琐,而且项目发布到服务器上的时候服务器是可以上网的。即便通过配置文件配置各个类是否使用代理,但是当发布的时候修改配置文件的内容也会比较多。所以就想到了通过注解 aop的方式实现自动调用代理。
http代理接口如下,其中的startproxy()为开始使用代理,endproxy()为结束使用代理,在需要用到的时候开启,不用的时候关闭,这样避免其他不需要使用代理的接口出现问题。
package com.tiamaes.gjds.proxy; /** *类描述: http代理接口
*创建人:王成委
*创建时间:2015年1月16日 上午9:00:53
*米乐app官网登录的版权说明: © 2015 tiamaes
*/ public interface httpproxy { public void startproxy(); public void endproxy(); public string getusername(); public void setusername(string username); public string getpassword(); public void setpassword(string password); public string gethost(); public void sethost(string host); public int getport(); public void setport(int port); }
实现类如下
package com.tiamaes.gjds.proxy; import java.net.authenticator; import java.net.passwordauthentication; /** *类描述: http代理
*创建人:王成委
*创建时间:2015年1月15日 下午5:09:16
*米乐app官网登录的版权说明: © 2015 tiamaes
*/ public class proxyauthentication extends authenticator implements httpproxy{ private string username; private string password; private string host; private int port; public proxyauthentication(){ } public proxyauthentication(string host,int port){ this.host = host; this.port = port; } public proxyauthentication(string host,int port,string username,string password){ this.host = host; this.port = port; this.username = username; this.password = password; } public passwordauthentication getpasswordauthentication(){ return new passwordauthentication(username,password.tochararray()); } /** * 开始使用代理 * @author 王成委 */ public void startproxy(){ system.setproperty("http.proxyset", "true"); system.setproperty("http.proxyhost", host); system.setproperty("http.proxyport", string.valueof(port)); if(username != null && !"".equals(username)) authenticator.setdefault(this); } /** * 停止使用代理 * @author 王成委 */ public void endproxy(){ //system.se system.setproperty("http.proxyset", "false"); system.setproperty("http.proxyhost", ""); system.setproperty("http.proxyport", ""); authenticator.setdefault(null); } public string getusername() { return username; } public void setusername(string username) { this.username = username; } public string getpassword() { return password; } public void setpassword(string password) { this.password = password; } public string gethost() { return host; } public void sethost(string host) { this.host = host; } public int getport() { return port; } public void setport(int port) { this.port = port; } }
注解的代码如下
package com.tiamaes.gjds.dxp.annotation; import java.lang.annotation.documented; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; /** *类描述: 使用代理设置
*:eg * @useproxy * public object getbyhttp(){ * ...... * } **创建人:王成委
*创建时间:2015年2月9日 下午4:41:27
*米乐app官网登录的版权说明: © 2015 tiamaes
* @see com.tiamaes.gjds.dxp.aop.proxymanager * */ @target({elementtype.parameter, elementtype.method}) @retention(retentionpolicy.runtime) @documented public @interface useproxy { }
aop切面的代码如下,这个是核心代码,原理就是监控带有useproxy注解的方法,在方法执行前调用startproxy启动代理在方法执行结束后调用endproxy结束代理。
package com.tiamaes.gjds.dxp.aop; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.annotation.around; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.pointcut; import com.tiamaes.gjds.proxy.httpproxy; /** *类描述: 通过注解{@link com.tiamaes.gjds.dxp.annotation.useproxy}配置方法使用http代理
*创建人:王成委
*创建时间:2015年2月9日 下午4:42:06
*米乐app官网登录的版权说明: © 2015 tiamaes
* @see com.tiamaes.gjds.dxp.annotation.useproxy */ @aspect public class proxymanager { private httpproxy httpproxy; private boolean proxyenabled = true; public void sethttpproxy(httpproxy httpproxy) { this.httpproxy = httpproxy; } public void setproxyenabled(boolean proxyenabled) { this.proxyenabled = proxyenabled; } @pointcut("@annotation(com.tiamaes.gjds.dxp.annotation.useproxy)") public void proxyaspect() { } @around("proxyaspect()") public object doinvoke(proceedingjoinpoint joinpoint) throws throwable{ if(httpproxy == null || !proxyenabled){ return joinpoint.proceed(); } this.httpproxy.startproxy(); object result = joinpoint.proceed(); this.httpproxy.endproxy(); return result; } }
spring配置如下
使用方法如下
@useproxy @override public listgetdriverinfos(list queryinfos, int page, int pagesize) throws hessianexception{ list drivers = null; try { kelidriverqueryapi api = this.createapibyurlkey(kelidriverqueryapi.api_url, kelidriverqueryapi.class); drivers = api.getdriverinfos(queryinfos, page, pagesize); } catch (malformedurlexception e) { throw new connotgethessianapiexception("无法创建远程接口"); } return drivers; }
只需要在方法上面加一个注解就可以实现自动调用http代理。在不需要http代理的时候直接把spring配置文件中关的内容删掉就可以了,其实直接删除proxymanager的配置就可以了。