SlideShare una empresa de Scribd logo
1 de 53
Descargar para leer sin conexión
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単体では大したことはできない。
 – 外部プロジェクトと連携して威力が発揮される。
   • 統一の取れたプログラミングモデル。

Más contenido relacionado

La actualidad más candente

【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所Kotaro Ogino
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際Tetsutaro Watanabe
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-RetryフレームワークY Watanabe
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka心 谷本
 
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)NTT DATA Technology & Innovation
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring土岐 孝平
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
Redmineとgitの 連携利用事例
Redmineとgitの 連携利用事例Redmineとgitの 連携利用事例
Redmineとgitの 連携利用事例Tomohisa Kusukawa
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界Y Watanabe
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】WESEEKWESEEK
 
解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICS解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICSしくみ製作所
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 

La actualidad más candente (20)

【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
どうする計画駆動型スクラム(スクラムフェス大阪2023 発表資料)
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Redmineとgitの 連携利用事例
Redmineとgitの 連携利用事例Redmineとgitの 連携利用事例
Redmineとgitの 連携利用事例
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
 
解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICS解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICS
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 

Destacado

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
 

Destacado (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 a 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 a 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
 

Más de 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
 

Más de 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
 

Último

Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Último (20)

Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

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