一句话,Spring对Hibernate的整合,是在applicationContext.xml中配置sessionFactory来实现的,其中sessionFactory中要装配dataSource。下面就详细介绍dataSource Bean的配置。
先上代码(比较齐全的属性)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverClassName}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <!-- 连接初始值,连接池启动时创建的连接数量的初始值 --> <property name="initialSize" value="${initialSize}" /> <!-- 连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制 --> <property name="maxActive" value="${maxActive}" /> <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 ,0时无限制--> <property name="maxIdle" value="${maxIdle}" /> <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> <property name="minIdle" value="${minIdle}" /> <!-- 是否对已备语句进行池管理(布尔值),是否对PreparedStatement进行缓存 --> <property name="poolPreparedStatements" value="true" /> <!-- 是否对sql进行自动提交 --> <property name="defaultAutoCommit" value="true" /> </bean>
1.Bean的id为dataSource,对应的java类是BasicDataSource,这个类适用于配置基本类型的数据库连接,如果要想进行多数据源,那么该Bean对应的java类就得用DynamicDataSource。
2.destroy-method,表示当该连接销毁时候,会调用BasicDataSource类中的close方法。
3.driverClassName,url,username,password都是基本配置,这些属性的value值是通过外部的属性配置文件引入,具体怎么引入请参见http://blog.csdn.net/dreamrealised/article/details/9123199中的第三点propertyConfigurer。
4.接下来的属性与数据库连接池有关,数据库连接池的有关基础知识请参见http://blog.csdn.net/dreamrealised/article/details/9127563
1)initialSize,连接初始值,连接池启动时创建的连接数量的初始值
2)maxActive,连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制
3)maxIdle,最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 ,0时无限制
4)minIdle,最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
5)poolPreparedStatements,是否对已备语句进行池管理(布尔值),是否对PreparedStatement进行缓存
6)defaultAutoCommit,是否对sql进行自动提交,进行事务管理的时候往往要关闭jdbc的自动提交功能,事务管理详见http://blog.csdn.net/dreamrealised/article/details/9123173
aop
Provides elements for declaring aspects and for automatically proxying @AspectJannotated classes as Spring aspects.
beans
The core primitive Spring namespace, enabling declaration of beans and how they
should be wired.
context
Comes with elements for configuring the Spring application context, including the abil-
ity to autodetect and autowire beans and injection of objects not directly managed by
Spring.
jee
Offers integration with Java EE APIs such as JNDI and EJB.
jms
Provides configuration elements for declaring message-driven POJOs.
lang
Enables declaration of beans that are implemented as Groovy, JRuby, or BeanShell
scripts.
mvc
Enables Spring MVC capabilities such as annotation-oriented controllers, view control-
lers, and interceptors.
oxm
Supports configuration of Spring’s object-to-XML mapping facilities.
tx
Provides for declarative transaction configuration.
util
A miscellaneous selection of utility elements. Includes the ability to declare collec-
tions as beans and support for property placeholder elements.
简单Bean配置
基本配置
<bean id="sonnet29" class="ch2_idol.Sonnet29"/>
构造器注入
<bean id="poeticJuggler" class="ch2_idol.PoeticJuggler">
<constructor-arg value="15"/>
<constructor-arg ref="sonnet29"/>
</bean>
静态方法注入
<bean id="stage" class="ch2_idol.Stage" factory-method="getInstance"/>
scoping方式默认是单例singletons.
<bean id="ticket" class="com.springinaction.springidol.Ticket" scope="prototype"/>
singleton
Scopes the bean definition to a single instance per Spring container (default).
prototype
Allows a bean to be instantiated any number of times (once per use).
request
Scopes a bean definition to an HTTP request. Only valid when used with a
web-capable Spring context (such as with Spring MVC).
session
Scopes a bean definition to an HTTP session. Only valid when used with a
web-capable Spring context (such as with Spring MVC).
global-session
Scopes a bean definition to a global HTTP session. Only valid when used in a portlet context.
初始化bean调用方法,销毁方法
<bean id="auditorium" class="ch2_idol.Auditorium" init-method="turnOnLights" destroy-method="turnOffLights"/>
也可以不配置,但实现InitializingBean ,DisposableBean接口
也可以在头部设置 default-init-method="turnOnLights" default-destroy-method="turnOffLights"所有bean初始化时调用,除非它有
属性注入
<bean id="instrumentalist" class="ch2_idol.Instrumentalist" >
<property name="song" value="JingleBells"></property>
<property name="instrument" ref="saxophone"></property>
</bean>
内部类
<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
<property name="song"value="JingleBells"/>
<property name="instrument">
<bean class="org.springinaction.springidol.Saxophone"/>
</property>
</bean>
p标记
命名空间xmlns:p="http://www.springframework.org/schema/p
<bean id="kenny" class="com.springinaction.springidol.Instrumentalist"
p:song="JingleBells"
p:instrument-ref="saxophone"/>
集合
<list> Wiring a list of values, allowing duplicates <set> Wiring a set of values, ensuring no duplicates <map> Wiring a collection of name-value pairs where name and value can be of any type <props> Wiring a collection of name-value pairs where the name and value are both Strings
<bean id="oneManBand1" class="ch2_idol.OneManBand">
<property name="instruments">
<list>
<ref bean="saxophone"/>
<ref bean="piano"/>
<ref bean="piano"/>
</list>
</property>
</bean>
<!-- 会去重 -->
<bean id="oneManBand" class="ch2_idol.OneManBand">
<property name="instruments">
<set>
<ref bean="saxophone"/>
<ref bean="piano"/>
<ref bean="piano"/>
</set>
</property>
</bean>
<property name="instruments">
<map>
<entry key="GUITAR" value-ref="guitar"/>
<entry key="CYMBAL" value-ref="cymbal"/>
<entry key="HARMONICA" value-ref="harmonica"/>
</map>
</property>
<property name="instruments">
<props>
<prop key="GUITAR">STRUMSTRUMSTRUM</prop>
<prop key="CYMBAL">CRASHCRASHCRASH</prop>
<prop key="HARMONICA">HUMHUMHUM</prop>
</props>
</property>
空标记
<property name="instruments"><null/></property>
刚刚第一次整合完struts2+spring+hibernate,也就是传说中的ssh。从学java以来,就一直视ssh为神物。真的,第一次在哪听到的ssh我都忘了,但是一直觉得只有会用ssh,并且能整合一起用,这样才基本算是一个java程序员。今天终于完成了。真的也算是学习Java道路上的一个里程碑了。但是现在的心态已经是完全不同了,不再认为java最牛的就是ssh,不再认为只要会了ssh就能成为一个java程序员,要走的路还有很多。现在只是迈向了一个新的开始。
ssh的整合是一步步跟着马士兵老师的视频去做的,之前strust2,hibernate也算是比较熟了,开发过几个小的项目,都有使用过。但是spring是初学。这整个过程懒懒散散,拖了也蛮久,到今天才总算是真正整合完一个完整的小例子。
还记得原来的我,目光是多么的短浅,觉得javaEE架构,无非就是ssh,然后加上mvc的思想,然后分层。每一层与每一层分开,解除耦合。这样就是一个架构了。不否认,这是一个架构。但是庞大而臃肿,很多地方的代码完全是在浪费。是为了分层而分层。Action调用Service,Service调用Dao,很多时候,Service中的方法里也就只有一句代码,xxxDao.xxx();,没了。就这样,还分了interface接口,还有实现implementation。当然对于初学者,为了更好的理解分层的好处,接口带来的好处,这是可以的。但是,当我们学习到一定阶段,就一定要灵活的运用。千万不能把知识学死了!这是马老师经常说的。
在我们平时的小项目中,完全可以把这里面的很多东西进行省略。这样不仅加快了开发的节奏,代码量也少了。结构也可以清晰不少。
对于我们平时可以省略哪些,这是个见仁见智的问题。每个人的想法不同,就会有不同的做法。我在这也就不详细说了。如果大家有兴趣,可以私下交流。
当我们接到一个项目时,我们首先要做的是需求分析,继而设计出系统的架构。那设计架构最重要的到底是什么呢?当我们分析了需求之后,我们最好应该建立一个系统原型,也就是先把静态页面先做出来,这样可以更好的让客户了解自己的需求。他有了实物的参造,对自己的需求描述会清楚很多。接下来就是实体的设计了,也就是数据库表的设计。当然这里可以有两种方法,先建实体,通过实体关系,借助hibernate自动生成表结构。还有一种是先建表结构,再建实体。
一点小感悟,今天先写这么多吧。