??xml version="1.0" encoding="utf-8" standalone="yes"?> Hibernate 的jar包说明(转) Hibernate一共包括了23个jar包,令hD~ؕ。下载HibernateQ例?.0.3E_版本Q解压羃Q可以看C个hibernate2.jar和lib目录下有22个jar包: Q?Qhibernate2.jar: Hibernate的库Q没有什么可说的Q必M用的jar? Q?Qcglib-asm.jar: CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库Q必M用的jar? Q?Qdom4j.jar: dom4j是一个Java的XML APIQ类gjdomQ用来读写XML文g的。dom4j是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的YӞ可以在SourceForge上找到它。在IBM developerWorks上面可以扑ֈ一文章,对主的Java XML APIq行的性能、功能和易用性的评测Qdom4j无论在那个方面都是非常出色的。我早在近两年之前开始用dom4jQ直到现在。如今你可以看到来多的Java软g都在使用dom4j来读写XMLQ特别值得一提的是连Sun的JAXM也在用dom4j。这是必M用的jar包,Hibernate用它来读写配|文件? Q?Qodmg.jar: ODMG是一个ORM的规范,Hibernate实现了ODMG规范Q这是一个核心的库,必须使用的jar包? Q?Qcommons-collections.jarQ? Apache Commons包中的一个,包含了一些Apache开发的集合c,功能比java.util.*强大。必M用的jar包? Q?Qcommons-beanutils.jarQ? Apache Commons包中的一个,包含了一些Bean工具cȝ。必M用的jar包? Q?Qcommons-lang.jar: Apache Commons包中的一个,包含了一些数据类型工LQ是java.lang.*的扩展。必M用的jar包? Q?Qcommons-logging.jar: Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本n包含了一个Simple LoggerQ但是功能很弱。在q行的时候它会先在CLASSPATH找log4jQ如果有Q就使用log4jQ如果没有,找JDK1.4带的java.util.loggingQ如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾Q当初Apache极力游说Sun把log4j加入JDK1.4Q然而JDK1.4目组已经接近发布JDK1.4产品的时间了Q因此拒l了Apache的要求,使用自己的java.util.loggingQ这个包的功能比log4j差的很远Q性能也一般?/p>
后来Apache开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的logE序Q底层的Logger是可以切换的Q你可以选择log4jQjava.util.logging或者它自带的Simple Logger。不q我仍然强烈使用log4jQ因为log4j性能很高Qlog输出信息旉几乎{于System.outQ而处理一条logq_只需?us。你可以在Hibernate的src目录下找到Hibernate已经Z准备好了的log4j的配|文Ӟ你只需要到Apache |站M载log4j可以了。commons-logging.jar也是必须的jar包? 使用Hibernate必须的jar包就是以上的q几个,剩下的都是可选的? ant.jar: Ant~译工具的jar包,用来~译Hibernate源代码的。如果你不准备修改和~译Hibernate源代码,那么没有什么用Q可选的jar? optional.jarQ? Ant的一个辅助包? c3p0.jarQ? C3PO是一个数据库q接池,Hibernate可以配置Z用C3POq接池。如果你准备用这个连接池Q就需要这个jar包? proxool.jarQ? 也是一个连接池Q同上? commons-pool.jar, commons-dbcp.jar: DBCP数据库连接池QApache的Jakartal织开发的QTomcat4的连接池也是DBCP? 实际上Hibernate自己也实C一个非帔R常简单的数据库连接池Q加上上?个,你实际上可以在Hibernate上选择4U不同的数据库连接池Q选择哪一个看个h的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中用HibernateQ一定要用App Server的连接池Q不要用以上4U连接池Q否则容器管理事务不起作用? connector.jar: JCA 规范Q如果你在App Server上把Hibernate配置为Connector的话Q就需要这个jar。不q实际上一般App Server肯定会带上这个包Q所以实际上是多余的包? jaas.jar: JAAS是用来进行权限验证的Q已l包含在JDK1.4里面了。所以实际上是多余的包? jcs.jarQ? 如果你准备在Hibernate中用JCS的话Q那么必d括它Q否则就不用? jdbc2_0-stdext.jar: JDBC2.0的扩展包Q一般来说数据库q接池会用上它。不qApp Server都会带上Q所以也是多余的? jta.jarQ? JTA规范Q当Hibernate使用JTA的时候需要,不过App Server都会带上Q所以也是多余的? junit.jar: Junit包,当你q行Hibernate自带的测试代码的时候需要,否则׃用? xalan.jar, xerces.jar, xml-apis.jar: Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上QJDK1.4也包含了解析器,不过不是XercesQ是CrimsonQ效率比较差Q不qHibernate用XML只不q是d配置文gQ性能没什么紧要的Q所以也是多余的?/p>
http://ant.apache.org/ Ant 的核心包,在构建Hibernate 时会用到 http://www.antlr.org/ 语言转换?Hibernate利用它实?HQL ?SQL的{?/p>
http://asm.objectweb.org/ ASM 字节转换?/p>
http://sourceforge.net/projects/c3p0 C3PO JDBC q接池工?/p>
http://cglib.sourceforge.net/ 高效的代码生成工? Hibernate用它在运行时扩展 Javacd实现 Java 接口 http://jakarta.apache.org/commons/collections Apache 的工具集,用来增强Java寚w合的处理能力 http://jakarta.apache.org/commons/logging/ Apache 软g基我l所提供的日志工?/p>
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html U程同步工具,在用JBoss 的树状缓存时需要用?/p>
http://java.sun.com/j2ee/connector/ 用连接多个应用服务器的标准连接器 http://dom4.j.org/ dom4j XML 解析?/p>
http://sourceforge.net/projects/echache ~存工具.在没有提供其他缓存工h,q个~存工具是必不可的 http://java.sun.com/products/jass/ 标准?Java 权限和认证服务包 http:jaxen.org/ 通用?XPath 处理引擎 http://www.jboss.com/products/jbosscache JBoss 的一U树状缓存实现工?/p>
http://jboss.org/ Jboss 的基?在?JBoss 的树状缓存时必须有此?/p>
http://jboss.org/ JBoss ?JMX 实现?/p>
http://jboss.org/ JBoss 的核?包括服务器和部v引擎 http://java.sun.com/products/jdbc/download.html#spec 标准?JDBC 2.0 扩展API http://www.jgroups.org/ |络通信工具?/p>
http://java.sun.com/products/jta 标准?JAVA 事务处理接口 http://www.junit.org/ JUnit 试框架 http://logging.apache.org/log4j/ log4j ?Apache 的日志工?/p>
http://www.opensymphony.com/oscache/ Java 对象的缓存工?/p>
http://proxool.sourceforge.net/ Proxool JDBC q接池工?/p>
http://swarmcache.sourceforge.net/ Hibernate 可以使用的一U缓存工?/p>
versioncheck.jar 版本查工具包,用于在构建Hibernate 的时候检查辅?jar 包文件的版本 http://xml.apache.org/xerces2-j/ SAX XML 解析?/p>
http://xml.apache.org/xerces2-j/ Java语言中标准的XML 解析?/p>
很多人对二~存都不太了解,或者是有错误的认识Q我一直想写一文章介l一下hibernate的二U缓存的Q今天终于忍不住了?
我的l验主要来自hibernate2.1版本Q基本原理和3.0?.1是一LQ请原谅我的固不化?
hibernate的session提供了一U缓存,每个sessionQ对同一个idq行两次loadQ不会发送两条sqll数据库Q但是session关闭的时候,一U缓存就失效了?
二~存是SessionFactoryU别的全局~存Q它底下可以使用不同的缓存类库,比如ehcache、oscache{,需要设|hibernate.cache.provider_classQ我们这里用ehcacheQ在2.1中就?
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询~存Q加?
hibernate.cache.use_query_cache=true
~存可以单的看成一个MapQ通过key在缓存里面找value?
Class的缓?/strong>
对于一条记录,也就是一个PO来说Q是ҎID来找的,~存的key是IDQvalue是POJO。无论listQloadq是iterateQ只要读Z个对象,都会填充~存。但是list不会使用~存Q而iterate会先取数据库select id出来Q然后一个id一个id的loadQ如果在~存里面有,׃~存取,没有的话去数据库load。假设是d~存Q需要设|:
<cache usage="read-write"/>
如果你用的二~存实现是ehcache的话Q需要配|ehcache.xml
<cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />
其中eternal表示~存是不是永q不时QtimeToLiveSeconds是缓存中每个元素Q这里也是一个POJOQ的时旉Q如果eternal="false"Q超q指定的旉Q这个元素就被移C。timeToIdleSeconds是发呆时_是可选的。当往~存里面put的元素超q?00个时Q如果overflowToDisk="true"Q就会把~存中的部分数据保存在硬盘上的时文仉面?
每个需要缓存的class都要q样配置。如果你没有配置Qhibernate会在启动的时候警告你Q然后用defaultCache的配|,q样多个class会共享一个配|?
当某个ID通过hibernate修改Ӟhibernate会知道,于是U除~存?
q样大家可能会想Q同L查询条gQ第一ơ先listQ第二次再iterateQ就可以使用到缓存了。实际上q是很难的,因ؓ你无法判断什么时候是W一ơ,而且每次查询的条仉常是不一LQ假如数据库里面?00条记录,id??00Q第一ơlist的时候出了前50个idQ第二次iterate的时候却查询?0?0号idQ那?0-50是从~存里面取的Q?1?0是从数据库取的,共发?+20条sql。所以我一直认为iterate没有什么用QL会有1+N的问题?
Q题外话Q有说法说大型查询用list会把整个l果集装入内存,很慢Q而iterate只select id比较好,但是大型查询L要分|的,谁也不会真的把整个结果集装进来,假如一?0条的话,iterate共需要执?1条语句,list虽然选择若干字段Q比iterateW一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernateq会Ҏ数据库方a做优化,比如使用mysql的limitQ整体看来应该还是list快。)
如果惌对list或者iterate查询的结果缓存,p用到查询~存?
查询~存
首先需要配|hibernate.cache.use_query_cache=true
如果用ehcacheQ配|ehcache.xmlQ注意hibernate3.0以后不是net.sf的包名了
<cache name="net.sf.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/>
<cache name="net.sf.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>
然后
query.setCacheable(true);//ȀzL询缓?
query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可?
W二行指定要使用的cacheRegion是myCacheRegionQ即你可以给每个查询~存做一个单独的配置Q用setCacheRegion来做q个指定Q需要在ehcache.xml里面配置它:
<cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" />
如果省略W二行,不设|cacheRegion的话Q那么会使用上面提到的标准查询缓存的配置Q也是net.sf.hibernate.cache.StandardQueryCache
对于查询~存来说Q缓存的key是根据hql生成的sqlQ再加上参数Q分늭信息Q可以通过日志输出看到Q不q它的输Z是很可读Q最好改一下它的代码)?
比如hqlQ?
from Cat c where c.name like ?
生成大致如下的sqlQ?
select * from cat c where c.name like ?
参数?tiger%"Q那么查询缓存的key*大约*是这L字符Ԍ我是凭记忆写的,q不_Q不q看了也该明白了Q:
select * from cat c where c.name like ? , parameter:tiger%
q样Q保证了同样的查询、同L参数{条件下h一Lkey?
现在说说~存的valueQ如果是list方式的话Qvalue在这里ƈ不是整个l果集,而是查询出来的这一串ID。也是_不管是listҎq是iterateҎQ第一ơ查询的时候,它们的查询方式很它们qx的方式是一LQlist执行一条sqlQiterate执行1+N条,多出来的行ؓ是它们填充了~存。但是到同样条gW二ơ查询的时候,都和iterate的行Z样了Q根据缓存的keyȝ存里面查CvalueQvalue是一串idQ然后在到class的缓存里面去一个一个的load出来。这样做是ؓ了节U内存?
可以看出来,查询~存需要打开相关cȝclass~存。list和iterateҎW一ơ执行的时候,都是既填充查询缓存又填充class~存的?
q里q有一个很Ҏ被忽视的重要问题Q即打开查询~存以后Q即使是listҎ也可能遇?+N的问题!相同条gW一ơlist的时候,因ؓ查询~存中找不到Q不class~存是否存在数据QL发送一条sql语句到数据库获取全部数据Q然后填充查询缓存和class~存。但是第二次执行的时候,问题来了,如果你的class~存的超时时间比较短Q现在class~存都超时了Q但是查询缓存还在,那么listҎ在获取id串以后,会一个一个去数据库loadQ因此,class~存的超时时间一定不能短于查询缓存设|的时旉Q如果还讄了发呆时间的话,保证class~存的发呆时间也大于查询的缓存的生存旉。这里还有其他情况,比如class~存被程序强制evict了,q种情况p自己注意了?
另外Q如果hql查询包含select字句Q那么查询缓存里面的value是整个l果集了?
当hibernate更新数据库的时候,它怎么知道更新哪些查询~存呢?
hibernate在一个地方维护每个表的最后更新时_其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配|里面?
当通过hibernate更新的时候,hibernate会知道这ơ更新媄响了哪些表。然后它更新q些表的最后更新时间。每个缓存都有一个生成时间和q个~存所查询的表Q当hibernate查询一个缓存是否存在的时候,如果~存存在Q它q要取出~存的生成时间和q个~存所查询的表Q然后去查找q些表的最后更新时_如果有一个表在生成时间后更新q了Q那么这个缓存是无效的?
可以看出Q只要更新过一个表Q那么凡是涉及到q个表的查询~存失效了Q因此查询缓存的命中率可能会比较低?
Collection~存
需要在hbm的collection里面讄
<cache usage="read-write"/>
假如class是CatQcollection叫childrenQ那么ehcache里面配置
<cache name="com.xxx.pojo.Cat.children"
maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" />
Collection的缓存和前面查询~存的list一P也是只保持一串idQ但它不会因个表更新q就失效Q一个collection~存仅在q个collection里面的元素有增删时才失效?
q样有一个问题,如果你的collection是根据某个字D|序的Q当其中一个元素更C该字D|Q导致顺序改变时Qcollection~存里面的顺序没有做更新?
~存{略
只读~存Qread-onlyQ:没有什么好说的
?写缓存(read-writeQ?E序可能要的更新数据
不严格的?写缓存(nonstrict-read-writeQ:需要更新数据,但是两个事务更新同一条记录的可能性很,性能比读写缓存好
事务~存QtransactionalQ:~存支持事务Q发生异常的时候,~存也能够回滚,只支持jta环境Q这个我没有怎么研究q?
d~存和不严格d~存在实C的区别在于,d~存更新~存的时候会把缓存里面的数据换成一个锁Q其他事务如果去取相应的~存数据Q发现被锁住了,然后q接取数据库查询?
在hibernate2.1的ehcache实现中,如果锁住部分~存的事务发生了异常Q那么缓存会一直被锁住Q直?0U后时?
不严D写缓存不锁定~存中的数据?
使用二~存的前|条?/strong>
你的hibernateE序Ҏ据库有独占的写访问权Q其他的q程更新了数据库Qhibernate是不可能知道的。你操作数据库必需直接通过hibernateQ如果你调用存储q程Q或者自׃用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大扚w更新和删除是不更CU缓存的Q但是据?.1已经解决了这个问题?
q个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧?
SessionFactory也提供了U除~存的方法,你一定要自己写一些JDBC的话Q可以调用这些方法移除缓存,q些Ҏ是:
void evict(Class persistentClass)
Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
Evict an entry from the second-level cache.
void evictCollection(String roleName)
Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
Evict an entry from the second-level cache.
void evictQueries()
Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
Evict any query result sets cached in the named query cache region.
不过我不q样做,因ؓq样很难l护。比如你现在用JDBC扚w更新了某个表Q有3个查询缓存会用到q个表,用evictQueries(String cacheRegion)U除?个查询缓存,然后用evict(Class persistentClass)U除了class~存Q看上去好像完整了。不q哪天你d了一个相x询缓存,可能会忘记更新这里的U除代码。如果你的jdbc代码到处都是Q在你添加一个查询缓存的时候,q知道其他什么地方也要做相应的改动吗Q?
----------------------------------------------------
ȝQ?/strong>
不要惛_然的以ؓ~存一定能提高性能Q仅仅在你能够驾驭它q且条g合适的情况下才是这L。hibernate的二U缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下ؕ用,可能会有1+N的问题。不当的使用q可能导致读数据?
如果受不了hibernate的诸多限Ӟ那么q是自己在应用程序的层面上做~存吧?
在越高的层面上做~存Q效果就会越好。就好像管盘有缓存,数据库还是要实现自己的缓存,管数据库有~存Q咱们的应用E序q是要做~存。因为底层的~存它ƈ不知道高层要用这些数据干什么,只能做的比较通用Q而高层可以有针对性的实现~存Q所以在更高的别上做缓存,效果也要好些吧?
]]>
1、在web.xml中加载Spring的配|文?br />
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、配|属性文?br />
<!-- 属性文件读?-->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config/ct-db-c3p0.properties</value>
<value>classpath*:config/mail.properties</value>
</list>
</property>
</bean>
3、配|数据源
<!-- 数据源定?使用Apache c3p0 q接?-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${....common.dbutils.c3p0.driver}" />
<property name="jdbcUrl" value="${....common.dbutils.c3p0.url}" />
<property name="user" value="${....common.dbutils.c3p0.user}" />
<property name="password" value="${....common.dbutils.c3p0.password}" />
<property name="maxStatementsPerConnection" value="${....common.dbutils.c3p0.maxStatementsPerConnection}"/>
<property name="checkoutTimeout" value="${....common.dbutils.c3p0.checkoutTimeout}"/>
<property name="initialPoolSize" value="${....common.dbutils.c3p0.initialPoolSize}"/>
<property name="minPoolSize" value="${....common.dbutils.c3p0.minPoolSize}"/>
<property name="maxPoolSize" value="${....common.dbutils.c3p0.maxPoolSize}"/>
<property name="maxStatements" value="${....common.dbutils.c3p0.maxStatements}"/>
<property name="acquireIncrement" value="${....common.dbutils.c3p0.acquireIncrement}"/>
<property name="maxIdleTime" value="${....common.dbutils.c3p0.maxIdleTime}"/>
</bean>
<!--Hibernate SessionFatory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<!--dbean -->
<value>....bean.AddressBook</value>
.......
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
</props>
</property>
</bean>
<!--Hibernate TransactionManager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
4、依赖注入配|?br />
<bean id="companyAction" class="....action.CompanyAction" scope="request"></bean>
<bean name="companyBaseModel" class="....CompanyBaseModel"></bean>
<bean class="....CompanyService" id="companyService"></bean>
<bean class="....CompanyDAO" id="companyDAO"></bean>
注:对beans的设|?br />
<beans default-autowire="byName" default-lazy-init="true">...</beans>
5、Spring怎样注入Class<T>Q泛型类型对象)Q?br />
在事务配|时Q将proxy-target-class讄为false卛_。不能ؓtrueQ因针对接口代理?br />
如:<aop:config proxy-target-class="false">
6、Spring中采用构造方法注入注意要点:
在配|文件中昑ּ书写注入的参数。如Q?br />
<bean class="....impl.JobService"
id="retJobService">
<constructor-arg ref="retJobDao" />
</bean>
多个参数的构造函数示?br />
<bean class="....impl.TypeService"
id="typeService">
<constructor-arg index="0" ref="typeDAO" />
<constructor-arg index="1" type="boolean">
<value>false</value>
</constructor-arg>
</bean>
7、Spring 2.0 l合AspectJ pointcut语法配置AOP详解
Spring参考文?7.3 chema-based AOP support 提供了aspect,advisor,advide三种l装Ҏ的解释,其中aspect是aspectJ原装Q但E复杂,
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* *..BookManager.save(..))||execution(* *..BookManager.remove(..))" advice-ref="lowStockBookFlushingAdvice"/>
<aop:advisor pointcut="execution(* *..BookStockChecker.getLowStockBooks())" advice-ref="lowStockBookCachingAdvice"/>
</aop:config>
以上几句定义使用cglib创徏Proxy, 为BookManager的save()和remove()加上lowStockBookFlushingAdviceQؓ BookStockChecker.getLowStockBooks加上lowStockBookCachingAdvice.
execution(* *..BookManager.save(..))
W一? 代表ret-type-pattern q回值可LQ?br />
*..BookManager 代表LPacakge里的BookManagercR?br />
如果写成com.xyz.service.* 则代表com.xyz.service下的Lc?br />
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的Lc?br />
save代表saveҎQ也可以写save* 代表saveBook(){方?br />
(..) 匚w0个参数或者多个参数的QQ意类?br />
(x,..) W一个参数的cd必须是X
(x,*,*,s,..) 匚w臛_4个参敎ͼW一个参数必LxcdQ第二个和第三个参数可以LQ第四个必须是scd?br />
8、事务配|的不同形式
事务配置一Q?br />
<!-- 支持 @AspectJ 标记-->
<aop:aspectj-autoproxy />
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="false">
<aop:advisor
pointcut="execution(* ....recruitment.service.impl..*.*(..)) || execution(* ....employeeinfo.service.impl..*Service.*(..))"
advice-ref="txAdvice" />
</aop:config>
<!-- 基本事务定义,使用transactionManager作事务管?默认get*Ҏ的事务ؓreadonly,其余Ҏ按默认设|?
默认的设|请参考Spring文档事务一? -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation="REQUIRED" />
<tx:method name="load*" read-only="true" propagation="REQUIRED" />
<tx:method name="find*" read-only="true" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
事务配置二:
<!-- 支持 @AspectJ 标记-->
<aop:aspectj-autoproxy />
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="false">
<aop:advisor
pointcut="execution(* ....employeeinfo.service.impl..*Service.*(..))"
advice-ref="txAdvice" />
<aop:advisor
pointcut="execution(* ....recruitment.service.impl..*.*(..)) "
advice-ref="txAdviceRet" />
</aop:config>
<!-- 基本事务定义,使用transactionManager作事务管?默认get*Ҏ的事务ؓreadonly,其余Ҏ按默认设|?
默认的设|请参考Spring文档事务一? -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
......
</tx:attributes>
</tx:advice>
<tx:advice id="txAdviceRet"
transaction-manager="transactionManager">
<tx:attributes>
.........
</tx:attributes>
</tx:advice>
事务配置三:Q在java文g中配|)
需要单独配|事务的cd前配|事务开?br />
@Transactional(propagation = Propagation.SUPPORTS)
需要用事务的Ҏ前配|开启事务的信息
@Transactional(propagation = Propagation.REQUIRED)
如:
@Transactional(propagation = Propagation.SUPPORTS)
public class ApplierService extends BaseService<Applier> implements
IApplierService {
@Transactional(propagation = Propagation.REQUIRED)
public void addOrModify(Applier t) {
applierDao.saveOrUpdate(toDBValue(t));
}
}
9、正配|重写父cL法时事务
参阅Q?a target="_blank">http://aumy2008.javaeye.com/admin/blogs/152928
10、spring中bean的作用域详解
bean属性scope的选取Qprototype、request、session、global sessionQ:
<bean name="companyAction"
class="....CompanyAction" scope="prototype"/>
s:datetimepicker录入框提交正常?br />
prototype作用域部|的beanQ每一ơ请求(其注入到另一个bean中,或者以E序的方式调用容器的getBean()ҎQ?br />
都会产生一个新的bean实例Q相当一个new的操作,对于prototype作用域的beanQ有一炚w帔R要,
那就是Spring不能对一个prototype bean的整个生命周期负责,
容器在初始化、配|、装饰或者是装配完一个prototype实例后,它交给客户端,
随后对该prototype实例不闻不问了。不何U作用域Q容器都会调用所有对象的初始化生命周期回调方法,
而对prototype而言QQ何配|好的析构生命周期回调方法都不会被调用?br />
清除prototype作用域的对象q放Q何prototype bean所持有的昂贵资源,都是客户端代码的职责?br />
Q让Spring容器释放被singleton作用域bean占用资源的一U可行方式是Q通过使用bean的后|处理器Q?br />
该处理器持有要被清除的bean的引用。)
request、session、global session使用的时候首先要在web.xml中做如下配置Q?br />
如果你用的是Servlet 2.4及以上的web容器Q那么你仅需要在web应用的XML声明文gweb.xml中增加下qContextListener卛_Q?br />
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<bean name="companyAction"
class="....action.CompanyAction" scope="request"/>
s:datetimepicker录入框提交正常?br />
<bean name="companyAction"
class="....action.CompanyAction" scope="session"/>
s:datetimepicker录入框不能正常提交?br />
<bean name="companyAction"
class="....action.CompanyAction" scope="global session"/>
java.lang.IllegalStateException: No Scope registered for scope 'global session'
分析Qglobal session作用域类g标准的HTTP Session作用域,不过它仅仅在Zportlet的web应用中才有意义?br />
Spring中bean的作用域相关|站Q?br />
http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch03s04.html
]]>
spring jar 包详?br />
spring.jar是包含有完整发布的单个jar包,spring.jar中包含除?spring-mock.jar里所包含的内容外其它所有jar包的内容Q因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用pȝ中是用不得这些类的。 除了spring.jar文gQSpringq包括有其它13个独立的jar包,各自包含着对应的SpringlgQ用户可以根据自q需要来选择l合自己的jar包,而不必引入整个spring.jar的所有类文g?br />
(1) spring-core.jar q个jar文g包含Spring框架基本的核心工LQSpring其它lg要都要用到q个包里的类Q是其它lg的基本核心,当然你也可以在自q应用pȝ中用这些工L?br />
(2) spring-beans.jar q个jar文g是所有应用都要用到的Q它包含讉K配置文g、创建和理bean以及q行Inversion of Control / Dependency InjectionQIoC/DIQ操作相关的所有类。如果应用只需基本的IoC/DI支持Q引入spring-core.jar及spring- beans.jar文g可以了?
(3) spring-aop.jar q个jar文g包含在应用中使用Spring的AOPҎ时所需的类。用基于AOP的SpringҎ,如声明型事务理QDeclarative Transaction ManagementQ,也要在应用里包含q个jar包?br />
(4) spring-context.jar q个jar文g为Spring核心提供了大量扩展。可以找C用Spring ApplicationContextҎ时所需的全部类QJDNI所需的全部类QUI斚w的用来与模板QTemplatingQ引擎如 Velocity、FreeMarker、JasperReports集成的类Q以及校验Validation斚w的相关类?
(5) spring-dao.jar q个jar文g包含Spring DAO、Spring Transactionq行数据讉K的所有类。ؓ了用声明型事务支持Q还需在自q应用里包含spring-aop.jar?
(6) spring-hibernate.jar q个jar文g包含Spring对Hibernate 2及Hibernate 3q行装的所有类?
(7) spring-jdbc.jar q个jar文g包含对Spring对JDBC数据讉Kq行装的所有类?br />
(8) spring-orm.jar q个jar文g包含Spring对DAOҎ集q行了扩展,使其支持 iBATIS、JDO、OJB、TopLinkQ因为Hibernate已经独立成包了,现在不包含在q个包里了。这个jar文g里大部分的类都要依赖 spring-dao.jar里的c,用这个包时你需要同时包含spring-dao.jar包?br />
(9) spring-remoting.jar q个jar文g包含支持EJB、JMS、远E调用RemotingQRMI、Hessian、Burlap、Http Invoker、JAX-RPCQ方面的cR?
(10) spring-support.jar q个jar文g包含支持~存CacheQehcacheQ、JCA、JMX、邮件服务(Java Mail、COS MailQ、Q务计划SchedulingQTimer、QuartzQ方面的cR?br />
(11) spring-web.jar q个jar文g包含Web应用开发时Q用到Spring框架时所需的核心类Q包括自动蝲入WebApplicationContextҎ的cR?Struts与JSF集成cR文件上传的支持cRFiltercd大量工具辅助cR?br />
(12) spring-webmvc.jar q个jar文g包含Spring MVC框架相关的所有类。包含国际化、标{、Theme、视囑ֱ现的FreeMarker、JasperReports、Tiles、Velocity?XSLT相关cR当Ӟ如果你的应用使用了独立的MVC框架Q则无需q个JAR文g里的McR?
(13) spring-mock.jar q个jar文g包含Spring一整套mockcL辅助应用的测试。Spring试套g使用了其中大量mockc,q样试更加简单。模?HttpServletRequest和HttpServletResponsecdWeb应用单元试是很方便的。
如何选择q些发布包,军_选用哪些发布包其实相当简单。如果你正在构徏Web应用q将全程使用SpringQ那么最好就使用单个全部?spring.jar文gQ如果你的应用仅仅用到简单的Inversion of Control / Dependency InjectionQIoC/DIQ容器,那么只需spring-core.jar与spring-beans.jar卛_Q如果你对发布的大小要求很高Q那么就得精挑细选了Q只取包含自己所需Ҏ的jar文g了。采用独立的发布包你可以避免包含自己的应用不需要的全部cR当然你可以采用其它的一些工h设法令整个应用包变小Q节省空间的重点在于准确地找己所需的Spring依赖c,然后合ƈ所需的类与包可以了。Eclispe有个插g?ClassPath Helper可以帮你找找所依赖的类?
Spring包依赖说?
1) spring-core.jar需commons-collections.jarQspring-core.jar是以下其它各个的基本?br />
2) spring-beans.jar需spring-core.jarQcglib-nodep-2.1_3.jar
3) spring-aop.jar需spring-core.jarQspring-beans.jarQcglib-nodep- 2.1_3.jarQaopalliance.jar
4) spring-context.jar需spring-core.jarQspring-beans.jarQspring- aop.jarQcommons-collections.jarQaopalliance.jar
5) spring-dao.jar需spring-core.jarQspring-beans.jarQspring-aop.jarQspring- context.jar
6) spring-jdbc.jar需spring-core.jarQspring-beans.jarQspring-dao.jar
7) spring-web.jar需spring-core.jarQspring-beans.jarQspring-context.jar
8) spring-webmvc.jar需spring-core.jar/spring-beans.jar/spring-context.jar /spring-web.jar
9) spring -hibernate.jar需spring-core.jarQspring-beans.jarQspring-aop.jarQspring- dao.jarQspring-jdbc.jarQspring-orm.jarQspring-web.jarQspring-webmvc.jar
10) spring-orm.jar需spring-core.jarQspring-beans.jarQspring-aop.jarQspring- dao.jarQspring-jdbc.jarQspring-web.jarQspring-webmvc.jar
11) spring -remoting.jar需spring-core.jarQspring-beans.jarQspring-aop.jarQspring- dao.jarQspring-context.jarQspring-web.jarQspring-webmvc.jar
12) spring-support.jar需spring-core.jarQspring-beans.jarQspring- aop.jarQspring-dao.jarQspring-context.jarQspring-jdbc.jar
13) spring-mock.jar需spring-core.jarQspring-beans.jarQspring-dao.jarQspring- context.jarQspring-jdbc.jar
三种整合 Struts 应用E序?Spring 的方?/em>
![]() |
U别Q?中 George Franciscus (george.franciscus@nexcel.ca), 负责? Nexcel 2005 q?10 ?11 ?/p> Struts Recipes 的合著?George Franciscus 介l另一个重大的 Struts 整合H门 —?q次是将 Struts 应用E序导入 Spring 框架。请跟随 GeorgeQ他向您展C如何改?Struts 动作Q得管?Struts 动作像理 Spring beans 那样。结果是一个增强的 web 框架Q这个框架可以方便地利用 Spring AOP 的优ѝ?/blockquote> |