Spring  Framework勉強会
Upcoming SlideShare
Loading in...5
×
 

Spring Framework勉強会

on

  • 29,833 views

社内で行ったSpring Framework勉強会の資料。

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

Statistics

Views

Total Views
29,833
Views on SlideShare
29,742
Embed Views
91

Actions

Likes
8
Downloads
207
Comments
2

10 Embeds 91

http://www.slideshare.net 55
http://upheart.blogspot.com 21
http://webcache.googleusercontent.com 5
http://gimgunspring.blogspot.com 4
http://pro-gimgun.blogspot.com 1
http://upheart.blogspot.hk 1
http://upheart.blogspot.tw 1
http://upheart.blogspot.ca 1
https://twimg0-a.akamaihd.net 1
http://www.google.co.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Spring Framework勉強会 Presentation Transcript

  • 1. Spring Framework勉強会 2008/03/04 matsukaz [http://d.hatena.ne.jp/matsukaz/]
  • 2. 目的 • Spring Frameworkの概念を理解 • Spring Frameworkを使ってみたくなる
  • 3. アジェンダ • Spring Frameworkの概要 • Spring Framework 2.5の新機能 • まとめ
  • 4. Spring Frameworkの概要 • Spring Frameworkとは • Spring Frameworkの仕組み • コンテナの起動方法 • インスタンス生成 • インジェクション • スコープ • AOP • トランザクション制御 • etc...
  • 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. Spring Frameworkの概要 Spring Frameworkの仕組み • モジュールの種類 出展元 : http://springframework.org/
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Spring Frameworkの概要 インジェクション • その他の方法 – ServiceLocatorFactoryBean – ObjectFactoryCreatingFactoryBean
  • 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. Spring Frameworkの概要 スコープ • 用意されているスコープは以下の5つ。 スコープ 説明 singleton コンテナごとにインスタンスは1つ。 prototype 呼ばれるたびにオブジェクトをインスタンス化。 request HTTPリクエスト内でインスタンスは1つ。 実際はrequest.setAttribute(“bean名”, インスタンス)で管理。 session HTTPセッション内でインスタンスは1つ。 実際はsession.setAttribute(“bean名”,インスタンス)で管理。 global PortletベースのWebアプリケーションでのみ利用するスコープ session
  • 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. Spring Frameworkの概要 AOP • Spring AOPはpure Java – AspectJのように特殊な言語や環境は必要な い • join pointはmethod executionのみサポート • AOPの仕様のフル実装が目的ではない • 定義方法は以下の2つ – @AspectJアノテーション – Bean定義ファイル
  • 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. 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. 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. Spring Frameworkの概要 AOP • pointcutの書式 書式 説明 execution メソッド実行 within 型やパッケージを制限する this 指定のインタフェースを実装するProxyオブジェクトに制限する(主にadvice内で 参照する変数宣言のために使用する) target 指定のインタフェースを実装するターゲットオブジェクトに制限する(主にadvice 内で参照する変数宣言のために使用する) args 引数の数と型にマッチするメソッドに制限する(主にadvice内で参照する変数宣 言のために使用する) @target 指定のアノテーションを持つターゲットオブジェクトに制限する @args 引数が指定のアノテーションを含んでいる場合に制限する @within 指定のアノテーションがクラス宣言に含まれているターゲットオブジェクトに制限 する @annotation 指定のアノテーションを含んでいるメソッドに制限する bean Spring管理下のBeanに制限する(※Spring 2.5)
  • 26. Spring Frameworkの概要 AOP • adviceの順序制御 – 以下のいずれかの方法で制御 • Orderedインタフェースを実装 – int getValue() { return 10; } • @Orderアノテーションを利用 – @Order(value=10) • Bean定義ファイルに記述 – <aop:aspect order=“10”> – 数値の低い方から順番にadviceが適用される
  • 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. Spring Frameworkの概要 トランザクション制御 • 同じプログラミングモデルでJTA、JDBC、 Hibernate、JPA、JDOなどのトランザクションAPI を利用可能に。 • 宣言的トランザクション管理をサポート 出展元 : http://springframework.org/
  • 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. 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. 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. 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. 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. 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. Spring Frameworkの概要 etc... • コールバック・メソッド – Beanのインスタンス化や破棄を行った際の コールバックを受け付けるメソッドを設定可能。 – 設定方法 • InitializingBean/DisposableBeanインタフェースを 実装 • Bean定義ファイルにinit-method/destroy- method属性を指定 • アノテーションで指定(Spring 2.5の新機能で説明)
  • 36. Spring Frameworkの概要 etc... • lazy-init – singletonスコープのBeanは、デフォルトでは 起動時に全てインスタンス化される。 lazy-initをtrueに設定することで、必要になっ たときにインスタンス化するように、インスタン ス化のタイミングを遅らせることができる。 • テスト時などに有効。
  • 37. Spring Frameworkの概要 etc... • XMLスキーマを利用した設定 スキーマ 説明 util ユーティリティ機能を提供 jee JNDI/EJBのlookupの設定 lang 動的言語の設定 jms JMSの設定 tx トランザクションの設定 aop AOPの設定 context ApplicationContextの設定
  • 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. 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. Spring Framework2.5の新機能 • アノテーションによるインジェクション • アノテーションによるBean定義 • アノテーションによるライフサイクルメソッド • アノテーションを有効にする方法
  • 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. 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. 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. 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. 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. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Service – @Componentの拡張アノテーション – Service層のBeanに適用 – ただし、現状では@Componentとの違いはな い – 今後機能を付与していく予定 @Service(“fugaDAO”) @Service(“fugaDAO”) public class FooServiceImpl implements FooService {{ public class FooServiceImpl implements FooService }}
  • 47. Spring Framework2.5の新機能 アノテーションによるBean定義 • @Controller – @Componentの拡張アノテーション – Spring Web MVCフレームワークで、Controller の役割を果たすBeanに適用
  • 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. 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. Spring Framework2.5の新機能 アノテーションによるライフサイクルメソッド • ライフサイクルメソッドの実行順 – Bean生成時 • @PostConstructアノテーションを適用したメソッド • InitializingBeanインタフェースの afterPropertiesSet() • Bean定義ファイルでinit-methodで指定したメソッド – Bean破棄時 • @PreDestroyアノテーションを適用したメソッド • DisposableBeanインタフェースのdestroy() • Bean定義ファイルでdestroy-methodで指定したメ ソッド
  • 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. 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. まとめ • Spring 2.5のアノテーションを利用すれば XML地獄から解放される。 – 全てアノテーションで書くことが正しいかは別。 • 個人的にはログ出力や例外ハンドリングはアノ テーション、トランザクション制御はXMLが好み。 • 基本的にPOJOなので分業化が図りやす い。 • Spring単体では大したことはできない。 – 外部プロジェクトと連携して威力が発揮される。 • 統一の取れたプログラミングモデル。