此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
楼主【blackice1015】截止到2008-07-03 10:56:12的历史汇总数据(不包括此帖):
发帖的总数量:1                        发帖的总分数:0                        
结贴的总数量:1                        结贴的总分数:0                        
无满意结贴数:1                        无满意结贴分:20                       
未结的帖子数:0                        未结的总分数:0                        
结贴的百分比:100.00%               结分的百分比:---------------------
无满意结贴率:100.00%               无满意结分率:---------------------
敬礼!

解决方案 »

  1.   

    部分方法通过缓存拦截器 这个是什么意思啊,spring里面的很多都是静态的切入点,只有第一次调用的时候才会去判断一个方法是否要用代理,从你的配置看,你用到了事务,而且是显示的事务,那么每次执行service方法的时候都会拦截你的方法,除非你其他的方法不需要事务,如果不需要事务,你可以重新在配置个BeanNameAutoProxyCreator,只不过这个类的名字不要以Service结尾就行了,下面是我拦截action的配置<bean id="actionProxyCreator"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
    <list>
    <idref local="actionPointcutAdvisor" />
    </list>
    </property>
    <property name="proxyTargetClass">
    <value>true</value>
    </property>
    <property name="beanNames">
    <list>
    <value>/login</value>
    <value>/user</value>
    <value>/company</value>
    <value>/stuff</value>
    <value>/experiment</value>
    </list>
    </property>
    </bean>/login,/user,是我的action的path,每次都会拦截下,如果用缓存,那么你就自己去实现一个pointcut把,这个因该不是很麻烦!
      

  2.   

    您好,我刚才看您的帖子了,我先试试看,谢谢,你的id=="actionProxyCreator" 这个bean是系统自动调用还是你需要指定啊?我配置的BeanNameAutoProxyCreator没有配置id,系统自动拦截*Service的请求。我对这个不是太熟,请大侠指教
    我的情况是这样的,我配置了一个
    <bean 
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames"> 
    <list> 
    <value>*Service </value> 
    </list> 
    </property>
    <property name="interceptorNames"> 
    <list> 
    <value>methodCachePointCut </value>            
    <value>transactionInterceptor </value> 
    </list> 
    </property> 
    </bean> 意思是所有符合*Service的bean都要经过这个BeanNameAutoProxyCreator代理,其中会有两个拦截器,其一是事务拦截器transactionInterceptor ,其二methodCachePointCut 方法缓存拦截器
    如下:
    <bean id="transactionInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
    <props>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>缓存拦截器
        <!-- 引用ehCache的配置 -->   
        <bean id="defaultCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">   
          <property name="configLocation">   
            <value>classpath:ehcache.xml</value>   
          </property>   
        </bean>   
           
        <!-- 定义ehCache的工厂,并设置所使用的Cache name -->   
        <bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">   
          <property name="cacheManager">   
            <ref local="defaultCacheManager"/>   
          </property>   
          <property name="cacheName">   
              <value>DEFAULT_CACHE</value>   
          </property>   
        </bean>   
      
        <!-- find/create cache拦截器 -->   
        <bean id="methodCacheInterceptor" class="com.dc.common.cache.ehcache.MethodCacheInterceptor">   
          <property name="cache">   
            <ref local="ehCache" />   
          </property>   
        </bean>       <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">   
          <property name="advice">   
            <ref local="methodCacheInterceptor"/>   
          </property>   
          <property name="patterns">   
            <list>   
         <value>.*get.*</value>  
            </list>   
          </property>   
        </bean>   
    我想要的结果是:所有*service的bean必须要经过事务拦截器,但是有一些service类是不需要经过缓存拦截器
    例如我有10个Service类,配置了了10个bean ; AaaService,BbbService,CccService....
    其中这10个Service都需要事务,但是有两个Service,例如(AaaService,CccService)不仅要经过事务代理还要经过缓存代理,这样怎么配置?
    我现在的配置也能实现,但是就是性能太差,也就是意味着所有的Service都要经过两个拦截器
    不知道我描述明白了吗?谢谢
    实际工程项目中的Service很多,其实我就想要单独配置不同Service的不同拦截器
      

  3.   

    命名规范一点呢?
    比如要通过事务的,就用 *TransactionServlet,
    不仅要经过事务代理还要经过缓存代理的,就用 *TransactionProxyServlet
      

  4.   

    换种说法吧:
    如何在applicationContext.xml配置两个或多个BeanNameAutoProxyCreator怎么配置。
    这样配置的原因主要是:根据不同的bean调用不同的拦截器,请专家指点一二,谢谢!!!!例如:
    <bean 
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames"> 
    <list> 
    <value>AaaService</value> 
    <value>BbbService</value> 
    <value>CccService</value> 

    </list> 
    </property> 
    <property name="interceptorNames"> 
    <list> 
    <value>aaaInterceptor</value>            
    </list> 
    </property> 
    </bean> <bean 
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames"> 
    <list> 
    <value>XxxService</value> 
    <value>YyyService</value> 
    <value>ZzzService</value> 

    </list> 
    </property> 
    <property name="interceptorNames"> 
    <list> 
    <value>bbbbInterceptor</value>            
    </list> 
    </property> 
    </bean> 我现在这样配置spring报错
    请各位高手指点,怎么能实现这种灵活配置的效果
      

  5.   

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
    <property name="beanNames"> 
    <list> 
    <value>*Service </value> 
    </list> 
    </property> 
    <property name="interceptorNames"> 
    <list>       
    <value>transactionInterceptor </value> 
    </list> 
    </property> 
    </bean> 
    这个配置事务,拦截所有得service
    在起一个缓存拦截器,可以自己定义,也可以用BeanNameAutoProxyCreator,
     这个拦截器用来拦截你的自定义service,下班了,明天在告诉你!
      

  6.   

    一种方法是你可以自己把缓存拦截的类单独放到一个包,然后按照包名拦截下所有的类;一种是你直接定义一个advice,然后对应这个advice再配置一个advisor,专门拦截.直接拦截到包里面的具体方法.还有一种,能否考虑自动代理的时候你自己写正则表达式,过滤掉不需要拦截的类.