`
Feiing
  • 浏览: 238238 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 事务简化配置

阅读更多
在 spring 中,  事务管理一般是通过声明一个 txProxyTemplate,  然后业务 bean 中 parent = "txProxyTemplate",  这样做未免显得有些繁琐,  并且如果业务 bean 还需要其他拦截器,  配置也不太方便,  下面贴出我的配置, 用 DefaultAdvisorAutoProxyCreator 实现自动代理

<beans>
	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
    <bean id="transactionManager"
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          <property name="sessionFactory">
              <ref bean="sessionFactory"/>
          </property>
    </bean>	
	
	<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    	<property name="transactionManager" ref="transactionManager"/>
		<property name="transactionAttributeSource">
		  <value>
			com.skyon.user.manager.UserManager.*=PROPAGATION_REQUIRED
			#Add new defines here ->
		  </value>
		</property>
	</bean>
	
	<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value>
				<!--
				增加新的 Interceptor
				-->
			</list>
		</property>
	</bean>

	<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
	  <property name="transactionInterceptor" ref="transactionInterceptor"/>
	</bean>
		
</beans>



这里利用 DefaultAdvisorAutoProxyCreator 实现了对容器中所有 bean 的自动代理,  增加一个需要事务的业务 bean 时只要在 transactionInterceptor 增加一行即可,  增加别的 interceptor 也非常方便,
极大减少了配置量
分享到:
评论
44 楼 flyeagle 2007-03-29  
   这个贴没人给跟一下吗?请大家指点一下
43 楼 flyeagle 2007-03-29  
  看来这个贴是没有人回复了,这个问题到底是怎么产生的呢?
42 楼 flyeagle 2007-03-29  
  我使用hongliang给出的配置方法出现了问题,请大家指点一下:
   配置如下:
 

	<bean id="userSortDao"
		class="com.hengji.dao.impl.UserSortDaoImpl">
		<property name="sqlMapClient">
			<ref bean="sqlMapClient" />
		</property>
	</bean>
	<bean id="userSort[b]Service[/b]"
		class="com.hengji.service.impl.UserSortServiceImpl">
		<property name="userSortDao">
			<ref bean="userSortDao" />
		</property>
	</bean>
<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager" ref="transactionManager" />
		<property name="transactionAttributes">
			<props>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
	</bean>
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<value>*Service</value><!-- <value>*Service,*Manager</value> -->
		</property>
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value>
				<!--   
					此处增加新的Interceptor  
				-->
			</list>
		</property>
	</bean>

	<bean
		class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
		<property name="transactionInterceptor"
			ref="transactionInterceptor" />
	</bean>

  在不加入事务时,插入和查询没问题,在加入上面事务后,可以插入,但是在检索时出现如下问题:
The error occurred while applying a result map.  
--- Check the UserSort.resultUserSort.  
--- The error happened while setting a property on the result object.  
--- Cause: [b]java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't [/b]start a cloned connection while in manual transaction mode.
	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185)
	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:615)
	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:589)
	at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)


这是为什么呢?
41 楼 小疯子 2007-02-26  
hermitte 写道
    <aop:config>
        
        <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
    </aop:config>
   
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

上面是appfuse里的,我觉得比LZ的要简洁点
下面的service也好配置

<bean id="roleManager" class="org.appfuse.service.impl.RoleManagerImpl">
        <property name="roleDao" ref="roleDao"/>
    </bean>
这样就可以了



呵呵...都快一年了,版本都不一样了吧!
40 楼 piaochunzhi 2007-02-26  
我不懂 SPRING 感觉 配置文件真让人头疼 ,看了都疼!
39 楼 hermitte 2007-02-03  
    <aop:config>
        
        <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
    </aop:config>
   
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

上面是appfuse里的,我觉得比LZ的要简洁点
下面的service也好配置

<bean id="roleManager" class="org.appfuse.service.impl.RoleManagerImpl">
        <property name="roleDao" ref="roleDao"/>
    </bean>
这样就可以了

38 楼 blackstreet 2007-02-02  
org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor

这个起到什么用处
37 楼 wuyingsong 2007-02-01  
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
                <property name="beanNames"> 
                    <value>*Service,*Manager</value> 
                </property> 
                <property name="interceptorNames">   
                        <list>   
                                <value>transactionInterceptor</value>   
                                <!--  
                                此处增加新的Interceptor 
                                -->   
                        </list>   
                </property>   
        </bean>   
其实你只是这儿<value>*Service,*Manager</value> 用了通配符而已
36 楼 loaer 2007-01-31  
<div class='code_title'>xml 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-xml'>
    <li class='alt'><span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span>  </span></span></li>
    <li class=''><span>        </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"</span><span class='tag'>&gt;</span><span>  </span></li>
    <li class='alt'><span>        </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"transactionInterceptor"</span><span>  </span></li>
    <li class=''><span>            </span><span class='attribute'>ref</span><span>=</span><span class='attribute-value'>"transactionInterceptor"</span><span> </span><span class='tag'>/&gt;</span><span>  </span></li>
    <li class='alt'><span>    </span><span class='tag'>&lt;/</span><span class='tag-name'>bean</span><span class='tag'>&gt;</span><span>  </span></li>
</ol>
</div>
<br/>
是多余的吧?
35 楼 loaer 2007-01-31  
<bean
class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor"
ref="transactionInterceptor" />
</bean>

是多余的吧?
34 楼 loaer 2007-01-31  
<!-- 
     增加新的 Interceptor 
--> 

请问这个是用来干什么的?
33 楼 Leapiny 2007-01-25  
Feiing 写道
呵呵, 想不到大家反响这么激烈, 我说一下自己的想法
3. 说到事务控制, 其实我的项目是放在 Action 做的, 可能要被鄙视了, 我们用 xwork Interceptor 实现, 再加上 webwork
   <default-interceptor-ref name="defaultStack" /> 的功能, 基本上完全不用再管事务, 当然策略只能是 PROPAGATION_REQUIRED 了


不是有意挖坟,确实有问题想交流。

为了尽量使接口简洁点,尝试把事务放在action中 (webwork),但是对action外面包一层事务处理后,action就不能用了,现在想到的也是自己做个拦截器,所有的方法都是 PROPAGATION_REQUIRED ,总觉得不太好,不知道有没有人有在action中处理事务的经验给介绍下。
32 楼 差沙 2006-04-07  
autowire="byName"会自动根据你的属性的名字帮你注入你要的bean,要不就要手动写明。
31 楼 liuyifan.com 2006-04-07  
autowire="byName" 不是必需的吧
30 楼 cnsdl 2006-04-04  
如果想PROPAGATION_REQUIRED,readOnly,写了接口也不方便,支持feiing
29 楼 hongliang 2006-03-30  
差沙 写道
hongliang 写道

啊!!!这个我还真的没有注意到,因为我所有的Service层都是*Service,我从来不用*Manager的。。。怪不得我的没问题,


关键是你的事务管理对象的名字是*Manager呀,怎么会没有问题出现呢?难道是我的人品问题??


我上面给的代码写的是*Service,*Manager,是为叻迎合大家的口味 我自己不用*Manager,只有*Service 
28 楼 差沙 2006-03-30  
hongliang 写道

啊!!!这个我还真的没有注意到,因为我所有的Service层都是*Service,我从来不用*Manager的。。。怪不得我的没问题,


关键是你的事务管理对象的名字是*Manager呀,怎么会没有问题出现呢?难道是我的人品问题??
27 楼 hongliang 2006-03-30  
差沙 写道
受hongliang启发,我现在就用这个方法,但是发现一个Bug。里面代理匹配的名字有*Manager,就是想匹配所有的ManagerObject。但是好像没有注意到,这样配置会把transactionManager也匹配上,然后定义的是find以外的方法都是要事务的。也就说transactionManager执行getTransaction的时候还会要事务,然后就是死循环,造成溢出。。

我解决的办法就是transactionManager改称transactionManagerHibernate。这么做的时候一定要注意名字的问题。别一不小心,把一个不相关的东东给弄进来的。。。

对了,加Acegi的时候有很多*Manager,打算想一个比较好名字匹配。。


啊!!!这个我还真的没有注意到,因为我所有的Service层都是*Service,我从来不用*Manager的。。。怪不得我的没问题,
26 楼 差沙 2006-03-30  
hongliang 写道
完整版来叻!!
下面的是Feiing给出的更好的方案,我有一些修改:

<beans> 
        <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA); --> 
    <bean id="transactionManager"           class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
          <property name="sessionFactory"> 
              <ref bean="sessionFactory"/> 
          </property> 
    </bean>        
        
        <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
            <property name="transactionManager" ref="transactionManager"/> 
            <property name="transactionAttributes">
                <props>
                    <prop key="*">PROPAGATION_REQUIRED</prop>
                    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
        </bean> 
        
        <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
                <property name="beanNames">
                    <value>*Service,*Manager</value>
                </property>
                <property name="interceptorNames"> 
                        <list> 
                                <value>transactionInterceptor</value> 
                                <!-- 
                                此处增加新的Interceptor
                                --> 
                        </list> 
                </property> 
        </bean> 

        <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> 
          <property name="transactionInterceptor" ref="transactionInterceptor"/> 
        </bean> 


        <bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/>
                
</beans> 


以后每次的增量是这一段:
        <bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/>


跟配置普通bean的方法一样,非常简洁、直观。对现有的Service接口也无须任何修改

我把Feiing的transactionAttributesSource改成叻transactionAttributes,并且将DefaultAdvisorAutoProxyCreator改成了BeanNameAutoProxyCreator,我觉得毕竟不是context下的每个bean都需要事务,只要在Service层做AOP就可以叻。

和Robbin一致认为,Feiing的做法非常可取,因为它分离叻XML配置文件关注点


受hongliang启发,我现在就用这个方法,但是发现一个Bug。里面代理匹配的名字有*Manager,就是想匹配所有的ManagerObject。但是好像没有注意到,这样配置会把transactionManager也匹配上,然后定义的是find以外的方法都是要事务的。也就说transactionManager执行getTransaction的时候还会要事务,然后就是死循环,造成溢出。。

我解决的办法就是transactionManager改称transactionManagerHibernate。这么做的时候一定要注意名字的问题。别一不小心,把一个不相关的东东给弄进来的。。。

对了,加Acegi的时候有很多*Manager,打算想一个比较好名字匹配。。
25 楼 sunandrain 2006-03-27  
这样配置,在单独测试usermanager时,没有问题.
但当放到tomcat中,通过action调用usermanager时却出现异常,用以前的那种配法没有出现问题.
Exception:
2006-03-27 12:35:21,377 ERROR [com.opensymphony.webwork.dispatcher.DispatcherUtils] - Could not execute action
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method);
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39);
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25);
	at java.lang.reflect.Method.invoke(Method.java:585);
	at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:353);
	at com.opensymphony.xwork.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:208);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:182);
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:94);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:94);
	at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180);
	at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:119);
	at com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:183);
	at com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:182);
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202);
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173);
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213);
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178);
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126);
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105);
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107);
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148);
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869);
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667);
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527);
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80);
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684);
	at java.lang.Thread.run(Thread.java:595);
Caused by: java.lang.StackOverflowError
	at java.lang.System.identityHashCode(Native Method);
	at java.util.IdentityHashMap.hash(IdentityHashMap.java:283);
	at java.util.IdentityHashMap.get(IdentityHashMap.java:313);
	at org.springframework.aop.framework.HashMapCachingAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(HashMapCachingAdvisorChainFactory.java:44);
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:154);
	at $Proxy1.getTransaction(Unknown Source);
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:217);
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:89);
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144);
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174);
	at $Proxy1.getTransaction(Unknown Source);
......

相关推荐

    SpringBoot简化Spring应用初始搭建以及开发过程

    Spring Boot专注于Spring平台和第三方开发库,简化了基于Spring的产品开发。让你在开始Spring应用开发时,不会被各种繁杂的事务困扰。通过Spring Boot,开发时只需少量的Spring配置就可以完成项目结构的初始搭建。

    spring4示例代码

    spring-1 演示了使用setter方式及构造器方式创建bean,util:list标签创建集合,p标签简化配置 和依赖注入, 以及bean的autowire和继承与依赖,以及bean的作用域。 spring-2 演示了外部配置文件的引入(connection)...

    spring课堂笔记的相关知识

    只需要通过配置就可以完成对事务的管理,而无需手动编程 方便程序的测试 Spring对Junit4支持,可以通过注解方便的测试Spring程序 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀...

    用于将所有Spring xml配置转换为基于Spring java的配置的工具(高分毕设).zip

    Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + ...它提供了一种将数据库操作与Java对象映射起来的方式,避免了手动编写繁琐的SQL语句,并提供了事务管理和缓存等功能,简化了数据库访问的过程

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言...

    Spring 2.0 开发参考手册

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    spring4.3.2参考文档(英文)

    Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP:通过配置管理特性,Spring AOP 模块...

    spring4.3.9相关jar包

    spring-beans.jar(必须):这 个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI ...

    Spring中文帮助文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    Spring API

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于...

    spring chm文档

    2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. ...

    第24次课-1 Spring与Hibernate的整合

    方便的事务管理:Spring提供的声明式事务处理可以全面有效地处理事务。 异常包装:Spring能够包装Hibernate的异常,使开发者可以选择恰当的层来处理异常。 24.2 管理SessionFactory Hibernate的SessionFactory,是...

    纯spring多库

    纯spring多数据库事务,是spring和atomikos组合使用。有spring注解设置数据源,由atomikos负责数据源管理,负责事务管理。追求零配置。大大简化工作量。供参考

    Spring.3.x企业应用开发实战(完整版).part2

    4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 ...

    Spring攻略(第二版 中文高清版).part1

    2.8 用Java Config简化XML配置 77 2.8.1 问题 77 2.8.2 解决方案 77 2.8.3 工作原理 77 2.9 使Bean感知容器 81 2.9.1 问题 81 2.9.2 解决方案 81 2.9.3 工作原理 82 2.10 加载外部资源 82 2.10.1...

    spring的概要介绍与分析

    Spring是一个开源的Java应用框架,它旨在简化...Spring Boot是Spring框架的一个子项目,它提供了自动配置、简化依赖管理和内置Web服务器等功能,使得开发者能够更快地构建和部署Spring应用程序。Spring Cloud则是一系列

    spring boot 全面的样例代码

    - chapter3-2-2:[使用Spring-data-jpa简化数据访问层(推荐)](http://blog.didispace.com/springbootdata2/) - chapter3-2-3:[多数据源配置(一):JdbcTemplate]...

    Spring in Action中文版 清晰pdf part2

    附录A介绍如何开始自己的Spring应用系统,如何下载Spring以及如何编写Ant配置文件。附录B介绍一些与Spring有关的其他开源框架。本书的每一部分既是建立在前一部分的基础上,同时也都是独立存在的,所以,读者不必...

    Spring面试71题与答案

     事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。  异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的...

    SpringCloud Alibaba 实战2021年

    │ 12 配置中心:基于 Naco 集中管理应用配置.mp4 │ 15 应用性能监控:通过 SkyWalking 实施链路追踪.mp4 │ 16 分布式事务:Alibaba Seata 如何实现分布式事务.mp4 │ 17 消息队列:基于 RocketMQ 实现服务...

Global site tag (gtag.js) - Google Analytics