Spring学習ノート-高度な機能
18205 ワード
1.P r o p e r t y PlaceholderConfigurerでspringに他の外部プロファイルまたはプロパティファイルをロードする:多くのjavaEEエンジニアリングではSpringの役割が非常に重要であり、他のモジュールやコンポーネントを管理する軽量級コンテナであり、SpringではStruts、Ibatis、hibernateなどを管理する必要があることが多い.これらのオープンソースフレームワークのプロファイルはSpringのP r o p e r t y PlaceholderConfigurerによってSpringにロードされて管理されるほか、データベース接続情報、JNDI接続情報属性ファイルなどもP r e t y PlaceholderConfigurerによってSpringにロードされて管理される.用法は以下の通りである:(1).PropertyPlaceholderConfigurerを使用して他のファイルをSpringにロードします.springプロファイルに次の構成を追加します.
(2).(1)のコンフィギュレーションによってロードされるコンフィギュレーションまたはプロパティファイルはspringにロードされます.また、データベース接続情報やJNDI接続情報など、ロードされたコンフィギュレーションまたはデータファイルのいくつかの情報を実行時に使用する必要がある場合は、タイプEL式の構文を使用して参照できます.たとえば、次のようになります.
注意:使用することもできます
ターゲット・オブジェクト・メソッドが呼び出されると、このメソッドによってターゲット・オブジェクトのプロキシ・オブジェクトが作成され、プロキシ・オブジェクトは自動的にそのinvokeメソッドを呼び出してターゲット・オブジェクトを呼び出し、呼び出し結果を返します.(2).cglibは通常javaクラスの動的エージェントに対して:cglibは動的エージェントを作成する時、目標クラスがインタフェースを実現しなければならないことを要求しないで、そのワークフローは以下の通りである:a.動的エージェントクラスの作成:
b.MethodInterceptorインタフェースを実現する:以下の方法を実現する:
注意:cglibはクラス動的エージェントだけでなく、メソッド動的エージェントにも使用できます.3.切面プログラミング(AOP)向けの基礎概念:一般的なjava方法で例を挙げる
a.横断注目点:上記の5つの通知の位置のように、javaオブジェクトにおいて、権限検証、事象処理、ログ記録などの処理ロジックを共通の処理ロジックとして組み込むことができるオブジェクトを横断注目点と呼び、オブジェクトプログラミング(OOP)向けの注釈点は、現実世界のものを縦方向にプログラミングするオブジェクトモデルである.一方,接面プログラミング(AOP)向けの注目点は横方向であり,プログラミングオブジェクトモデルに類似した処理ロジックを持つ場所を抽象化して接面を形成し,プログラミングオブジェクトにおける処理ロジックは横断的な注目点である.b.接面(Aspect):横断注目点を抽象化して接面を形成し、類と類似し、両者の注目点は異なり、類は事物特性の抽象であり、接面は横断注目点の抽象である.c.接続点(Joinpoint):springはメソッドタイプの接続点、すなわちブロックされたメソッドのみをサポートするため、ブロックされたポイント.Springではメソッドを指す.上の例のような方法.d.切り込み点(Pointcut):接続点をブロックする定義であり、接続点の集合、すなわち一連のブロックされた方法の集合である.e.通知(Advice):接続点にブロックされた後に行うべきこと、すなわちブロックされた後の論理処理を指す.通常の権限検証、物事処理、ログ記録などの操作は、通知で定義され、完了します.f.ターゲットオブジェクト(Target):エージェントのターゲットオブジェクト、すなわちブロックされたオブジェクト.上記の例のようにメソッドが存在するオブジェクト.g.織り込み(Weave):切断面をターゲットオブジェクトに適用し、プロキシオブジェクトの作成をもたらすプロセス.h.導入(Introduction):コードを変更しない前提で、実行期間中にクラスに動的にいくつかの方法とフィールドを追加することができます.1.Springにおける切面プログラミング(AOP)に対応する依存パッケージ:Spring解凍後のディレクトリにはlib/aspectj/aspectjweaverの3つのパッケージがある.jar lib/aspectj/aspectjrt.jar lib/cglib/cglib-nodep-2.1-3.jar 2. Springでフェース向けプログラミング(AOP)を使用する場合は、springプロファイルにaopのネーミングスペースを導入する必要があります.すなわち、次の構成を追加します.
注意:Spring 2.5以降、xmlプロファイルベースとjava注釈ベースの2つのAOPメソッドが提供される.注記方式のaopを使用するには、springプロファイルに次のオブジェクト注記方式aopのサポートを追加する必要があります. JavaBeanのパッケージクラスであるBeanWrapper:Springは、BeanWrapperクラスを介してjavabeanの動作をカプセル化し、 などのプロパティ値を設定および取得できます.
この方法により、被包装クラスに属性を設定することができる.7.注釈方式に基づく切断面向けプログラミング(AOP)の開発:(1).スプリングプロファイルに注記メソッドのaopサポートを追加します.(2).切断面の定義:通常のクラスの作成と同様に、クラスの前に'@Aspect'注記を付けて、クラスが切断面であることを示します.(3).カットにカットポイントを追加:カットポイントは、ブロックされたオブジェクトメソッドの集合であり、通常、カットポイントは、カットポイントのいずれかのカットポイントを処理する方法に定義されます.「@Pointcut」注記を使用します.構文は次のとおりです.
構文パラメータの詳細:a.最初の"*":ブロックされたメソッドが任意の戻りタイプであることを示します.b. com.test.サービス:ここでは、ブロックされるパケット名、すなわちブロックされるパケットを示す簡単な例を挙げます.c.ブロックされたパケット名の後ろの2つブロックされたパケットの下のサブパケットも再帰的にブロックされることを示す、すなわちブロックされたサブパケットである.d. ”..”その後の"*":ブロックされたパケットとそのサブパケットの下にあるすべてのクラス、すなわちブロックされたクラスを表す.e.最後の"*":ブロックされたクラスのすべてのメソッド、すなわちブロックされたメソッドを表す.f. ”(..)”:ブロックされたメソッドが任意のパラメータ、すなわちブロックされたパラメータを受信することを示す.注:切り込みポイント定義構文はワイルドカードをサポートしますが、構文規則に厳格に従う必要があります.如:@Pointcut("execution(com.test.service...add*(.)")に対してtest.サービスパケットおよびそのサブパケットの下にあるすべてのクラスを「add」で始まる方法でブロックします.(4).切面に通知を追加:Springで通知する場所は、3の小さな例を参照してください."@Before」注記:事前通知を宣言します.「@AfterRutruning」注記:後置通知を宣言します.「@After」注記:最終通知を宣言します.「@AfterThrowing」注記:例外通知を宣言します.「@Around」注記:オービット通知を宣言します.定義通知の例は次のとおりです.
注意:オービット通知は他の4つの通知とは少し異なり、オービット通知の定義は比較的特別であり、オービット通知はメソッド呼び出し全体の前後で機能するため、接続点オブジェクトを使用して、オービット通知処理後に論理処理を継続する必要があります.次のように定義されます.注釈方式に基づく切面プログラミング(AOP)向けに開発されたいくつかの小技術:(1).入力パラメータの取得: など
(2).次のような結果が返されます. XML方式に基づく面切りプログラミング(AOP)開発:(1).接面クラスを定義し、接面クラスに通知を追加します.(2).接面クラスを通常javaクラスのようにspringプロファイルで構成します.(3).SpringプロファイルにAOPプロファイルを追加すると、次のようになります: Springのトランザクション(Springの宣言トランザクション):トランザクションは簡単に言えばデータベースの最も基本的な操作を指し、トランザクションの詳細については後でデータベース関連のまとめで具体的に説明します.Springの面切りプログラミング(AOP)の最も重要な応用はトランザクション管理であり、Spring 2.5以降のバージョンのトランザクション管理では、注釈ベースの方法とXMLファイルベースの方法の2種類がサポートされています:(1).注釈ベースのトランザクション管理:a.springプロファイルにトランザクション管理を追加するネーミングスペースは、次のとおりです:
b.springプロファイルでトランザクションマネージャを構成するには、次のようにします.
c.springプロファイルに注釈方式をサポートするトランザクション構成項目を追加するには、次のようにします.
d.注釈ベースのトランザクション管理を使用する:Springが管理するJavaEEエンジニアリングにおいて、トランザクションのビジネスロジックの場所に「@Transactional」注釈を付ける必要がある.(2).XMLファイル方式に基づくトランザクション管理:a.springプロファイルでトランザクションマネージャを構成するには、次のようにします.
b.springプロファイルに物事管理の断面を追加するには、次のようにします.
c.springプロファイルでトランザクション通知に物事の処理特性を追加するには、次のようにします. SpringとStruts 1を統合する3つの方式:(1).方式1-springでstruts 1にコントローラを要求する方式:a.struts 1のプロファイルに次の構成を追加する:
b.StrutsプロファイルでのActionはtype属性を書くことなくSpringプロファイルでstrutsのactionを構成し、beanのnameはstruts 1プロファイルでactionのpath値である.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.(2).方式2-全権委任方式:a.struts 1のプロファイルでは、すべてのactionのtype属性値が:orgと書く.springframework.web.struts.Delegating.ActionProxy. b.Springプロファイルでstrutsのactionを構成します.beanのnameはstruts 1プロファイルでactionのpath値です.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.(3).方式3-strutsのactionがspringを継承するActionSupport方式:a.strutsのすべてのactionがspringのActionSupportクラスを継承する.b.strutsのプロファイルでは、次のように構成されています.
c.StrutsプロファイルでのActionはtype属性を書くことなくSpringプロファイルでstrutsのactionを構成し、beanのnameはstruts 1プロファイルでactionのpath値である.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.
<bean class=“org.springframework.beans.factory.config.PropertyPlaceholderConfigurer“>
<property name=“locations“>
<value>classpath: value>
……
property>
bean>
(2).(1)のコンフィギュレーションによってロードされるコンフィギュレーションまたはプロパティファイルはspringにロードされます.また、データベース接続情報やJNDI接続情報など、ロードされたコンフィギュレーションまたはデータファイルのいくつかの情報を実行時に使用する必要がある場合は、タイプEL式の構文を使用して参照できます.たとえば、次のようになります.
<bean id=”dataSource” destroy-method=”close” class=”org.apache.common.dbcp.BasicDataSource”>
<property name=”driverClassName” value=”${driver}”/>
<property name=”url” value=”${url}”/>
<property name=”username” value=”${username}”/>
<property name=”password” value=”${password}”/>
bean>
注意:使用することもできます
Proxy.newProxyInstance( , Class>[] , ( this))
ターゲット・オブジェクト・メソッドが呼び出されると、このメソッドによってターゲット・オブジェクトのプロキシ・オブジェクトが作成され、プロキシ・オブジェクトは自動的にそのinvokeメソッドを呼び出してターゲット・オブジェクトを呼び出し、呼び出し結果を返します.(2).cglibは通常javaクラスの動的エージェントに対して:cglibは動的エージェントを作成する時、目標クラスがインタフェースを実現しなければならないことを要求しないで、そのワークフローは以下の通りである:a.動的エージェントクラスの作成:
Enhancer enhancer = new Enhancer();
//
enhancer.setSuperclass( .getClass());
//
enhancer.setCallback(this);
b.MethodInterceptorインタフェースを実現する:以下の方法を実現する:
Object intercept(Objectm ,Method Method ,Object[] ,MethodProxy );
注意:cglibはクラス動的エージェントだけでなく、メソッド動的エージェントにも使用できます.3.切面プログラミング(AOP)向けの基礎概念:一般的なjava方法で例を挙げる
public ( ){ ——>
——>
try{
( )…….
——>
}Catch( e){
…… ——>
}finally{
…… ——>
}
}
a.横断注目点:上記の5つの通知の位置のように、javaオブジェクトにおいて、権限検証、事象処理、ログ記録などの処理ロジックを共通の処理ロジックとして組み込むことができるオブジェクトを横断注目点と呼び、オブジェクトプログラミング(OOP)向けの注釈点は、現実世界のものを縦方向にプログラミングするオブジェクトモデルである.一方,接面プログラミング(AOP)向けの注目点は横方向であり,プログラミングオブジェクトモデルに類似した処理ロジックを持つ場所を抽象化して接面を形成し,プログラミングオブジェクトにおける処理ロジックは横断的な注目点である.b.接面(Aspect):横断注目点を抽象化して接面を形成し、類と類似し、両者の注目点は異なり、類は事物特性の抽象であり、接面は横断注目点の抽象である.c.接続点(Joinpoint):springはメソッドタイプの接続点、すなわちブロックされたメソッドのみをサポートするため、ブロックされたポイント.Springではメソッドを指す.上の例のような方法.d.切り込み点(Pointcut):接続点をブロックする定義であり、接続点の集合、すなわち一連のブロックされた方法の集合である.e.通知(Advice):接続点にブロックされた後に行うべきこと、すなわちブロックされた後の論理処理を指す.通常の権限検証、物事処理、ログ記録などの操作は、通知で定義され、完了します.f.ターゲットオブジェクト(Target):エージェントのターゲットオブジェクト、すなわちブロックされたオブジェクト.上記の例のようにメソッドが存在するオブジェクト.g.織り込み(Weave):切断面をターゲットオブジェクトに適用し、プロキシオブジェクトの作成をもたらすプロセス.h.導入(Introduction):コードを変更しない前提で、実行期間中にクラスに動的にいくつかの方法とフィールドを追加することができます.1.Springにおける切面プログラミング(AOP)に対応する依存パッケージ:Spring解凍後のディレクトリにはlib/aspectj/aspectjweaverの3つのパッケージがある.jar lib/aspectj/aspectjrt.jar lib/cglib/cglib-nodep-2.1-3.jar 2. Springでフェース向けプログラミング(AOP)を使用する場合は、springプロファイルにaopのネーミングスペースを導入する必要があります.すなわち、次の構成を追加します.
xmlns:aop=”http://www.springframework.org/schema/aop”
“http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd”
注意:Spring 2.5以降、xmlプロファイルベースとjava注釈ベースの2つのAOPメソッドが提供される.注記方式のaopを使用するには、springプロファイルに次のオブジェクト注記方式aopのサポートを追加する必要があります.
<aop:aspectj-autoProxy/>
BeanWrapper = BeanWrapperImpl(new ());
.setPropertyValue(“ ”,” ”);
この方法により、被包装クラスに属性を設定することができる.7.注釈方式に基づく切断面向けプログラミング(AOP)の開発:(1).スプリングプロファイルに注記メソッドのaopサポートを追加します.(2).切断面の定義:通常のクラスの作成と同様に、クラスの前に'@Aspect'注記を付けて、クラスが切断面であることを示します.(3).カットにカットポイントを追加:カットポイントは、ブロックされたオブジェクトメソッドの集合であり、通常、カットポイントは、カットポイントのいずれかのカットポイントを処理する方法に定義されます.「@Pointcut」注記を使用します.構文は次のとおりです.
@Pointcut(“execution(* com.test.service..*.*(..))”)
public void anyMethod(){//
}
構文パラメータの詳細:a.最初の"*":ブロックされたメソッドが任意の戻りタイプであることを示します.b. com.test.サービス:ここでは、ブロックされるパケット名、すなわちブロックされるパケットを示す簡単な例を挙げます.c.ブロックされたパケット名の後ろの2つブロックされたパケットの下のサブパケットも再帰的にブロックされることを示す、すなわちブロックされたサブパケットである.d. ”..”その後の"*":ブロックされたパケットとそのサブパケットの下にあるすべてのクラス、すなわちブロックされたクラスを表す.e.最後の"*":ブロックされたクラスのすべてのメソッド、すなわちブロックされたメソッドを表す.f. ”(..)”:ブロックされたメソッドが任意のパラメータ、すなわちブロックされたパラメータを受信することを示す.注:切り込みポイント定義構文はワイルドカードをサポートしますが、構文規則に厳格に従う必要があります.如:@Pointcut("execution(com.test.service...add*(.)")に対してtest.サービスパケットおよびそのサブパケットの下にあるすべてのクラスを「add」で始まる方法でブロックします.(4).切面に通知を追加:Springで通知する場所は、3の小さな例を参照してください."@Before」注記:事前通知を宣言します.「@AfterRutruning」注記:後置通知を宣言します.「@After」注記:最終通知を宣言します.「@AfterThrowing」注記:例外通知を宣言します.「@Around」注記:オービット通知を宣言します.定義通知の例は次のとおりです.
@Before(“anyMethod()( )”)
public void doAccessCheck(){
……
}
注意:オービット通知は他の4つの通知とは少し異なり、オービット通知の定義は比較的特別であり、オービット通知はメソッド呼び出し全体の前後で機能するため、接続点オブジェクトを使用して、オービット通知処理後に論理処理を継続する必要があります.次のように定義されます.
@Around( )
public Object doBasicProfiling(ProcedingJoinPoint pjp) throws Throwable{
……
return pjp.proceed();//
}
@Before(“ && args( )”)
public void doSomething(String ){……}
(2).次のような結果が返されます.
@AfterReturning(Pointcut=” ”,returning=” ”)
public void dosomething(String ){……}
<aop:config>
<aop:aspect id=” id” ref=”spring id”>
<aop:pointcut id=” id”
expression=”execution(* com.test.service..*.*(..))”/>
<aop:before pointcut-ref=” id” method=” ”/>
<aop:after ……/>
……
aop:aspect>
aop:config>
xmlns:ts=http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
b.springプロファイルでトランザクションマネージャを構成するには、次のようにします.
<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”spring bean id”/>
bean>
c.springプロファイルに注釈方式をサポートするトランザクション構成項目を追加するには、次のようにします.
<tx:annotation-driventransaction-managertx:annotation-driventransaction-manager=”txManager(spring bean id)”/>
d.注釈ベースのトランザクション管理を使用する:Springが管理するJavaEEエンジニアリングにおいて、トランザクションのビジネスロジックの場所に「@Transactional」注釈を付ける必要がある.(2).XMLファイル方式に基づくトランザクション管理:a.springプロファイルでトランザクションマネージャを構成するには、次のようにします.
<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”spring bean id”/>
bean>
b.springプロファイルに物事管理の断面を追加するには、次のようにします.
<aop:config>
<aop:pointcut id=”transactionPointcut”
Expression=”execution(* com.test.service..*.*(..))”/>
<aop:advisor advice-ref=”txAdvice” pointcut-ref=”transactionPointcut”/>
aop:config>
c.springプロファイルでトランザクション通知に物事の処理特性を追加するには、次のようにします.
<tx:advice id=”txAdvice” transactionManager=”txManager”>
<tx:attributes>
<tx:method name=”get*” read-only=”true” propagation=”NOT_SUPPORTED”/>
<tx:method name=”*”/>
tx:attributes>
tx:advice>
<controller>
<set-property property=”processorClass”
Value=”org.springframework.web.struts.DelegatingRequestProcessor”/>
controller>
b.StrutsプロファイルでのActionはtype属性を書くことなくSpringプロファイルでstrutsのactionを構成し、beanのnameはstruts 1プロファイルでactionのpath値である.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.(2).方式2-全権委任方式:a.struts 1のプロファイルでは、すべてのactionのtype属性値が:orgと書く.springframework.web.struts.Delegating.ActionProxy. b.Springプロファイルでstrutsのactionを構成します.beanのnameはstruts 1プロファイルでactionのpath値です.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.(3).方式3-strutsのactionがspringを継承するActionSupport方式:a.strutsのすべてのactionがspringのActionSupportクラスを継承する.b.strutsのプロファイルでは、次のように構成されています.
in className=”org.springframework.web.struts.contextLoaderPlugIn”>
<set-property property=”contextConfigLocation” value=”spring ”/>
in>
c.StrutsプロファイルでのActionはtype属性を書くことなくSpringプロファイルでstrutsのactionを構成し、beanのnameはstruts 1プロファイルでactionのpath値である.classの値はactionの全パスです.注意:springで構成されたactionでは、idに「/」などの特殊文字は許可されていないため、id属性は使用されません.