1.前言
在使用SpringMVC框架的时候,难免会有需要在静态方法中使用Spring的bean的情况。
静态方法,不能直接引用注入的bean,而注入的bean也不可以标识为static。
2.解决思路
通过一个中间介质,将注入的bean,传入静态方法
3.案例
3.1 需求
将数据库的FTP配置,读取,然后连接FTP做一些FTP操作。
通常FTP的配置会写在配置文件里面,但是每次修改都得重启服务,所以我把这些参数通过数据库维护,这样就可以动态更改这些参数了。
3.2 代码实现
@Component
public class FTPUtil {
//通过dicService读取数据库中的FTP参数
@Autowired
private DicService dicService;
private static FTPUtil fTPUtil;
private static String FTPControlEncoding = "GBK";
private static int PORT;
private static String FTPUSER;
private static String FTPIP;
private static String FTPPSS;
public void setDicService(DicService dicService) {
this.dicService = dicService;
}
//通过init方法,
//1.注入bean(dicService)
//2.赋值给static FTPUtil fTPUtil
//3.使用dicService的时候,就通过fTPUtil来取
@PostConstruct
public void init() {
fTPUtil = this;
fTPUtil.dicService = this.dicService;
}
/**
* 每次链接FTP,初始化参数
*/
public synchronized static FTPClient getFTPClient() {
//fTPUtil.dicService取到注入的dicService
List<DicEntity> dicList=
fTPUtil.dicService.queryListByDicType(Constant.FTP_INFO);
for (int i = 0; i < dicList.size(); i++) {
String dicCode = dicList.get(i).getDicCode();
String dicCont = dicList.get(i).getDicCont();
if (Constant.FTP_INFO_IP.equals(dicCode)) {
FTPIP = dicCont;
}
if (Constant.FTP_INFO_USER.equals(dicCode)) {
FTPUSER = dicCont;
}
if (Constant.FTP_INFO_PASSWORD.equals(dicCode)) {
FTPPSS = dicCont;
}
if (Constant.FTP_INFO_PROT.equals(dicCode)) {
PORT = Integer.parseInt(dicCont);
}
}
FTPClient ftp = new FTPClient();
ftp.setControlEncoding(FTPControlEncoding);
try {
ftp.connect(FTPIP, PORT);
ftp.login(FTPUSER, FTPPSS);
int reply = ftp.getReplyCode();
System.out.println(reply);
// 切换传输方式,防止FTP使用默认的传输方式ASCII导致文件被破坏
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// ftp.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(reply)) {
System.out.println("连接异常");
ftp.disconnect();
System.out.println("FTP连接断开");
}
} catch (Exception e) {
e.printStackTrace();
}
return ftp;
}