Spring Framework勉強会

26,961 views
26,686 views

Published on

社内で行ったSpring Framework勉強会の資料。
Spring Frameworkの概要やSpring Framework2.5の新機能について。

Published in: Technology
2 Comments
10 Likes
Statistics
Notes
No Downloads
Views
Total views
26,961
On SlideShare
0
From Embeds
0
Number of Embeds
150
Actions
Shares
0
Downloads
211
Comments
2
Likes
10
Embeds 0
No embeds

No notes for slide

Spring Framework勉強会

  1. 1. Spring Framework勉強会 2008/03/04 matsukaz [http://d.hatena.ne.jp/matsukaz/]
  2. 2. 目的 • Spring Frameworkの概念を理解 • Spring Frameworkを使ってみたくなる
  3. 3. アジェンダ • Spring Frameworkの概要 • Spring Framework 2.5の新機能 • まとめ
  4. 4. Spring Frameworkの概要 • Spring Frameworkとは • Spring Frameworkの仕組み • コンテナの起動方法 • インスタンス生成 • インジェクション • スコープ • AOP • トランザクション制御 • etc...
  5. 5. Spring Frameworkの概要 Spring Frameworkとは • Rod Johnson氏の著書「Expert One-on- One J2EE Design and Development」の中 で提案されたIoC(Inversion of Control)パ ターンを実現したフレームワーク • 開発元はSpring Source(元Interface 21) • アプリケーションをPOJOで実装 – SpringのAPIに依存させない • 様々なプロジェクトと連携可能 – 優れたプロジェクトとは競合せずに協調してい く
  6. 6. Spring Frameworkの概要 Spring Frameworkの仕組み • モジュールの種類 出展元 : http://springframework.org/
  7. 7. Spring Frameworkの概要 Spring Frameworkの仕組み • モジュールの種類 モジュール 説明 Core IoCとDIの機能を提供する基本パッケージ Context IoCとDIの機能をフレームワークスタイルで利用可能にする パッケージ DAO JDBC抽象化レイヤの提供やトランザクション管理を行うため のパッケージ ORM JPA、JDO、Hibernate、iBATISなどのO/Rマッピングフレーム ワークとの連携を行うためのパッケージ AOP AOPを利用ためのパッケージ Web Webアプリケーションで利用可能な機能を提供するパッケージ WebWorkやStrutsとの連携時にも利用 MVC Webアプリケーション用のMVCフレームワークを提供するパッ ケージ
  8. 8. Spring Frameworkの概要 コンテナの起動方法 • ClassPathXmlApplicationContext – クラスパスからファイルを読み込んで起動 ApplicationContext ac == ApplicationContext ac new ClassPathXmlApplicationContext(quot;applicationContext.xmlquot;); new ClassPathXmlApplicationContext(quot;applicationContext.xmlquot;); • FileSystemXmlApplicationContext – パス指定でファイルを読み込んで起動 ApplicationContext ac == ApplicationContext ac new FileSystemClassPathXmlApplicationContext(quot;conf/appContext.xmlquot;); new FileSystemClassPathXmlApplicationContext(quot;conf/appContext.xmlquot;);
  9. 9. Spring Frameworkの概要 コンテナの起動方法 • XmlWebApplicationContext – WebApp起動時にコンテナも起動 – WebApplicationContextを利用するために ContextLoaderを設定 <listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </listener> または <servlet> <servlet> <servlet-name>context</servlet-name> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup> </servlet> </servlet>
  10. 10. Spring Frameworkの概要 コンテナの起動方法 (続き) – Webスコープを利用するための設定 <listener> <listener> <listener-class> <listener-class> org.springframework.web.context.request.RequestContextListener org.springframework.web.context.request.RequestContextListener </listener-class> </listener-class> </listener> </listener> または <filter> <filter> <filter-name>requestContextFilter</filter-name> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> </filter> <filter-mapping> <filter-mapping> <filter-name>requestContextFilter</filter-name> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern> <url-pattern>/*</url-pattern> </filter-mapping> </filter-mapping>
  11. 11. Spring Frameworkの概要 コンテナの起動方法 (続き) – 設定ファイルを指定 <context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-name>contextConfigLocation</param-name> <param-value> <param-value> /WEB-INF/applicationContext.xml /WEB-INF/applicationContext.xml </param-value> </param-value> </context-param> </context-param> – WebApplicationContextを取得 ////ApplicationContextの取得に失敗した場合はnullを返す ApplicationContextの取得に失敗した場合はnullを返す ApplicationContext ac ==WebApplicationContextUtils ApplicationContext ac WebApplicationContextUtils .getWebApplicationContext(getServletContext()); //引数はServletContext .getWebApplicationContext(getServletContext()); //引数はServletContext ////ApplicationContextの取得に失敗した場合はIllegalStateExceptionを返す ApplicationContextの取得に失敗した場合はIllegalStateExceptionを返す ApplicationContext ac ==WebApplicationContextUtils ApplicationContext ac WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()); .getRequiredWebApplicationContext(getServletContext());
  12. 12. Spring Frameworkの概要 インスタンス生成 • コンストラクタ <bean id=“hoge1quot; class=“sample1.HogeImplquot;/> <bean id=“hoge1quot; class=“sample1.HogeImplquot;/> • staticファクトリメソッド <bean id=“hoge2quot; class=“sample1.HogeImplquot; factory-method=quot;createInstancequot;/> <bean id=“hoge2quot; class=“sample1.HogeImplquot; factory-method=quot;createInstancequot;/> • インスタンスファクトリメソッド <bean id=quot;serviceLocatorquot; class=“sample1.HogeServiceLocatorquot;/> <bean id=quot;serviceLocatorquot; class=“sample1.HogeServiceLocatorquot;/> <bean id=“hoge3quot; factory-bean=quot;serviceLocatorquot; factory-method=“createServicequot;/> <bean id=“hoge3quot; factory-bean=quot;serviceLocatorquot; factory-method=“createServicequot;/>
  13. 13. Spring Frameworkの概要 インジェクション • コンストラクタ・インジェクション public class FugaImpl {{ public class FugaImpl private Hoge hoge; private Hoge hoge; public FugaImpl(Hoge hoge) {{ public FugaImpl(Hoge hoge) this.hoge ==hoge; this.hoge hoge; }} }} <bean name=“fuga1” class=“sample1.FugaImpl”> <bean name=“fuga1” class=“sample1.FugaImpl”> <constructor-arg ref=“hoge1”/> <constructor-arg ref=“hoge1”/> </bean> </bean>
  14. 14. Spring Frameworkの概要 インジェクション • セッター・インジェクション public class FugaImpl {{ public class FugaImpl private Hoge hoge; private Hoge hoge; public void setHoge(Hoge hoge) {{ public void setHoge(Hoge hoge) this.hoge ==hoge; this.hoge hoge; }} }} <bean name=“fuga1” class=“sample1.FugaImpl”> <bean name=“fuga1” class=“sample1.FugaImpl”> <property name=“hoge” ref=“hoge1”/> <property name=“hoge” ref=“hoge1”/> </bean> </bean> p-namespaceを利用すると <bean name=“fuga1” class=“sample1.FugaImpl” p:hoge-ref=“hoge1”/> <bean name=“fuga1” class=“sample1.FugaImpl” p:hoge-ref=“hoge1”/>
  15. 15. Spring Frameworkの概要 インジェクション • Autowiring public class FugaImpl {{ public class FugaImpl private Hoge hoge; private Hoge hoge; public void setHoge(Hoge hoge) {{ public void setHoge(Hoge hoge) this.hoge ==hoge; this.hoge hoge; }} }} – byType(型による指定) <bean name=“fuga1” class=“sample1.FugaImpl” autowire=“byType”/> <bean name=“fuga1” class=“sample1.FugaImpl” autowire=“byType”/> – byName(プロパティ名による指定) <bean name=“fuga1” class=“sample1.FugaImpl” autowire=“byName”/> <bean name=“fuga1” class=“sample1.FugaImpl” autowire=“byName”/>
  16. 16. Spring Frameworkの概要 インジェクション • lookupメソッド・インジェクション public abstract class FooImpl {{ public abstract class FooImpl protected abstract Hoge createHoge(); protected abstract Hoge createHoge(); }} <bean id=quot;smpl2.foo1quot; class=quot;sample2.FooImplquot;> <bean id=quot;smpl2.foo1quot; class=quot;sample2.FooImplquot;> <lookup-method name=quot;createHogequot; bean=quot;smpl2.hoge2quot;/> <lookup-method name=quot;createHogequot; bean=quot;smpl2.hoge2quot;/> </bean> </bean> <bean id=quot;smpl2.hoge2quot; class=quot;sample2.HogeImplquot; scope=quot;prototypequot;> <bean id=quot;smpl2.hoge2quot; class=quot;sample2.HogeImplquot; scope=quot;prototypequot;> <property name=quot;messagequot; value=quot;Hoge2quot;/> <property name=quot;messagequot; value=quot;Hoge2quot;/> </bean> </bean>
  17. 17. Spring Frameworkの概要 インジェクション • その他の方法 – ServiceLocatorFactoryBean – ObjectFactoryCreatingFactoryBean
  18. 18. Spring Frameworkの概要 インジェクション • Collectionフレームワークをインジェクション – List、Set、Map、Properties public class FooImpl {{ public class FooImpl private List<String> messageList; private List<String> messageList; private Map<Integer, String> users; private Map<Integer, String> users; public void setMessageList(List<String> messageList) {{ public void setMessageList(List<String> messageList) this.messageList ==messageList; this.messageList messageList; }} public void setUsers(Map<Integer, String> users) {{ public void setUsers(Map<Integer, String> users) this.users ==users; this.users users; }} }} <bean name=quot;foo1quot; class=quot;sample3.FooImplquot;> <bean name=quot;foo1quot; class=quot;sample3.FooImplquot;> <property name=quot;messageListquot;> <property name=quot;messageListquot;> <list> <list> <property name=quot;usersquot;> <property name=quot;usersquot;> <value>Foo1</value> <value>Foo1</value> <map> <map> <value>Foo2</value> <value>Foo2</value> <entry key=quot;1quot; value=quot;Hoge1quot;/> <entry key=quot;1quot; value=quot;Hoge1quot;/> </list> </list> </map> </map> </property> </property> </property> </property> </bean> </bean>
  19. 19. Spring Frameworkの概要 スコープ • 用意されているスコープは以下の5つ。 スコープ 説明 singleton コンテナごとにインスタンスは1つ。 prototype 呼ばれるたびにオブジェクトをインスタンス化。 request HTTPリクエスト内でインスタンスは1つ。 実際はrequest.setAttribute(“bean名”, インスタンス)で管理。 session HTTPセッション内でインスタンスは1つ。 実際はsession.setAttribute(“bean名”,インスタンス)で管理。 global PortletベースのWebアプリケーションでのみ利用するスコープ session
  20. 20. Spring Frameworkの概要 スコープ • スコープの異なるBeanをインジェクション – e.g. singletonのBeanにrequestのBeanをイン ジェクションするなど <!-- requestスコープ --> <!-- requestスコープ --> <bean id=quot;smpl4.hoge3quot; class=quot;sample4.HogeImplquot; scope=quot;requestquot;> <bean id=quot;smpl4.hoge3quot; class=quot;sample4.HogeImplquot; scope=quot;requestquot;> <!-- 別のスコープのBeanにインジェクションすることを考慮 --> <!-- 別のスコープのBeanにインジェクションすることを考慮 --> <aop:scoped-proxy/> <aop:scoped-proxy/> <property name=quot;messagequot; value=quot;Hoge3quot;/> <property name=quot;messagequot; value=quot;Hoge3quot;/> </bean> </bean> <!-- singletonスコープのBeanにrequestスコープのBeanをインジェクション --> <!-- singletonスコープのBeanにrequestスコープのBeanをインジェクション --> <bean id=quot;smpl4.fuga1quot; class=quot;sample4.FugaImplquot;> <bean id=quot;smpl4.fuga1quot; class=quot;sample4.FugaImplquot;> <property name=quot;hogequot; ref=quot;smpl4.hoge3quot;/> <property name=quot;hogequot; ref=quot;smpl4.hoge3quot;/> </bean> </bean> ※ <aop:scoped-proxy proxy-target-class=“false”/>とすることで、プロキシの 生成方法をCGLIBによるバイトコード生成からJSEのインタフェースベー スのプロキシに変更できる。
  21. 21. Spring Frameworkの概要 AOP • Spring AOPはpure Java – AspectJのように特殊な言語や環境は必要な い • join pointはmethod executionのみサポート • AOPの仕様のフル実装が目的ではない • 定義方法は以下の2つ – @AspectJアノテーション – Bean定義ファイル
  22. 22. Spring Frameworkの概要 AOP • Spring AOPで利用可能なadvice advice 説明 Before advice join pointの前 After returning advice join pointのメソッドが正しく実行された後 After throwing advice join pointのメソッドで例外が発生した後 After advice 結果に関係なくjoin pointの後 Around advice join pointの前後 join pointを呼び出すかどうかを制御可能。
  23. 23. Spring Frameworkの概要 AOP • @Aspectアノテーションを利用した方法 <!-- @Aspectアノテーションを有効化 --> <!-- @Aspectアノテーションを有効化 --> <aop:aspectj-autoproxy/> <aop:aspectj-autoproxy/> <bean id=“smpl5.hogeAspect” class=“sample5.HogeAspect”/> <bean id=“smpl5.hogeAspect” class=“sample5.HogeAspect”/> @Aspect @Aspect public class HogeAspect {{ public class HogeAspect @Pointcut(quot;execution(public **sample5.HogeImpl.*(..))quot;) @Pointcut(quot;execution(public sample5.HogeImpl.*(..))quot;) private void hogeOperation() {} private void hogeOperation() {} @Before(“hogeOperation()”) //pointcutを指定 @Before(“hogeOperation()”) //pointcutを指定 public void beforeAdvice() {{ public void beforeAdvice() }} @AfterReturning(“within(sample5.*)”) //join pointを直接指定 @AfterReturning(“within(sample5.*)”) //join pointを直接指定 public void afterReturingAdvice() {{ public void afterReturingAdvice() }} }}
  24. 24. Spring Frameworkの概要 AOP • Bean定義ファイルを利用した方法 <bean id=“smpl5.hogeAspect” class=“sample5.HogeAspect”/> <bean id=“smpl5.hogeAspect” class=“sample5.HogeAspect”/> <aop:config> <aop:config> <aop:aspect id=quot;hogeAspectDefquot; ref=quot;smpl5.hogeAspectquot;> <aop:aspect id=quot;hogeAspectDefquot; ref=quot;smpl5.hogeAspectquot;> <!– pointcut定義 --> <!– pointcut定義 --> <aop:pointcut id=quot;hogePublicMethodquot; <aop:pointcut id=quot;hogePublicMethodquot; expression=quot;execution(public **sample5.HogeImpl.*(..))quot;/> expression=quot;execution(public sample5.HogeImpl.*(..))quot;/> <!-- pointcutを指定 --> <!-- pointcutを指定 --> <aop:before pointcut-ref=quot;hogePublicMethodquot; method=quot;beforeAdvicequot;/> <aop:before pointcut-ref=quot;hogePublicMethodquot; method=quot;beforeAdvicequot;/> <!-- //join pointとしてwithin()を直接指定 --> <!-- //join pointとしてwithin()を直接指定 --> <aop:after-returning pointcut=quot;within(sample5.*)quot; method=quot;afterReturingAdvicequot;/> <aop:after-returning pointcut=quot;within(sample5.*)quot; method=quot;afterReturingAdvicequot;/> </aop:aspect> </aop:aspect> </aop:config> </aop:config>
  25. 25. Spring Frameworkの概要 AOP • pointcutの書式 書式 説明 execution メソッド実行 within 型やパッケージを制限する this 指定のインタフェースを実装するProxyオブジェクトに制限する(主にadvice内で 参照する変数宣言のために使用する) target 指定のインタフェースを実装するターゲットオブジェクトに制限する(主にadvice 内で参照する変数宣言のために使用する) args 引数の数と型にマッチするメソッドに制限する(主にadvice内で参照する変数宣 言のために使用する) @target 指定のアノテーションを持つターゲットオブジェクトに制限する @args 引数が指定のアノテーションを含んでいる場合に制限する @within 指定のアノテーションがクラス宣言に含まれているターゲットオブジェクトに制限 する @annotation 指定のアノテーションを含んでいるメソッドに制限する bean Spring管理下のBeanに制限する(※Spring 2.5)
  26. 26. Spring Frameworkの概要 AOP • adviceの順序制御 – 以下のいずれかの方法で制御 • Orderedインタフェースを実装 – int getValue() { return 10; } • @Orderアノテーションを利用 – @Order(value=10) • Bean定義ファイルに記述 – <aop:aspect order=“10”> – 数値の低い方から順番にadviceが適用される
  27. 27. Spring Frameworkの概要 AOP • AOP Proxyの種類 – JSE dynamic proxy [default] • インタフェースを用意する必要がある – CGLIB proxy • バイトコード生成。インタフェースを必要としない • @AspectJアノテーションを利用している場合 – <aop:aspectj-autoproxy proxy-target-class=“true”/> • Bean定義ファイルを利用している場合 <aop:config proxy-target-class=“true”> <aop:config proxy-target-class=“true”> </aop:config> </aop:config>
  28. 28. Spring Frameworkの概要 トランザクション制御 • 同じプログラミングモデルでJTA、JDBC、 Hibernate、JPA、JDOなどのトランザクションAPI を利用可能に。 • 宣言的トランザクション管理をサポート 出展元 : http://springframework.org/
  29. 29. Spring Frameworkの概要 トランザクション制御 • 宣言的トランザクション管理の利用例 package sample; package sample; public interface HogeService {{ public interface HogeService Hoge getHoge(String name); Hoge getHoge(String name); void insertHoge(Hoge hoge); void insertHoge(Hoge hoge); }} public class HogeServiceImpl implements HogeService {{ public class HogeServiceImpl implements HogeService public Hoge getHoge(String name) {{ public Hoge getHoge(String name) ////実装 実装 }} public void insertHoge(Hoge hoge) {{ public void insertHoge(Hoge hoge) ////実装 実装 }} }}
  30. 30. Spring Frameworkの概要 トランザクション制御 • Bean定義ファイルを利用した方法 <bean id=“hogeService” class=“sample.HogeServiceImpl”/> <bean id=“hogeService” class=“sample.HogeServiceImpl”/> <jee:jndi-lookup id=“dataSource” jndi-name=“jdbc/HogeDS”/> <jee:jndi-lookup id=“dataSource” jndi-name=“jdbc/HogeDS”/> <!-- トランザクションマネージャ --> <!-- トランザクションマネージャ --> <bean id=“txManager” class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”> <bean id=“txManager” class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”> <property name=“dataSource” ref=“dataSource”/> <property name=“dataSource” ref=“dataSource”/> </bean> </bean> <!– トランザクションの適用方法をadviceとして定義 --> <!– トランザクションの適用方法をadviceとして定義 --> <tx:advice id=“txAdvice” transaction-manager=“txManager”> <tx:advice id=“txAdvice” transaction-manager=“txManager”> <tx:attributes> <tx:attributes> <tx:method name=“get*” read-only=“true”/> <tx:method name=“get*” read-only=“true”/> <tx:method name=“*” propagation=“REQUIRED” rollback-for=“sample.HogeException”/> <tx:method name=“*” propagation=“REQUIRED” rollback-for=“sample.HogeException”/> <tx:attributes> <tx:attributes> </tx:advice> </tx:advice> <!– トランザクション管理対象をpointcutで指定 --> <!– トランザクション管理対象をpointcutで指定 --> <aop:config> <aop:config> <aop:pointcut id=“hogeServiceOperation” expression=“execution(* sample.HogeServiceImpl.*(..))”/> <aop:pointcut id=“hogeServiceOperation” expression=“execution(* sample.HogeServiceImpl.*(..))”/> <aop:advisor advice-ref=“txAdvice” pointcut-ref=“hogeServiceOperation”/> <aop:advisor advice-ref=“txAdvice” pointcut-ref=“hogeServiceOperation”/> </aop:config> </aop:config>
  31. 31. Spring Frameworkの概要 トランザクション制御 • <tx:method/>の属性一覧 属性 必須 デフォルト 説明 name Yes トランザクション制御の適用対象をメソッド名で指定。ワイ ルドカード(*)を利用可能 ‘get*’、’on*Event’など。 propagation No REQUIRED トランザクションの振る舞いを指定。REQUIRED、 SUPPORTS、MANDATORY、REQUIRES_NEW、 NOT_SUPPORTED、NEVER、NESTEDから指定。 isolation No DEFAULT トランザクションの分離レベルを指定。DEFAULT、 READ_UNCOMMITTED、READ_COMMITTED、 REPEATABLE_READ、SERIALIZABLEから指定。 timeout No -1 トランザクションのタイムアウト時間を秒指定。 read-only No false トランザクションを読み取り専用とするか否か。 rollback-for No ロールバックを行うExceptionをカンマ区切りで指定。 Exception系の例外は、そのままではロールバックされな いため、ロールバックを行いたい場合などに指定。 no-rollback-for No ロールバックを行わないExceptionをカンマ区切りで指定。 RuntimeException系の例外は、そのままではロールバック されるため、ロールバックさせたくない場合などに指定。
  32. 32. Spring Frameworkの概要 トランザクション制御 • @Transactionalを利用した方法 @Transactional @Transactional public class HogeServiceImpl {{ public class HogeServiceImpl @Transactional(readOnly=true) @Transactional(readOnly=true) public Hoge getHoge(String name) {{ public Hoge getHoge(String name) ////実装 実装 }} @Transactional( @Transactional( propagation=Propagation.REQUIRED, propagation=Propagation.REQUIRED, rollbackFor=sample.HogeException) rollbackFor=sample.HogeException) public void insertHoge(Hoge hoge) {{ public void insertHoge(Hoge hoge) ////実装 実装 }} }} <tx:annotation-driven transaction-manager=“txManager”/> <tx:annotation-driven transaction-manager=“txManager”/>
  33. 33. Spring Frameworkの概要 トランザクション制御 • @Transactionalのプロパティ プロパティ 型 説明 propagation enum:Propagation トランザクションの振る舞いを指定。値はBean定義ファイル の<tx:method/>の場合と同様。 isolation enum:Isolation トランザクションの分離レベルを指定。値はBean定義ファイ ルの<tx:method/>の場合と同様。 timeout int トランザクションのタイムアウト時間を秒指定。 readOnly boolean トランザクションを読み取り専用とするか否か。 rollbackFor Classオブジェクトの ロールバックを行う例外クラスを配列で指定。 配列 rollbackForClas クラス名の配列 ロールバックを行う例外クラス名を配列で指定。 sname noRollbackFor Classオブジェクトの ロールバックを行わない例外クラスを配列で指定。 配列 noRollbackForC クラス名の配列 ロールバックを行わない例外クラス名を配列で指定。 lassname
  34. 34. Spring Frameworkの概要 etc... • Bean定義の継承 <bean id=quot;smpl6.fugaAbstractquot; class=quot;sample6.FugaImplquot; abstract=quot;truequot;> <bean id=quot;smpl6.fugaAbstractquot; class=quot;sample6.FugaImplquot; abstract=quot;truequot;> <property name=quot;hogequot; ref=quot;smpl6.hoge1quot;/> <property name=quot;hogequot; ref=quot;smpl6.hoge1quot;/> </bean> </bean> <bean id=quot;smpl6.fuga1quot; parent=quot;smpl6.fugaAbstractquot;> <bean id=quot;smpl6.fuga1quot; parent=quot;smpl6.fugaAbstractquot;> <property name=quot;messagequot; value=quot;Fuga1quot;/> <property name=quot;messagequot; value=quot;Fuga1quot;/> </bean> </bean>
  35. 35. Spring Frameworkの概要 etc... • コールバック・メソッド – Beanのインスタンス化や破棄を行った際の コールバックを受け付けるメソッドを設定可能。 – 設定方法 • InitializingBean/DisposableBeanインタフェースを 実装 • Bean定義ファイルにinit-method/destroy- method属性を指定 • アノテーションで指定(Spring 2.5の新機能で説明)
  36. 36. Spring Frameworkの概要 etc... • lazy-init – singletonスコープのBeanは、デフォルトでは 起動時に全てインスタンス化される。 lazy-initをtrueに設定することで、必要になっ たときにインスタンス化するように、インスタン ス化のタイミングを遅らせることができる。 • テスト時などに有効。
  37. 37. Spring Frameworkの概要 etc... • XMLスキーマを利用した設定 スキーマ 説明 util ユーティリティ機能を提供 jee JNDI/EJBのlookupの設定 lang 動的言語の設定 jms JMSの設定 tx トランザクションの設定 aop AOPの設定 context ApplicationContextの設定
  38. 38. Spring Frameworkの概要 etc... • PropertyPlaceholderConfigurer – プロパティファイルを読み込み、Bean定義ファ イル中の置換文字列として利用可能にする <bean class=quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurerquot;> <bean class=quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurerquot;> <property name=quot;locationsquot;> <property name=quot;locationsquot;> <value>classpath:com/foo/jdbc.properties</value> <value>classpath:com/foo/jdbc.properties</value> </property> </property> </bean> </bean> <bean id=quot;smpl6.hoge1quot; class=quot;sample7.HogeImplquot; scope=quot;prototypequot;> <bean id=quot;smpl6.hoge1quot; class=quot;sample7.HogeImplquot; scope=quot;prototypequot;> <property name=quot;messagequot; value=“${sample7.hoge}quot;/> <property name=quot;messagequot; value=“${sample7.hoge}quot;/> </bean> </bean> – <context:property-placeholder/>で代替可能 <context:property-placeholder location=quot;classpath:sample7/system.propertiesquot;/> <context:property-placeholder location=quot;classpath:sample7/system.propertiesquot;/>
  39. 39. Spring Frameworkの概要 etc... • ResourceBundleMessageSource – ResouceBundleを利用し、MessageSourceをイ ンスタンス化する <bean id=quot;messageSource“ <bean id=quot;messageSource“ class=quot;org.springframework.context.support.ResourceBundleMessageSourcequot;> class=quot;org.springframework.context.support.ResourceBundleMessageSourcequot;> <property name=quot;basenamequot; value=quot;sample7/messagesquot;/> <property name=quot;basenamequot; value=quot;sample7/messagesquot;/> </bean> </bean> MessageSource messages ==(MessageSource) ac.getBean(quot;messageSourcequot;); MessageSource messages (MessageSource) ac.getBean(quot;messageSourcequot;); System.out.println(messages.getMessage(quot;sample7.hogequot;, new Object[]{quot;Hoge1quot;}, null)); System.out.println(messages.getMessage(quot;sample7.hogequot;, new Object[]{quot;Hoge1quot;}, null));
  40. 40. Spring Framework2.5の新機能 • アノテーションによるインジェクション • アノテーションによるBean定義 • アノテーションによるライフサイクルメソッド • アノテーションを有効にする方法
  41. 41. Spring Framework2.5の新機能 アノテーションによるインジェクション • @Autowired、@Qualifier – メソッドまたはフィールドに付与することで、 Beanが自動的にインジェクションされる • フィールド – privateでもOK • メソッド – setter以外でもOK public class FugaImpl implements Fuga {{ public class FugaImpl implements Fuga @Autowired @Autowired @Qualifier(“hoge”) //@Qualifier省略時はbyType、指定するとbyName @Qualifier(“hoge”) //@Qualifier省略時はbyType、指定するとbyName private Hoge hoge; private Hoge hoge; }}
  42. 42. Spring Framework2.5の新機能 アノテーションによるインジェクション • @Resource – @Autowired + @Qualifier – Bean名の他、JNDIの指定も可能 – JSR-250(Common Annotations for the Java Platform)のアノテーション public class FugaImpl implements Fuga {{ public class FugaImpl implements Fuga @Resource(name=“hoge”) @Resource(name=“hoge”) private Hoge hoge; private Hoge hoge; }}
  43. 43. Spring Framework2.5の新機能 アノテーションによるインジェクション • @Required – Beanを必ずインジェクションさせたい場合に指 定 • フィールドには設定できない。メソッドのみ。 – @Resourceと一緒に利用 – @Autowiredにはrequired属性があり、デフォ ルトでtrueになっている。 public class FugaImpl implements Fuga {{ public class FugaImpl implements Fuga private Hoge hoge; private Hoge hoge; @Required @Required @Resource(name=“hoge”) @Resource(name=“hoge”) public void setHoge(Hoge hoge) {{ public void setHoge(Hoge hoge) this.hoge ==hoge; this.hoge hoge; }} }}
  44. 44. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Component – Beanとして登録したいクラスに指定する – 引数にBean名を指定する • 省略時はクラス名の先頭を小文字にした名前で Bean登録される。 @Component(“fuga”) @Component(“fuga”) public class FugaImpl implements Fuga {{ public class FugaImpl implements Fuga @Autowired @Autowired @Qualifier(“hoge”) @Qualifier(“hoge”) private Hoge hoge; private Hoge hoge; }}
  45. 45. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Repository – @Componentの拡張アノテーション – Persistence層のBeanに適用する – DAOで発生した例外をDataAccessException に変換 • 例外ハンドリングを容易にする • DAO実装に依存しない @Repository(“fugaDAO”) @Repository(“fugaDAO”) public class FugaDAOImpl implements FugaDAO {{ public class FugaDAOImpl implements FugaDAO }}
  46. 46. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Service – @Componentの拡張アノテーション – Service層のBeanに適用 – ただし、現状では@Componentとの違いはな い – 今後機能を付与していく予定 @Service(“fugaDAO”) @Service(“fugaDAO”) public class FooServiceImpl implements FooService {{ public class FooServiceImpl implements FooService }}
  47. 47. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Controller – @Componentの拡張アノテーション – Spring Web MVCフレームワークで、Controller の役割を果たすBeanに適用
  48. 48. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Scope – Beanのスコープを設定する – Bean定義ファイルと同様の指定が可能 – scoped-proxyはBean定義ファイルで行う @Component(quot;hogequot;) @Component(quot;hogequot;) @Scope(quot;prototypequot;) @Scope(quot;prototypequot;) public class HogeImpl implements Hoge {{ public class HogeImpl implements Hoge }}
  49. 49. Spring Framework2.5の新機能 アノテーションによるライフサイクルメソッド • @PostConstruct、@PreDestroy – Bean生成時や破棄のタイミングで実行される コールバックメソッドに指定 – JSR-250のアノテーション public class HogeImpl implements Hoge {{ public class HogeImpl implements Hoge @PostConstruct @PostConstruct public void init() {{ public void init() }} @PreDestroy @PreDestroy public void destroy() {{ public void destroy() }} }}
  50. 50. Spring Framework2.5の新機能 アノテーションによるライフサイクルメソッド • ライフサイクルメソッドの実行順 – Bean生成時 • @PostConstructアノテーションを適用したメソッド • InitializingBeanインタフェースの afterPropertiesSet() • Bean定義ファイルでinit-methodで指定したメソッド – Bean破棄時 • @PreDestroyアノテーションを適用したメソッド • DisposableBeanインタフェースのdestroy() • Bean定義ファイルでdestroy-methodで指定したメ ソッド
  51. 51. Spring Framework2.5の新機能 アノテーションを有効にする方法 • @Autowired、@Resourceを利用 <context:annotation-config/> <context:annotation-config/> • @Component、@Repository、@Serviceなど を利用 <context:component-scan base-package=“sample8”/> <context:component-scan base-package=“sample8”/> – base-package配下のアノテーションを全て検 知 – component-scanを指定した場合は、 annotation-configは指定しなくても良い
  52. 52. Spring Framework2.5の新機能 アノテーションを有効にする方法 • component-scanをカスタマイズする – include-filterとexclude-filterにより、コンポー ネントの検出対象を制御可能 • テスト時など、一時的にBeanを切り替える場合な どに有効 <context:component-scan base-package=“sample8”> <context:component-scan base-package=“sample8”> <context:exclude-filter type=“assignable” expression=“sample8.HogeImpl”/> <context:exclude-filter type=“assignable” expression=“sample8.HogeImpl”/> </context:component-scan> </context:component-scan> type属性 例 annotation org.example.SomeAnnotation assignable org.example.SomeClass regex org¥.example¥.Default.* aspectj org.example..*Service+
  53. 53. まとめ • Spring 2.5のアノテーションを利用すれば XML地獄から解放される。 – 全てアノテーションで書くことが正しいかは別。 • 個人的にはログ出力や例外ハンドリングはアノ テーション、トランザクション制御はXMLが好み。 • 基本的にPOJOなので分業化が図りやす い。 • Spring単体では大したことはできない。 – 外部プロジェクトと連携して威力が発揮される。 • 統一の取れたプログラミングモデル。

×