编程时经常需要写一些工具类,大部分的工具类都是static的方法,由于static方法中不能引用非静态的变量,若我们需要使用配置文件中的变量该如何弄呢?请看下面的例子
springboot写法
/**
* jsoup通过代理爬取数据
*/
@Component
public class JsoupUtils {
private static Logger logger = LoggerFactory.getLogger(JsoupUtils.class);
private static boolean proxyFlag;//是否启用代理
private static String proxyHost;//代理地址
private static int proxyPort;//代理端口
private static String proxyUser;//代理登录用户名
private static String proxyPassword;//密码
@Value("${http.proxy.flag}")//这是对应的配置文件中的配置项
public void setProxyFlag(boolean proxyFlag){
JsoupUtils.proxyFlag = proxyFlag;
}
@Value("${http.proxy.host}")
public void setProxyHost(String proxyHost){
JsoupUtils.proxyHost = proxyHost;
}
@Value("${http.proxy.port}")
public void setProxyProt(int proxyPort){
JsoupUtils.proxyPort = proxyPort;
}
@Value("${http.proxy.user}")
public void setProxyUser(String proxyUser){
JsoupUtils.proxyUser = proxyUser;
}
@Value("${http.proxy.pass}")
public void setProxyPassword(String proxyPassword){
JsoupUtils.proxyPassword = proxyPassword;
}
/**
* 通过代理访问信息
*
* @param url 请求地址 带参数
* @return
*/
public static Document getMessageWithProxy(String url) throws Exception{
if(proxyFlag) {
MyAuthenticator.setDefault(new MyAuthenticator(proxyUser, proxyPassword));
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
return Jsoup.connect(url).ignoreContentType(true).proxy(proxy).get();
}
return Jsoup.connect(url).ignoreContentType(true).get();
}
}
/**
* 重写代理认证
*/
class MyAuthenticator extends Authenticator {
private String user = "";
private String password = "";
public MyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
注意事项
1.类需要添加@Component注解,这样spring才会扫描到该类,并将配置信息注入
2.需要将变量命名为static的,然后通过sping注入时对静态变量赋值
传统spirngmvc写法
/**
* 通过代理访问信息
*
* @param url 请求地址 带参数
* @return
*/
public static Document getMessageWithProxy(String url) throws Exception{
Configuration config = new PropertiesConfiguration("conf.properties");
boolean proxyFlag = config.getBoolean("httpclient.proxy.flag");
if(proxyFlag) {
String proxyHost = config.getString("httpclient.proxy.host");
int proxyPort = config.getInt("httpclient.proxy.port");
String proxyUser = config.getString("httpclient.proxy.user");
String proxyPassword = config.getString("httpclient.proxy.password");
MyAuthenticator.setDefault(new MyAuthenticator(proxyUser, proxyPassword));
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
return Jsoup.connect(url).ignoreContentType(true).proxy(proxy).get();
}
return Jsoup.connect(url).ignoreContentType(true).get();
}
}
这里需要手动加载配置文件,然后再读取里面的值。