Springのセッターインジェクションを使ってみる~JavaでFTPを実行するツールの改修~
Advertisements
昨日Springをインストールしたので、
http://gomyownway.hatenablog.com/entry/2012/07/07/214727
せっかくだからFTPを実行するコードにセッターインジェクションを組み込んでみた。
FTPを実行するクラス
package ftptool; import java.io.FileInputStream; import java.io.IOException; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; public class SendFileByFtp { private static int port; private static String host; private static String user; private static String passWord; private static int fileType; private static String sendLocalFileName; private static String sendRemoteFileName; private static String makeRemoteDirectoryName; public void setPort(int port){ this.port = port; } public void setHost(String host){ this.host = host; } public void setUser(String user){ this.user = user; } public void setPassWord(String passWord){ this.passWord = passWord; } public void setSendLocalFileName(String sendLocalFileName){ this.sendLocalFileName = sendLocalFileName; } public void setFileType(int fileType){ this.fileType = fileType; } public void setSendRemoteFileName(String sendRemoteFileName){ this.sendRemoteFileName = sendRemoteFileName; } public void setMakeRemoteDirectoryName(String makeRemoteDirectoryName){ this.makeRemoteDirectoryName = makeRemoteDirectoryName;; } public static void sendFile(){ boolean error = false; //FTPクライアントをDIする書き方わからん FTPClient ftpClient = new FTPClient(); FileInputStream fis = null; try{ ftpClient.connect(host,port); System.out.println(host+" に接続しています..."); System.out.println(ftpClient.getReplyString()); int reply = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP接続を拒否されました"); System.exit(1); } if(ftpClient.login(user, passWord) == false){ System.out.println("ログインに失敗しました"); System.exit(2); } //ファイルの転送を行う fis = new FileInputStream(sendLocalFileName); ftpClient.setFileType(fileType); ftpClient.makeDirectory(makeRemoteDirectoryName); ftpClient.storeFile(makeRemoteDirectoryName+sendRemoteFileName,fis); System.out.println("FTP接続を切ります"); ftpClient.logout(); }catch(IOException e){ error = true; e.printStackTrace(); } finally { if(ftpClient.isConnected()) { try{ ftpClient.disconnect(); }catch(IOException ioe){ } } System.exit(error ? 1 :0); } } }
特筆すべきは、プロパティは全てBeans.xmlに書いてあるから、宛先を変えるときにプログラムを修正する必要がないということ。
こうすることによって、モジュールごとのつながりが疎結合になって、変更に強いプログラムになった。
beans.xmlはこんな感じ。
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="sendFileByFtp" class="ftptool.SendFileByFtp" > <property name="port"> <value>21</value> </property> <property name="host"> <value>sakura</value> </property> <property name="user"> <value>XXXXXX</value> </property> <property name="passWord"> <value>XXXXXXXXXX</value> </property> <property name="sendLocalFileName"> <value>C://Users//hoge//Desktop//tmp2//hoge.txt</value> </property> <property name="fileType"> <value>2</value> </property> <property name="sendRemoteFileName"> <value>foo.txt</value> </property> <property name="makeRemoteDirectoryName"> <value>/var/www/ftptest/</value> </property> </bean> </beans>
このbeans.xmlに設定を書けば、あとはセッターを通じてSpringが値を注入してくれる。
これをDI(Dependency Injection)という。
最後、mainクラスはこんな感じ。
package ftptool; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; public class Main { public static void main(String[] args){ BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); SendFileByFtp sendFileFtp = factory.getBean("sendFileByFtp",SendFileByFtp.class); sendFileFtp.sendFile(); } }
結果として、ローカルのhoge.txtがFTPサーバの
/var/www/ftptestディレクトリ以下に
foo.txt
という名前で転送されます。
ちなみに前に書いたJavaでFTPするコードはこんな感じです。
http://gomyownway.hatenablog.com/entry/2012/06/24/234212
前よりずいぶんすっきりしましたよねw
プロパティをハードコーディングするのは絶対良くないので。
あ、あと、
twitterやってます→@go_my_own_way
https://twitter.com/go_my_own_way
気軽にフォローしてください~(フォロワーいなくて寂しいw)