Java Springの逆引きメモ -15ページ目

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

SpringJDBCを使用している場合にSQL文をログ出力するには簡単な方法があります。


実は、DEBUGモードにするとSpringJDBCはSQL文を出力してくれます。

しかし、さすがDUBUGモード。

SQL文以外も多量のログが出力されます。


ですので、Log4jの機能を使用して制限します。


【Log4jのpropertiesファイル】

以下の設定を追加します。

stdoutに出力する場合のイメージです。



#SpringJdbcのログ出力(SQL文)
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, stdout
log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=DEBUG, stdout
log4j.additivity.org.springframework.jdbc.core.StatementCreatorUtils=false


※stdoutは別途設定しておきます。例としては以下の感じです。


#stdoutの設定(出力先など)

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n




【説明】

SQL文の出力は、org.springframework.jdbc.core.JdbcTemplateが行っています。

出力例:↓

2009-03-28 13:47:45,765 [http-8080-Processor24] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [select * from member where id like ? || '%']


しかし、これだけを出力しても?の値は分かりません。

その値を出力させるのが、org.springframework.jdbc.core.StatementCreatorUtilsです。

出力例:↓

2009-03-28 13:47:45,812 [http-8080-Processor24] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [2009], value class [java.lang.String], SQL type unknown

これで、SpringJDBCで実施したSQL文はすべてコンソールに出力されますね!にひひ



ちなみに以下の設定は、重複してログを出させないための設定で、Log4jのための設定です。

Springとは関係ありません。

どうもLog4jは、デフォルトでlog4j.logger.・・・の設定の数だけ同じログが出力されるようです。

(正直なぜデフォルト?と思いますが。。)

log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false



【メインのログファイルと別のファイルに出力する場合】

ここからはLog4jの機能の話になるので、Springは関係ありませんが、一応書いておきます。

以下のように追記すればOKです。


#SpringJdbcのログ出力(SQL文)
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, stdout, logfile
log4j.additivity.org.springframework.jdbc.core.JdbcTemplate=false
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=DEBUG, stdout, logfile
log4j.additivity.org.springframework.jdbc.core.StatementCreatorUtils=false


#ログファイルの設定
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=c:/test_springapp.log
log4j.appender.logfile.Append=true
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

上記の設定で、コンソールと

c:/test_springapp.logに出力されます。



【補足】

ただし、上記の方法はすべてのSQL文を出力します。

もし、update系だけを出力したい、という場合は自分で処理を作るしかありません。

このあたりはAOPも使いにくい感じです。

考えられる方法は、DataSourceを拡張して自分で拡張したPrepareStatementなどを返すようにします。

その拡張されたPrepareStatementがexceuteなどを呼ばれたときにログを出力するようにします。

このときに、先頭が"update"で始まるもののみログ出力します。

(空白の除去やすべて小文字にしてからなどの注意点が必要です)


もう、このぐらいしか思いつきません。。

もしかしたら、そういったログを取るフレームワークがあるかもしれないですが。

すみません。調べましたが見つかりませんでした。




参考:

・トップ

・SpringJDBCの機能について

・SpringJDBCで作成したDaoとビジネスロジックを連携するには?

・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)

・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)

・NamedParameterJdbcTemplateをうまく使うには? (HashMap版)

・結果をMapの配列で受け取るには?

・DBにデータを登録するには?

・DBへのデータ登録を簡単にするには?

・実行したSQL文のログを出力するには?

設定ファイルの利用(Log4j)



XMLとは、タグで構成されたデータ形式です。

このデータ形式は、世の中の人がデータの持ち方を共有できるように標準化したものです。


書き方はHTMLと似ていますが、タグ名は自分で決めることができる点が違います。

また、HTMLの場合はタグが閉じていなくてもIEが勝手に推測して処理するのでエラーにはなりませんでした。

しかしXMLの場合は厳しくて、閉じていない場合はエラーになります。

書き方は以下のようになります。


【XML記述例】

<?xml version="1.0" encoding="UTF-8"?>
<Books>
 <Book>
  <Title>Spring入門</Title>
  <Author>鈴木</Author>
</Book>
 <Book>
  <Title>Spring基礎</Title>
  <Author>佐藤</Author>
 </Book>
</Books>



【記述に必要な項目】

・<?xml version="1.0" encoding="UTF-8"?>

 1行目の内容は、このテキスト文書がXMLであること。

 XMLのバージョンは1.0であること。

 文字コードは、UTF-8であること。

 を示しています。


 XMLは結構古い技術で、最初に規定したバージョン1.0とその後継のバージョン1.1があります。

 1.1は機能追加なので、1.0の内容を包含しています。


・<Books>

 ルートのタグです。トップの階層に存在するタグで、必ず1つである必要があります。

 Booksの部分(タグ名)は何でも自由に規定できます。

 ただし、必ず同じタグ名で閉じる(</Books>)必要があります。


・ルート配下のタグは自由に名前を付けられることはもちろん、

 複数記述することもできます。

 また、「Spring入門」のようはデータの記述部分に<や>のような文字は使用できません。

 ですので、エスケープする必要があります。(&lt; や&gt;と記述します)

 それと、データの記述部分の前後のスペースは無視されるので注意です。


・タグの順番

 XMLではタグの順番も意味を持っているので、順番を間違えないように書く必要があります。


・名前空間

 この例では名前空間を記述していませんが、名前空間が存在しています。

  記述例: <util:constant name="kind" value="car" />

 名前空間を使用すると、種類の違うタグを1つのXML内に同時に複数記述できるようになります。

 XMLを読み込む側は、名前空間を指定して読み込みできます。

 名前空間名も自分で自由に指定できます。

  xmlns:util="http://www.springframework.org/schema/util "

 のようにルートのタグの中で記述します。

 utilの部分が名前空間名で、自由に設定できる部分です。

 "http..."の部分は変更できません。
 

・空タグ

 <Author></Author>のようにデータがないタグの場合、<Author/> のように書けます。

【その他の関連する機能】

XMLについての説明は上記で以上ですが、これに付随する機能がいろいろな会社やコミュニティから提供されています。


・XMLパーサ

 XMLは見てのとおり、テキストなのでプログラムで文字列を連結するだけで作成できます。

 ですが、文字のエスケープをするのが面倒なことと、XMLの中からデータを検索するときに、

 それなりのプログラムを作成しなければならなくなるので面倒です。

 そこで、XMLのタグの作成と検索を実施するパーサと言うものが用意されています。

 この機能自体は標準で規定されているので、言語を問わずに似た使い方になっているのが特徴です。

 ただ、提供元はプログラム言語ごとにもことなるし、同じ言語でも違う会社から複数提供されていることも

 あります。


・DTD

 XMLは自由にタグの構成を決められるので、DBと違ってタグ名を間違えたりする可能性があります。

 または数字を入れるところに漢字を入れてしまったりもありえます。

 これらをチェックする機構がDTDです。

 DTD自体もテキストファイルです。

 割と細やかな設定ができますが、記述が面倒です。


・XMLSchema

 DTDと同じく、XMLの書式チェックをします。

 DTDより細かなチェックができ、記述もわかりやすいのが特徴のようです。

 今はこちらを使うことが多くなっているようです。



その他もいろいろありますが、Springを使用する上ではそれほど気にしなくていいので

キーワードだけで挙げておきます。

調べてみてください。

 ・XPath

 ・XSLT

 ・FOP (XMLからPDFを作ります)

 ・JSON (XMLに似たまた別記法のデータ形式)

 


参考:

DIの設定ファイルを書くには?


ここでは、SpringのDI設定ファイルの記述の仕方を簡単に見ていきます。


SpringのDIの設定ファイルはXML形式で書きます。

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 "
xmlns:util="http://www.springframework.org/schema/util "
xmlns:aop ="http://www.springframework.org/schema/aop "
xmlns:tx ="http://www.springframework.org/schema/tx "
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd ">



<!-- Beans -->
<bean id="locker" class="aop.lock.MixinLockerImpl" >

<property name="name" value="suzuki"/>

</bean>

</beans>



【説明】

XMLに詳しい方は、xmlns:xsi などの名前空間の設定は、上記の場合は意味が無いことが分かるかもしれないですね。(使用していないので)

ですが、ここではCopy&Pasteでほとんどのケースに対応できるように余分なものも記述しています。



<名前空間について>

一応、名前空間のそれぞれの意味を書いておきます。

名前空間 概要
空間名なし クラスの設定を記述するときに使用します。上記のbeanタグがそうです。
xmlns:util 定数やプロパティファイルの読み込みなどの設定を記述するときに使用します。
xmlns:aop AOPの設定を記述するときに使用します。
xmlns:tx トランザクションの設定を記述するときに使用します。




<beanタグについて>

beanは、初期値を設定されたクラスを表していると思ってください。

beanタグには属性があります。主に使用する属性を以下に示します。

属性名 概要
id

一意の名前をつけます。

プログラムからクラスを取得するときはこのid名で指定します。

class

このbeanで生成されるクラスを指定します。

パッケージ名を含むフルのクラス名を指定します。

name

bean名に特殊な記号を使用したい場合に使用します。

id属性は特殊な記号が使えないようになっています。

プログラムからは、id, nameのどちらかを指定してクラスを取得します。

scope

このbeanが生成される範囲(スコープ)。

設定されたbeanはプログラムからid名などで取得できます。

 例: appContext.getBean("locker");

このgetBean()を呼び出したときに、どのスコープでインスタンスを生成するかということです。

WEBにはスコープと言う概念が合りますが、それに近いものです。


【設定値】

・singleton ・・・どこでいつ取得しても同じインスタンスが返ります。

        (scopeのデフォルト値です)

・prototype・・・取得のたびに違うインスタンスが生成されます。
・request ・・・WEBのリクエストごとにインスタンスが生成されます。

・session ・・・WEBのセッションごとにインスタンスが生成されます。




<propertyタグについて>
beanタグの配下には、propertyタグを記述できます。

propertyタグは、beanを生成したときの初期値を設定するためのタグです。

実際には、クラスのsetterを呼び出しています。

上の例でいくと以下のようにするのと同じです。


タグ:
<bean id="locker" class="aop.lock.MixinLockerImpl" >

<property name="name" value="suzuki"/>

</bean>


Spring内部の処理の実際:

MixinLockerImpl locker = new MixinLockerImpl();

locker.setName("suzuki");


ちなみに、propertyタグでは、ref属性を使用して他のbeanを設定するのが普通です。

propertyタグの属性は以下のとおりです。

属性名 概要
name

プロパティ名(setter名)を記述します。

ref

他のbeanのidまたはnameを指定します。

指定されたbeanがこのクラスに設定されます。

value

文字列や数字を記述します。

内部では、クラスのsetterの引数の型になるべく変換するように努力しているようです。

例えば、setterの引数の型がClassの場合、文字列でパッケージを含むフルパスのクラス名で設定すると対象のクラスのClassを設定します。






【追加情報】

Spring IDEプラグインについてr

Springの設定ファイルをいじるときは、eclipseのプラグインをインストールしておくと便利です。

XMLファイル上で、Ctrl+Spaceを押すとタグを補完してくれます。

これによりあまりSpringの設定に詳しくない人もどんなタグを設定できるかが分かります。



インストール方法は、以下のとおりです。

①eclipseのヘルプ⇒ソフトウェア更新を開く

②使用可能なソフトウェアタブを開いて、「サイトの追加」ボタンを押す。

③以下のURLを入力して、OKを押せば、必要なプラグインをすべてインストールしてくれます。

 http://springide.org/updatesite/





参考:

・トップ

・DIの設定ファイルで外部ファイル(プロパティファイル)を参照するには?

・DIの設定ファイル内から外部DIファイルを参照するには?

・プロパティファイルをPropertiesクラスのbeanにするには?

・SpringJDBCの機能について

・DIxAOPの機能について

Strutsと連携するには?(理論編)

・MessageSourceを使いやすくするには?
Spring IDEを使ってみよう


かなり有名なJavaのフレームワークです!


メインはDIと呼ばれる機能ですが、DIを使用した様々な機能が提供されています。


【提供されている主な機能】

機能名 概要
DI

Dependency Injectionの略。

設定ファイルにクラスを設定することで、設定したクラスをプログラムから取り出せます。

このとき初期化する値を設定ファイルで指定することができます。

つまり、newする処理と初期化処理をプログラムの外に出せます。

アプリケーションを初期化する初期値をプログラムの外にファイル(.ini)として出すことは良くやります。値がハードコーディングされなくなるのでアプリケーションの依存度が下がります。このDI機能は初期化の値だけでなく、初期化するクラス自体をも外に出します。

こうすることでよりそれぞれが依存しない作りになります。

Springの他にもSeasarやEJBでもこの機能を提供しています。

また、Struts2でも似たような機能を提供しているようです。

SpringMVC

MVCの機能を提供します。

機能間の依存度を低くするように設計されており、かなりきれいに作られています。

Strutsで提供されるような機能もほとんどもっています。

DIxAOP

AOPの機能をSpringの設定ファイルで使用できるようになります。

AOPとは簡単にいうと、ソースを変更せずにプログラムを変更する機能です。

どうも、Javaの実行ファイルをメモリにロードするときに、指定の関数の前後に他のプログラムを直接差し込んでいるようです(バイナリに対して)。

AOPの機能自体は、AspectJというフレームワークを使用するのですが、AspectJ自体はプログラムでかなり面倒なことをしないといけないみたいです。

Springはそれを設定ファイルだけで簡単に使用できるようにラップしています。

SpringJDBC

O/Rマッピングを提供します。

O/Rマッピングとは、JavaのオブジェクトとDBのテーブルとを結びつける機能のことです。

イメージとしては、Javaのクラスで会員情報(Member)というクラスがあったとすると、

ormap.save(member);

みたいな感じでDBに保存できたり、

Member member = ormap.find("ID0001");

みたいな感じでDBから取り出せたりするのがO/Rマッピングのイメージです。

Spring以外のものでは、HibernateやiBatisなどがあります。

XMLからJavaのクラスにマッピングするものもあるようです。

(SpringJDBCではできませんが)

SpringSecurity

認証と認可の機能を提供してくれます。

WEBが分かりやすいと思いますが、一般的なWEBは、IDとパスワードを入力して両方とも合っていればログインできると思います。

この処理を認証と呼んでいて、さらに認証できた人に対してある画面を見せるか見せないか、という閲覧権限の機能も存在します。

これを認可と言います。

SpringSecurityでは両方ともを設定ファイルのみで実装できます。

かなりパワフルな機能です。

また、WEBだけでなく普通のJavaアプリケーションに対しても認証と認可の機能を実装できるようです。

SpringWebFlow

WEBの画面遷移を設定ファイルで設定できるようです。

状態をSessionに入れて保存しておくこともできるようで、javascriptのhistory.back()に頼らない「戻る」ボタンを実現したり、遷移を設定ファイル上だけで変更したりできるようです。

これは実際に使ったことが無いので、すみませんが実態が良く分かっていないです。どこかのWEBの記事を読んだ記憶を元にここは書いてます。。すみません。

SpringBatch

主に以下の2つの機能を設定ファイルを記述するだけで実現します。(詳細は左のリンク)

・スケジュールの機能

クーロンのように時間を設定できることと、メソッドを指定するだけで実行してくれるのが特徴です。

この機能は、Java's TimerやQuartzと呼ばれるフレームワークを使用しています。Java's Timerの場合は、クーロンのように時間設定できません。

単純な起動であれば設定ファイルだけでできますが、ちょっと複雑なものはコードを書く必要があり、その作法がかなり面倒なようです。

・バッチ処理の機能

処理の流れを記述することができ、チャンク処理、条件分岐、ループ、並列処理、失敗したところから開始するリスタートなど、様々な機能があります。

ちなみに似たような別のフレームワークに「TERASOLUNA」があります。これもSpringを使用します。

SpringMail

例外発生時などにメールを送る設定ができる機能です。

すみません、まだ使用したことがありません。。

SpringModules

書式の妥当性チェックをする機能を提供します。

Strutsにも書式の妥当性チェック機能はあります。

SpringもStrutsもApacheのCommonsフレームワークを裏では使用していますが、2つの間で微妙に設定ファイルの書き方に違いがあるので注意です。

Strutsとの連携

Strutsと特に制限無く連携できます。

連携の仕方は3つくらいありますが、少し、制限がかかるものもあります。

Hibernateとの連携

Hibernateと特に制限無く連携できるようです。

設定が簡易になるらしいです。

また、Springを使用することでHibernateと祖結合になるので、将来Hibernateから他のものに変更したい場合も、入れ替えしやすくなるようです。

※上記以外にも様々な機能が提供されています。



【補足】

Spring自体はメインでは、DIの機能しか提供していません。

DIを使用することでクラス間やフレームワーク間の独立性が高くなります。

その効果が出るように、他のフレームワークをラップしたり連携したりしているのが、DI以外の機能です。




参考:

DI:依存性の注入とは何か?

Spring Securityでラクラク! セキュリティ対策
バッチ処理はJavaでバッチリ?
Spring Framework 2.5 和訳(日本語訳)

Spring Framework リファレンス(日本語2章まで)
Spring Framework本家のページ
日本Springユーザ会

はじめまして。


私は趣味でJavaを少々勉強していまして、最近Springにまで手を出し始めました。

ところが勉強はなかなか進まず、少し経つと前に勉強したことを忘れるのはのび太君のごとし。

と言う感じで、何かメモを作らなければと思いこちらに残して行くことにしました。


ちなみに、私のJavaのレベルは入学したての桜木花道君のバスケットと同じです。

ミエをはってSpringなんて手を出してますが、庶民シュートも打てないでしょう。


そんなわけで、ソースなんかも載せて行く予定ですが、内容はぜんぜん保障しません。あせる

参考にしてもらうのは大丈夫ですが、個人の責任でお願いします。


何か参考になれば幸いですにひひ


【このブログでの対象環境】

特に断りのない場合、以下のようになります。

 ・Java 6

 ・Spring 2.5

 ・SpringSecurity 2.0

 ・Struts 1.3

 ・eclipse 3.4 (←開発ツールです)

 ・tomcat 5.5

 ・OS:Windows XP