SlideShare a Scribd company logo
1 of 53
Download to read offline
Spring Framework勉強会



                                 2008/03/04
  matsukaz [http://d.hatena.ne.jp/matsukaz/]
目的
• Spring Frameworkの概念を理解
• Spring Frameworkを使ってみたくなる
アジェンダ
• Spring Frameworkの概要
• Spring Framework 2.5の新機能
• まとめ
Spring Frameworkの概要
•   Spring Frameworkとは
•   Spring Frameworkの仕組み
•   コンテナの起動方法
•   インスタンス生成
•   インジェクション
•   スコープ
•   AOP
•   トランザクション制御
•   etc...
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に依存させない
• 様々なプロジェクトと連携可能
  – 優れたプロジェクトとは競合せずに協調してい
    く
Spring Frameworkの概要

Spring Frameworkの仕組み
• モジュールの種類




                   出展元 : http://springframework.org/
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フレームワークを提供するパッ
           ケージ
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;);
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>
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>
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());
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;/>
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>
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”/>
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”/>
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>
Spring Frameworkの概要

インジェクション
• その他の方法
 – ServiceLocatorFactoryBean
 – ObjectFactoryCreatingFactoryBean
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>
Spring Frameworkの概要

スコープ
• 用意されているスコープは以下の5つ。
 スコープ                             説明
 singleton   コンテナごとにインスタンスは1つ。
 prototype 呼ばれるたびにオブジェクトをインスタンス化。
 request     HTTPリクエスト内でインスタンスは1つ。
             実際はrequest.setAttribute(“bean名”, インスタンス)で管理。
 session     HTTPセッション内でインスタンスは1つ。
             実際はsession.setAttribute(“bean名”,インスタンス)で管理。
 global      PortletベースのWebアプリケーションでのみ利用するスコープ
 session
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のインタフェースベー
   スのプロキシに変更できる。
Spring Frameworkの概要

AOP
• Spring AOPはpure Java
  – AspectJのように特殊な言語や環境は必要な
    い
• join pointはmethod executionのみサポート
• AOPの仕様のフル実装が目的ではない
• 定義方法は以下の2つ
  – @AspectJアノテーション
  – Bean定義ファイル
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を呼び出すかどうかを制御可能。
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()
      }}
 }}
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>
Spring Frameworkの概要

AOP
• pointcutの書式
          書式                           説明
 execution     メソッド実行
 within        型やパッケージを制限する
 this          指定のインタフェースを実装するProxyオブジェクトに制限する(主にadvice内で
               参照する変数宣言のために使用する)
 target        指定のインタフェースを実装するターゲットオブジェクトに制限する(主にadvice
               内で参照する変数宣言のために使用する)
 args          引数の数と型にマッチするメソッドに制限する(主にadvice内で参照する変数宣
               言のために使用する)
 @target       指定のアノテーションを持つターゲットオブジェクトに制限する
 @args         引数が指定のアノテーションを含んでいる場合に制限する
 @within       指定のアノテーションがクラス宣言に含まれているターゲットオブジェクトに制限
               する
 @annotation   指定のアノテーションを含んでいるメソッドに制限する
 bean          Spring管理下のBeanに制限する(※Spring 2.5)
Spring Frameworkの概要

AOP
• adviceの順序制御
 – 以下のいずれかの方法で制御
      • Orderedインタフェースを実装
        – int getValue() { return 10; }
      • @Orderアノテーションを利用
        – @Order(value=10)
      • Bean定義ファイルに記述
        – <aop:aspect order=“10”>
 – 数値の低い方から順番にadviceが適用される
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>
Spring Frameworkの概要

トランザクション制御
• 同じプログラミングモデルでJTA、JDBC、
  Hibernate、JPA、JDOなどのトランザクションAPI
  を利用可能に。
• 宣言的トランザクション管理をサポート




                      出展元 : http://springframework.org/
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)
       ////実装
           実装
    }}
 }}
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>
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系の例外は、そのままではロールバック
                                    されるため、ロールバックさせたくない場合などに指定。
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”/>
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
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>
Spring Frameworkの概要

etc...
• コールバック・メソッド
   – Beanのインスタンス化や破棄を行った際の
     コールバックを受け付けるメソッドを設定可能。
   – 設定方法
         • InitializingBean/DisposableBeanインタフェースを
           実装
         • Bean定義ファイルにinit-method/destroy-
           method属性を指定
         • アノテーションで指定(Spring 2.5の新機能で説明)
Spring Frameworkの概要

etc...
• lazy-init
   – singletonスコープのBeanは、デフォルトでは
     起動時に全てインスタンス化される。
     lazy-initをtrueに設定することで、必要になっ
     たときにインスタンス化するように、インスタン
     ス化のタイミングを遅らせることができる。
         • テスト時などに有効。
Spring Frameworkの概要

etc...
• XMLスキーマを利用した設定
       スキーマ                           説明
 util         ユーティリティ機能を提供
 jee          JNDI/EJBのlookupの設定
 lang         動的言語の設定
 jms          JMSの設定
 tx           トランザクションの設定
 aop          AOPの設定
 context      ApplicationContextの設定
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;/>
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));
Spring Framework2.5の新機能
•   アノテーションによるインジェクション
•   アノテーションによるBean定義
•   アノテーションによるライフサイクルメソッド
•   アノテーションを有効にする方法
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;
  }}
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;
  }}
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;
     }}
  }}
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;
  }}
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
  }}
Spring Framework2.5の新機能

アノテーションによるBean定義
• @Service
  – @Componentの拡張アノテーション
  – Service層のBeanに適用
  – ただし、現状では@Componentとの違いはな
    い
  – 今後機能を付与していく予定
  @Service(“fugaDAO”)
   @Service(“fugaDAO”)
  public class FooServiceImpl implements FooService {{
   public class FooServiceImpl implements FooService
  }}
Spring Framework2.5の新機能

アノテーションによるBean定義
• @Controller
  – @Componentの拡張アノテーション
  – Spring Web MVCフレームワークで、Controller
    の役割を果たすBeanに適用
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
  }}
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()
     }}
  }}
Spring Framework2.5の新機能
アノテーションによるライフサイクルメソッド

• ライフサイクルメソッドの実行順
 – Bean生成時
  • @PostConstructアノテーションを適用したメソッド
  • InitializingBeanインタフェースの
    afterPropertiesSet()
  • Bean定義ファイルでinit-methodで指定したメソッド
 – Bean破棄時
  • @PreDestroyアノテーションを適用したメソッド
  • DisposableBeanインタフェースのdestroy()
  • Bean定義ファイルでdestroy-methodで指定したメ
    ソッド
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は指定しなくても良い
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+
まとめ
• Spring 2.5のアノテーションを利用すれば
  XML地獄から解放される。
 – 全てアノテーションで書くことが正しいかは別。
   • 個人的にはログ出力や例外ハンドリングはアノ
     テーション、トランザクション制御はXMLが好み。
• 基本的にPOJOなので分業化が図りやす
  い。
• Spring単体では大したことはできない。
 – 外部プロジェクトと連携して威力が発揮される。
   • 統一の取れたプログラミングモデル。

More Related Content

What's hot

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景Tatsuo Kudo
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
RDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについてRDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについてMasayuki Isobe
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション土岐 孝平
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
本当にあったApache Spark障害の話
本当にあったApache Spark障害の話本当にあったApache Spark障害の話
本当にあったApache Spark障害の話x1 ichi
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方豊明 尾古
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
Serverless Framework Pluginで行うLambdaテスト
Serverless Framework Pluginで行うLambdaテストServerless Framework Pluginで行うLambdaテスト
Serverless Framework Pluginで行うLambdaテストMasaki Suzuki
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント土岐 孝平
 
ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)KnowledgeGraph
 
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリSQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリItabashi Masayuki
 

What's hot (20)

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景なぜOpenID Connectが必要となったのか、その歴史的背景
なぜOpenID Connectが必要となったのか、その歴史的背景
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
RDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについてRDF/OWLの概要及びOSS実装、及び活用イメージについて
RDF/OWLの概要及びOSS実装、及び活用イメージについて
 
Linked Open Dataとは
Linked Open DataとはLinked Open Dataとは
Linked Open Dataとは
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
本当にあったApache Spark障害の話
本当にあったApache Spark障害の話本当にあったApache Spark障害の話
本当にあったApache Spark障害の話
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Serverless Framework Pluginで行うLambdaテスト
Serverless Framework Pluginで行うLambdaテストServerless Framework Pluginで行うLambdaテスト
Serverless Framework Pluginで行うLambdaテスト
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
 
ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)
 
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリSQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリ
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 

Viewers also liked

Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Java女子部
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Yuichi Hasegawa
 
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”SOCIAL AGENT, Inc
 
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料SOCIAL AGENT, Inc
 
Spring + Gradle + Kotlin W8LT#5
Spring + Gradle + Kotlin W8LT#5Spring + Gradle + Kotlin W8LT#5
Spring + Gradle + Kotlin W8LT#5Junpei Matsuda
 
Spring Security 4.1 の新機能
Spring Security 4.1 の新機能Spring Security 4.1 の新機能
Spring Security 4.1 の新機能正和 井岡
 
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)Hinemos
 
Movable Type+AWSでECサイトを構築してわかったこと
Movable Type+AWSでECサイトを構築してわかったことMovable Type+AWSでECサイトを構築してわかったこと
Movable Type+AWSでECサイトを構築してわかったことMakoto Tajima
 
ecサイト4モデル式フレームワーク
ecサイト4モデル式フレームワークecサイト4モデル式フレームワーク
ecサイト4モデル式フレームワークNarutoshi Gon
 
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)Yuriko Kai
 
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterRyosuke Uchitate
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Bootなべ
 
Cloud Foundry x Wagby
Cloud Foundry x WagbyCloud Foundry x Wagby
Cloud Foundry x WagbyYoshinori Nie
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Yuichi Hasegawa
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術Y Watanabe
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々torutk
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingchibochibo
 

Viewers also liked (20)

Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
Spring Bootでチャットツールを作りながらWebの仕組みを理解しよう!
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
 
China EC framework
China EC frameworkChina EC framework
China EC framework
 
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”
東南アジアへのネット通販・越境EC支援プラットフォーム”EC-PORT”
 
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料
東南アジアへの越境ECプラットフォーム"EC-PORT”サービス紹介資料
 
Spring + Gradle + Kotlin W8LT#5
Spring + Gradle + Kotlin W8LT#5Spring + Gradle + Kotlin W8LT#5
Spring + Gradle + Kotlin W8LT#5
 
Spring Security 4.1 の新機能
Spring Security 4.1 の新機能Spring Security 4.1 の新機能
Spring Security 4.1 の新機能
 
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
 
Movable Type+AWSでECサイトを構築してわかったこと
Movable Type+AWSでECサイトを構築してわかったことMovable Type+AWSでECサイトを構築してわかったこと
Movable Type+AWSでECサイトを構築してわかったこと
 
ecサイト4モデル式フレームワーク
ecサイト4モデル式フレームワークecサイト4モデル式フレームワーク
ecサイト4モデル式フレームワーク
 
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)
欧米の最新ECトレンドと比較するフィリピンのECトレンド(2014年4月2日)
 
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
 
Cloud Foundry x Wagby
Cloud Foundry x WagbyCloud Foundry x Wagby
Cloud Foundry x Wagby
 
Hybris integration solution pack
Hybris integration solution packHybris integration solution pack
Hybris integration solution pack
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
 
テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術テストゼロからイチに進むための戦略と戦術
テストゼロからイチに進むための戦略と戦術
 
SAP Hybris Marketing - Cosmin Costea
SAP Hybris Marketing - Cosmin CosteaSAP Hybris Marketing - Cosmin Costea
SAP Hybris Marketing - Cosmin Costea
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 

Similar to Spring Framework勉強会

Spring基础教程
Spring基础教程Spring基础教程
Spring基础教程Shilong Sang
 
技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTracterada
 
20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編mochiko AsTech
 
20090418 イケテルRails勉強会 第2部Air編 解説
20090418 イケテルRails勉強会 第2部Air編 解説20090418 イケテルRails勉強会 第2部Air編 解説
20090418 イケテルRails勉強会 第2部Air編 解説mochiko AsTech
 
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909Yusuke Wada
 
20090418 イケテルRails勉強会 第2部Air編
20090418 イケテルRails勉強会 第2部Air編20090418 イケテルRails勉強会 第2部Air編
20090418 イケテルRails勉強会 第2部Air編mochiko AsTech
 
Development toolsforteamdevelopment
Development toolsforteamdevelopmentDevelopment toolsforteamdevelopment
Development toolsforteamdevelopmentTakao Tetsuro
 
Open Source Type Pad Mobile
Open Source Type Pad MobileOpen Source Type Pad Mobile
Open Source Type Pad MobileHiroshi Sakai
 
20090313 Cakephpstudy
20090313 Cakephpstudy20090313 Cakephpstudy
20090313 CakephpstudyYusuke Ando
 
Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門shigeya
 
Working With Rails
Working With RailsWorking With Rails
Working With RailsDali Wang
 
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」devsumi2009
 
フラクタリスト技術知識共有会発表資料 090903
フラクタリスト技術知識共有会発表資料 090903フラクタリスト技術知識共有会発表資料 090903
フラクタリスト技術知識共有会発表資料 090903ngi group.
 
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーションYuya Yamaki
 
Chinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhChinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhJesse Cai
 

Similar to Spring Framework勉強会 (20)

spring_jiaocheng
spring_jiaochengspring_jiaocheng
spring_jiaocheng
 
Spring基础教程
Spring基础教程Spring基础教程
Spring基础教程
 
Apache Tapestry
Apache TapestryApache Tapestry
Apache Tapestry
 
技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac技術トレンディセミナー フレームワークとしてのTrac
技術トレンディセミナー フレームワークとしてのTrac
 
20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編20090418 イケテルRails勉強会 第1部Rails編
20090418 イケテルRails勉強会 第1部Rails編
 
yonex
yonexyonex
yonex
 
20090418 イケテルRails勉強会 第2部Air編 解説
20090418 イケテルRails勉強会 第2部Air編 解説20090418 イケテルRails勉強会 第2部Air編 解説
20090418 イケテルRails勉強会 第2部Air編 解説
 
yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909
 
20090418 イケテルRails勉強会 第2部Air編
20090418 イケテルRails勉強会 第2部Air編20090418 イケテルRails勉強会 第2部Air編
20090418 イケテルRails勉強会 第2部Air編
 
Development toolsforteamdevelopment
Development toolsforteamdevelopmentDevelopment toolsforteamdevelopment
Development toolsforteamdevelopment
 
Open Source Type Pad Mobile
Open Source Type Pad MobileOpen Source Type Pad Mobile
Open Source Type Pad Mobile
 
Grails紹介
Grails紹介Grails紹介
Grails紹介
 
20090313 Cakephpstudy
20090313 Cakephpstudy20090313 Cakephpstudy
20090313 Cakephpstudy
 
Revisited
RevisitedRevisited
Revisited
 
Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門Linuxユーザーのための Windows 管理入門
Linuxユーザーのための Windows 管理入門
 
Working With Rails
Working With RailsWorking With Rails
Working With Rails
 
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
 
フラクタリスト技術知識共有会発表資料 090903
フラクタリスト技術知識共有会発表資料 090903フラクタリスト技術知識共有会発表資料 090903
フラクタリスト技術知識共有会発表資料 090903
 
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
 
Chinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 ZhChinaonrails Rubyonrails21 Zh
Chinaonrails Rubyonrails21 Zh
 

More from Masakazu Matsushita

It's up to you 〜 楽しさドリブンで歩んだ道 〜
It's up to you 〜 楽しさドリブンで歩んだ道 〜It's up to you 〜 楽しさドリブンで歩んだ道 〜
It's up to you 〜 楽しさドリブンで歩んだ道 〜Masakazu Matsushita
 
スタートアップで培ったアーキテクチャ設計ノウハウ
スタートアップで培ったアーキテクチャ設計ノウハウスタートアップで培ったアーキテクチャ設計ノウハウ
スタートアップで培ったアーキテクチャ設計ノウハウMasakazu Matsushita
 
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のりMasakazu Matsushita
 
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-EFS利用事例 -Craft Warriorsのバトルを支える仕組み-
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-Masakazu Matsushita
 
TranslimitにおけるAWS活用術
TranslimitにおけるAWS活用術TranslimitにおけるAWS活用術
TranslimitにおけるAWS活用術Masakazu Matsushita
 
Interactive buttonsを利用したbotをつくってみた
Interactive buttonsを利用したbotをつくってみたInteractive buttonsを利用したbotをつくってみた
Interactive buttonsを利用したbotをつくってみたMasakazu Matsushita
 
Brain Dots at dots. - Brain Dotsのアーキテクチャ -
Brain Dots at dots. - Brain Dotsのアーキテクチャ -Brain Dots at dots. - Brain Dotsのアーキテクチャ -
Brain Dots at dots. - Brain Dotsのアーキテクチャ -Masakazu Matsushita
 
BrainWarsを支えるAWSサービスたち
BrainWarsを支えるAWSサービスたちBrainWarsを支えるAWSサービスたち
BrainWarsを支えるAWSサービスたちMasakazu Matsushita
 
TranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちTranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちMasakazu Matsushita
 
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)Masakazu Matsushita
 
1000万DL突破!BrainWarsのアーキテクチャ
1000万DL突破!BrainWarsのアーキテクチャ1000万DL突破!BrainWarsのアーキテクチャ
1000万DL突破!BrainWarsのアーキテクチャMasakazu Matsushita
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜Masakazu Matsushita
 
カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明Masakazu Matsushita
 
ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例Masakazu Matsushita
 
海外向けサービスの苦労話
海外向けサービスの苦労話海外向けサービスの苦労話
海外向けサービスの苦労話Masakazu Matsushita
 
The Case for using MongoDB in Social Game - Animal Land
The Case for using MongoDB in Social Game - Animal LandThe Case for using MongoDB in Social Game - Animal Land
The Case for using MongoDB in Social Game - Animal LandMasakazu Matsushita
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandMasakazu Matsushita
 

More from Masakazu Matsushita (20)

It's up to you 〜 楽しさドリブンで歩んだ道 〜
It's up to you 〜 楽しさドリブンで歩んだ道 〜It's up to you 〜 楽しさドリブンで歩んだ道 〜
It's up to you 〜 楽しさドリブンで歩んだ道 〜
 
スタートアップで培ったアーキテクチャ設計ノウハウ
スタートアップで培ったアーキテクチャ設計ノウハウスタートアップで培ったアーキテクチャ設計ノウハウ
スタートアップで培ったアーキテクチャ設計ノウハウ
 
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり
全世界6,500万DL突破!ヒットゲームを作り上げたチームの道のり
 
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-EFS利用事例 -Craft Warriorsのバトルを支える仕組み-
EFS利用事例 -Craft Warriorsのバトルを支える仕組み-
 
TranslimitにおけるAWS活用術
TranslimitにおけるAWS活用術TranslimitにおけるAWS活用術
TranslimitにおけるAWS活用術
 
Interactive buttonsを利用したbotをつくってみた
Interactive buttonsを利用したbotをつくってみたInteractive buttonsを利用したbotをつくってみた
Interactive buttonsを利用したbotをつくってみた
 
ダブルCTO
ダブルCTOダブルCTO
ダブルCTO
 
Brain Dots at dots. - Brain Dotsのアーキテクチャ -
Brain Dots at dots. - Brain Dotsのアーキテクチャ -Brain Dots at dots. - Brain Dotsのアーキテクチャ -
Brain Dots at dots. - Brain Dotsのアーキテクチャ -
 
BrainWarsを支えるAWSサービスたち
BrainWarsを支えるAWSサービスたちBrainWarsを支えるAWSサービスたち
BrainWarsを支えるAWSサービスたち
 
TranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちTranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたち
 
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)
BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)
 
1000万DL突破!BrainWarsのアーキテクチャ
1000万DL突破!BrainWarsのアーキテクチャ1000万DL突破!BrainWarsのアーキテクチャ
1000万DL突破!BrainWarsのアーキテクチャ
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明
 
ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例
 
海外向けサービスの苦労話
海外向けサービスの苦労話海外向けサービスの苦労話
海外向けサービスの苦労話
 
The Case for using MongoDB in Social Game - Animal Land
The Case for using MongoDB in Social Game - Animal LandThe Case for using MongoDB in Social Game - Animal Land
The Case for using MongoDB in Social Game - Animal Land
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
 

Recently uploaded

Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - AvrilIvanti
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentMahmoud Rabie
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFMichael Gough
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxAna-Maria Mihalceanu
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...amber724300
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 

Recently uploaded (20)

Français Patch Tuesday - Avril
Français Patch Tuesday - AvrilFrançais Patch Tuesday - Avril
Français Patch Tuesday - Avril
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career Development
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDF
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 

Spring Framework勉強会

  • 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単体では大したことはできない。 – 外部プロジェクトと連携して威力が発揮される。 • 統一の取れたプログラミングモデル。