スプリング<br>事務管理の設定が無効です.分析と解決策

8775 ワード

設定は以下の通りです
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="query*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>
<!-- AOP      -->
<aop:config>
    <aop:pointcut id="dbService" expression="execution(* com.qyd.sms.service.api.student.service.StudentService.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="dbService" />
</aop:config>
事務管理が無効であると同時に、非常に奇妙な現象があります.comp.qyd.sys.service.appi.student.service.StudentServiceという類を、<bean/>という形で配置したら、事務管理が有効になります.
この文章の内容はStudentServiceがspringにロードされていないからです.spring MVCではなく、sprigMVCにロードされています.srpingMVCをロードする時、事務に関する部分を処理していませんので、事務の設定は無効です.
発色があって、プロジェクトのスプリング、スプリングMVCの起動方式を重点的に見に行きます.
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/META-INF/spring/spring-beans.xml</param-value>
</context-param>

<servlet>
    <servlet-name>qyd-sms-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/META-INF/spring/spring-web.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>qyd-sms-servlet</servlet-name>
    <url-pattern>/*</url-pattern> </servlet-mapping>
springはContect LoaderListenerによって起動され、spring MVCはDisplatServletによって起動され、検証された結果、springはspring MVCより先に起動されました.
現在の設定:spring起動は事務管理を配置しています.自動スキャンは配置されていません.springMVCはグローバルの自動スキャンを配置しています.
トランザクションが無効な理由分析:spring起動時に事務管理情報を得ることができますが、スキャン配置がないため、注釈で登録されたStudentServiceが見えなくなり、StudentServiceの事務に関する処理ができなくなります.
スプリングMVCが起動したら、StudentServiceに登録できますが、事務管理に関する配置がないと、事務に関する処理はしません.
したがって、spring起動時にStudentServiceを見たら、事務関連の処理ができます.これはまた、明示的にbeanを配置すると効果的になる理由を説明しました.通常はserviceごとに明示的に配置しないので、spring配置スキャンで解決できます.
私の解決策:
スプリングMVC:
<mvc:annotation-driven/>
<context:component-scan base-package="com.qyd.sms.controller" />
スプリング:
<context:component-scan base-package="com.qyd.sms" >
    <context:exclude-filter type="annotation" 
    expression="org.springframework.stereotype.Controller"/>     
</context:component-scan>
設定ファイルは上記の通りです.理由は以下に説明します.
説明:テストを経て、springMVC Controllerの登録はspring起動時に行うことができません.登録されたController情報をspring MVCが取得した後に行われたさらなる処理は、来訪の要請を受けます.
私はより傾向があります.スプリングMVCは同じビーン容器を使っています.スプリングMVCは完全にスプリングに基づいて注入依存関係を処理しています.スプリングMVCだけが追加のことをしました.
両方の機能が違っていますので、配置ファイルについては、機能によって完全に分離する傾向があります.springMVCはController層の登録のスキャンだけを担当しています.springは他のすべてを担当しています.