使用Spring注解,在静态方法中注入bean

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 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;
    }

你可能感兴趣的:(小知识点)