spring2 - devfesta.jp · 本日の話の流れ •diとaopの基本的な話 •springの概要...

44
Spring2.0 ~もっと有効活用

Upload: others

Post on 22-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring2.0~もっと有効活用

Page 2: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

本日の話の流れ

• DIとAOPの基本的な話• Springの概要

– 本当の概要• Spring2.0のいいところ

– Bean定義ファイルが簡単になった– 動的言語がサポートされた– JPAと連携できる– Spring JDBCが簡単になった– Struts連携もいい感じになった– その他

Page 3: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring,Seasar,EJB3.0, Guice…

• エンタープライズ・アプリケーション開発の核(メタフレームワーク)– DI

• コンポーネントを疎結合にする技術• 様々な技術を結合する基盤

– AOP• ソースコードに手を入れることなく処理を追加する技術

– トランザクション管理– 例外処理、ログ

• 機能を提供するだけのフレームワークではない– フレームワークの細かい使い方ではなく、設計上どのように利用するか

Page 4: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

DIコンテナ~基本

• 設計が終わった時点で、どのオブジェクトがどのオブジェクトを利用するのかは分かっている

• だったら利用するオブジェクトはセットしてあげよう– new演算子がコードからなくなる– しかもPOJO

EmpService EmpDao

DIコンテナ

①生成②セット

③利用

①EmpDaoを生成しなさい②EmpSeviceにEmpDaoをセットしなさい

定義ファイル

Page 5: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

DIコンテナ~Webアプリはマルチスレッド

• Webアプリ(Servlet)はマルチスレッド• 利用するオブジェクトを毎回生成してたらもったいない(Singletonにしよう)

findEmpAction EmpService

DIコンテナ

①生成

②セット

③利用

deleteEmpAction

②セット

③利用

利用するオブジェクト

Page 6: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

DI~インタフェースを利用

• 自分でnewしないのなら、オブジェクトはインタフェースをとおして扱うようにしよう

– テストコードへの置き換えが用意– 利用する側に影響を与えずに実装クラスの変更が可能

EmpServiceImpl

DIコンテナ

①生成②セット

③利用

①DB2EmpDaoを生成しなさい②EmpSeviceImplにDB2EmpDaoをセットしなさい

定義ファイル

OracleEmpDao

DB2EmpDaoEmpDao

Page 7: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

AOP~基本

• 処理を後から追加できる– 追加できるところ(仕様)→JoinPoint

• 例)メソッドが利用されたとき、プロパティが利用されたとき…– JoinPointを絞り込むフィルタ→PointCut

• 例)メソッド名がaで始まる、クラスXの全てのメソッド・・・etc– 追加したい処理を書くところ→Advice

• 例)種別としてBeforeAdvice,AfterAdvice,ThrowAdvice・・・etc

:X :Ya()

JoinPointが「メソッドが呼ばれたとき」で

Pointcutに「メソッド名がaで始まるとき」と設定

:xxAdvice

Adviceに記述された処理が割り込み例えば「System.out.println(“Hello!”);」

Page 8: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

AOP~やって良いこと悪いこと

• 良いこと– トランザクション管理、ログ、例外

• メソッドの前後に付加することができる、いわゆる共通処理• 個別処理(メソッドの中)に付属するようなユーティリティではない

– 誰が提供するか• アーキテクトチームとか基盤チーム

• 悪いこと– 個別の処理(特定業務の処理、デバッグ)

• プログラマが個別にAOPをいれるのは不可– そこで何をやっているのかが分からなくなる

Page 9: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

DIxAOPのまとめ

• 再利用性• テスト容易性• 拡張性、変更容易性• 分散開発• 開発容易性(複雑さの隠蔽)※現状の開発で、DIxAOPを使わない理由は見当たらない

Page 10: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring

• Spring Framework–ロッド・ジョンソン氏(Interface21)が中心に開発したDIxAOPコンテナ

– Java/J2EEアプリケーション開発用フレームワーク

– ASL(Apache Software Licence)に基づいたオープンソース

Page 11: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Springの主な足取り

• 2002年11月 Expert One-on-One J2EE• 2003年8月 実践J2EE(Expert One-on-One J2EE翻訳)• 2004年3月 Spring 1.0

– 一ヶ月に10,000ダウンロードを記録

• 2004年7月 JavaWorldにSpring登場(国内)• 2004年9月 Spring1.1• 2005年5月 Spring1.2• 2006年10月 Spring 2.0• 2007年1月 JSUG発足• 2007年10月 現在 Spring2.0.7,Spring2.1M4

Page 12: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Springのプロジェクト

• サブプロジェクト– Spring Security– Spring Web Flow– Spring Rich Client– Spring BeanDoc– Spring IDE for Eclipse– Spring Web Services– etc・・・

• 関連プロジェクト– Spring Batch– Spring Modules– Spring Framework .NET– JSF-Spring– etc・・・

Page 13: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

国内でのSpring利用実績

• 公開可能な利用実績のダウンロード(PDF)• http://modern.sourceforge.jp/

–公開できないものも実は一杯あります

Page 14: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring~何が嬉しいか

• POJO–再利用–テスト

• トランザクション管理• ログや例外• フレームワークとのインテグレーション

Page 15: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Hibernateだけのコード例

public class TransactionBase { private static SessionFactory sessionFactory = null;

private static synchronized SessionFactory                      getSessionFactory() throws HibernateException { if(sessionFactory == null){ Configuration cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } return sessionFactory; }

public Session getSession() throws HibernateException { SessionFactory sf = getSessionFactory(); return sf.openSession(); }}

public class EmployeeServiceImpl extends BaseDao implements EmployeeService { public void addEmployee(Employee employee) { Session session = null; Transaction transaction = null; try { session = getSession(); transaction = session.beginTransaction(); new HibernateEmployeeDao().addEmployee(session, employee); transaction.commit(); } catch (Exception e) { if(transaction != null) { try { transaction.rollback(); }catch (HibernateException ex) {} } }finally { if(session != null) { try { session.close(); } catch (HibernateException e) {} } } }…

public class EmployeeDaoImpl implements EmployeeDao{ public void addEmployee (Session session, Employee employee) { try { session.save(employee); } catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }}・・・

EmployeeServiceImpl

TransactionBase

XxxxAction EmployeeDaoImpl

トランザクションの開始・終了

テーブルへのアクセス

Hibernateの制御

≪Hibernate≫Session

Page 16: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring+Hibernateコード例

public class EmployeeServiceImpl implements EmployeeService { private EmployeeDao employeeDao = null; public void setEmployeeDao(EmployeeDao employeeDao) { this.employeeDao = employeeDao; } public void addEmployee(Employee employee) { employeeDao.addEmployee(employee); }・・・}

EmployeeServiceImplXxxxAction EmployeeDaoImpl

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao { public void addEmployee(Employee employee) { getHibernateTemplate().save(employee); } ・・・}

トランザクションの開始・終了がソースコードから消えている。Hibernateの制御もない

≪Spring≫HibernateDaoSupport

POJO

Page 17: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring~何が嬉しくなかったか

• XML地獄<?xml version="1.0" encoding="Shift_JIS" ?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config> <form-beans> <form-bean name="emptyForm" type="org.apache.struts.action.DynaActionForm" />

<form-bean name="addForm" type="jp.sf.mbeans.employee.presentation.struts.AddForm"> </form-bean>

<form-bean name="removeForm" type="jp.sf.mbeans.employee.presentation.struts.RemoveForm"> </form-bean> </form-beans>

<global-exceptions> <exception key="system.error" type="java.lang.Exception" path="/WEB-INF/jsp/struts/error.jsp"/> </global-exceptions>

<global-forwards> <forward name="find" path="/find.htm"/> </global-forwards> <action-mappings> <action path="/find" type="jp.sf.mbeans.employee.presentation.struts.FindAction" name="emptyForm"> <forward name="success" path="/WEB-INF/jsp/struts/employeeView.jsp" /> </action> <action path="/remove" type="jp.sf.mbeans.employee.presentation.struts.RemoveAction" name="removeForm"> <forward name="success" path="/find.htm" redirect="true"/> </action> <action path="/add" type="jp.sf.mbeans.employee.presentation.struts.AddAction" name="addForm" validate="true" input="/WEB-INF/jsp/struts/employeeView.jsp"> <forward name="success" path="/find.htm" redirect="true"/> </action> </action-mappings> <message-resources parameter="messages" />

</struts-config>

<?xml version="1.0" encoding="Shift_JIS"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<display-name>Employee Management System</display-name>

<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>Windows-31J</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>

<!-- Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

<!-- Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>

<session-config> <session-timeout>30</session-timeout> </session-config>

<!-- The Welcome File List --> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>

<!-- Struts Tag Library Descriptors --> <taglib> <taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location> </taglib>

<taglib> <taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location> </taglib>

<taglib> <taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location> </taglib>

<taglib> <taglib-uri>/WEB-INF/tld/struts-nested.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location> </taglib>

<taglib> <taglib-uri>/WEB-INF/tld/struts-tiles.tld</taglib-uri> <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location> </taglib>

</web-app>

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans><!-- Local DataSource HSQL --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean><!-- Hibernate SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingResources" value="com/mamezou/employee/dao/hibernate/employee.hbm.xml"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean><!-- Transaction Manager --> <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- Business Interface --> <bean id="employeeService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager" /> <property name="target" ref="employeeServiceTarget" /> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- Business Object --> <bean id="employeeServiceTarget" class="com.mamezou.employee.business.PersonServiceImpl"> <property name="employeeDao" ref="employeeDao"/> </bean> <!-- Data Access Object --> <bean id="employeeDao" class="com.mamezou.employee.dao.hibernate.HibernatePersonDao"> <property name="sessionFactory" ref="sessionFactory"/> </bean></beans>

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.mamezou.employee.business.Employee" table=”EMPLOYEE”> <id name=”id” column=”E_ID”> <generator class=“native”/> </id> <property name=“name” column=“E_NAME”/> <property name=”address” column=”E_ADDRESS”/> </class></hibernate-mapping>

Page 18: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

SpringからSpring 2.0へ

• 「よりシンプルにパワフルに」を目的• 主な機能強化と新規機能

–定義ファイル記述の簡潔化と強化– JPA(Java Persistence API)のサポート– SpringJDBCの強化– Beanのスコープ追加– Portlet MVC フレームワーク–スクリプト言語で書かれた Bean を利用する– Message Driven POJOの導入

Page 19: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring1.x

インテグレーション or サポート

Spring DIコンテナ

Spring AOP

SpringMVC

SpringJDBC

SpringWeb Flow

Struts JSF

Hibernate

JMS RMI etc…

QuartzEHCache

iBatis

JMX

JAXRPC

Java’s Timer

JavaMail

JDOTopLink

Freemarker Velocity

Acegi Security Systemfor Spring

Page 20: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

インテグレーション or サポート

Spring DIコンテナ

Spring AOP

SpringMVC

SpringJDBC

SpringWeb Flow

Struts JSF

Hibernate

JMS RMI etc…

QuartzEHCache

iBATIS

JMX

JAXRPC

Java’s Timer

JavaMail

JDOTopLink

Freemarker Velocity

Acegi Security Systemfor Spring

Spring1.x → Spring2.x

Spring DIコンテナ

Spring AOP

SpringMVC

SpringJDBC

Java Persistence API(JPA)

SpringPortlet MVC

AspectJ

動的言語JRuby GroovyBeanShell

XMLスキーマ Beanスコープ

Page 21: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

定義ファイル 今、昔

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd"><beans> …</beans>

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd">

<beans> …</beans>

Page 22: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Bean定義の簡略化

• XMLスキーマで定義されたタグ、つまり簡略化されたタグを利用できる

• スキーマ一覧– utilスキーマ・・・ユーティリティ機能の設定– langスキーマ・・・動的言語の設定– aopスキーマ・・・AOPの設定– txスキーマ・・・トランザクションの設定– jeeスキーマ・・・JNDI/EJBのlookupの設定

Page 23: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring1.xのAOPの設定

• めんどくさい<bean id="sampleService" class=“・・・.aop.framework.ProxyFactoryBean"> <property name="target" ref="sampleServiceTarget" /> <property name="interceptorNames"> <list><value>aroundAdvisor</value></list> </property></bean>

<bean id="aroundAdvisor" class=“・・・.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="aroundAdvice" /> <property name="mappedNames"> <list><value>doSomething</value></list> </property></bean>

Page 24: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring2.xのAOPの設定

• とっても簡単

<aop:config> <aop:pointcut id="doSomethingPC" expression="execution(* doSomething())"/> <aop:advisor pointcut-ref="doSomethingPC“ advice-ref="aroundAdvice"/></aop:config>

Page 25: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

AOPの拡張

• POJOをAdviceとして利用できる• AspectJのPointcutの設定を利用できる

Page 26: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

aopスキーマこんな使い方

• <aop:advisor pointcut="execution(* *..ProductManager.*(..)) || execution( * *..ProductDao.*(..)) " advice-ref="logging"/>

• <aop:advisor pointcut= "!execution(* ..ProductManager.*(..)) " advice-ref="logging"/>

Page 27: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring1.xのトランザクションの設定

• めんどくさい<bean id="sampleDao" class=“・・・.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager“ ref="transactionManager" /> <property name="target" ref="sampleDaoTarget" /> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED, readOnly</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> </props> </property></bean>

Page 28: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Spring2.xのトランザクションの設定

• やっぱり簡単<aop:config> <aop:advisor pointcut="execution(* *..*Dao*.*(..))" advice-ref="txAdvice"/></aop:config>

<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="get*" propagation="REQUIRED“ read-only="true"/> <tx:method name="add*" propagation="REQUIRED"/> </tx:attributes></tx:advice>

Page 29: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

txスキーマに色々設定

<tx:advice id="txAdvice"> <tx:attributes> <tx:method name="find*” propagation="REQUIRES_NEW” read-only="true” no-rollback-for=”….DataAccessException"/> <tx:method name="add*” isolation="DEFAULT” rollback-for=”....DataAccessException"/> …� </tx:attributes> </tx:advice>

Page 30: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

@Transactional+txスキーマ

@Transactionalpublic class SampleBeanImpl   implements SamplBean { public void method() {…}

<tx:annotation-driven/><bean name=”sampleBean"

class="example.SampleBeanImpl"></bean>

Page 31: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

追加されたBeanスコープ

• Spring1.x– singleton・・・シングルトン– prototype・・・その都度インスタンス生成

• Spring2.x– request・・・Servlet APIのrequestスコープ– session・・・Servlet APIのsessionスコープ– globalSession・・・Portlet APIのグローバル      sessionスコープ

Page 32: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

動的言語のサポート

• 簡単にJavaから動的言語を利用できる!• サポートしている動的言語

– JRuby• JavaVM上で動くRuby処理系• Rubyと同じ文法

– Groovy• Javaエンジニアのための動的言語• JSR-241• Javaと文法が似ている

– BeanShell• JavaVM上で動くスクリプト処理系• Javaと文法が似ている

Page 33: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

動的言語の利用

• Javaのインタフェースを定義する• 動的言語でインタフェースを実装する• langスキーマでBean定義を行う

package jp.springframework.script;

public interface SampleService { void doSomething();}

インタフェース

Page 34: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

動的言語でインタフェースを実装する

• JRubyを使いましたrequire 'java'

include_class 'jp.springframework.script.SampleService'

class SampleServiceImpl < SampleService def doSomething printf @message + "\n" end def setMessage(message) @message = message endend

Page 35: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

langスキーマでBean定義を行う

• プロパティにインジェクションできる!• スクリプトの処理を変更して動的にシステムに反映できる!

<lang:jruby id="sampleService" script-source="file:res/SampleService.rb" script-interfaces="jp.springframework.script.SampleService" refresh-check-delay="500"> <lang:property name="message" value="日本Springユーザー会"/></lang:jruby>

Page 36: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

JPA連携

• EJBコンテナなしで宣言トランザクションが利用できる

• Hibernate連携と同じような感じで、簡単にDaoが作成できる– EntityManagerの取得/クローズ処理が不要– トランザクション呼び出しが不要

Page 37: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

JPA連携の利用

• JpaDaoSupportを継承するpublic class SampleDaoImpl extends JpaDaoSupport implements SampleDao {

public Integer addSample(Sample sample) { getJpaTemplate().persist(sample); getJpaTemplate().flush(); return sample.getId(); }

public List<Sample> getSamples() { return getJpaTemplate() .find("select s from Sample s"); }}

Page 38: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

使いやすくなったSpring JDBC

• J2SE5のジェネリックを利用できる!– SimpleJdbcTemplate

• SQL文に名前で値をバインドできる!– NamedParameterJdbcTemplate

・・・public int countAuthor() { return simpleTemplate.queryForObject(                   "select count(*) from author", Integer.class);}public Integer addSample(Sample sample) { nameTemplate.update( "insert into sample (id, name) values(:id, :name)", new BeanPropertySqlParameterSource(sample)); return getIdentity();}・・・

Page 39: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

2.0じゃないけど~Struts連携

• 代理クラスを利用する– DelegatingActionProxy

• クラスを継承する– ActionSupport

• リクエストプロセッサを置き換える– AutowiringRequestProcessor

Struts Spring(DIコンテナ)

:ActionServlet

:Action :Model

生成 生成この関連が問題

XMLが増えてイマイチ

今まではコレ

おすすめ!

Page 40: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

AutowiringRequestProcessor

Struts Spring(DIコンテナ)

:ActionServlet

:ServiceBean

生成 生成

:LoginAction

注入

・・・<controller processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />・・・

struts-config.xml

Actionクラスpublic class LoginAction extends Action {private ServiceBean serviceBean;・・・public void setServiceBean(ServiceBean serviceBean) { this. serviceBean = serviceBean;}・・・

RequestProcessorの置き換え。

Page 41: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

更にSpring

• Spring IDE– Bean定義ファイルの記述が簡単

• Spring Batch–期待は大–でも今のところ使えない・・・乞うご期待

Page 42: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

Springの情報を入手する

• JSUG– http://springframework.jp/

• JSUGメーリングリスト– http://groups.google.co.jp/group/jsug

• JSUG勉強会の資料– http://groups.google.co.jp/group/jsug/files

• Spring本家– http://www.springframework.org/

Page 43: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

ありがとうございました

Page 44: Spring2 - devfesta.jp · 本日の話の流れ •DIとAOPの基本的な話 •Springの概要 –本当の概要 •Spring2.0のいいところ –Bean定義ファイルが簡単になった

ライセンスについて

• JSUGマスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。

• 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。

• 本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。