Going my way

いいなと思ったことをメモしていきます。

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

という名前で転送されます。


ちなみに前に書いたJavaFTPするコードはこんな感じです。
http://gomyownway.hatenablog.com/entry/2012/06/24/234212

前よりずいぶんすっきりしましたよねw
プロパティをハードコーディングするのは絶対良くないので。

あ、あと、
twitterやってます→@go_my_own_way
https://twitter.com/go_my_own_way

気軽にフォローしてください~(フォロワーいなくて寂しいw)