Spring2.5常用配置备份
程序员文章站
2022-04-19 21:59:28
...
[b]一、启动spring监听,让web项目整合spring,在web.xml中配置,[/b]代码如下:
注:如果在支持低版本的Servlet的web容器中,可以采用Servlet形式,把上面的
优点是可以设置自启动顺序,代码如下:
[b]二、关于配置日志文件Log4J[/b]
由于WebApplicationContext需要使用日志功能,用户可以将Log4J的配置文件放到类路径WEB-INF/classes下,这时Log4J
引擎可以顺利启动。如果将Log4J配置文件放在其他位置,用户还需要在web.xml中指定Log4J的位置,spring也为Log4J提供
了两种方式,跟上面类似,有监听模式和自启动模式(Servlet模式)
监听模式:
而自启动模式跟上面一样把listen换成servlet,如:
下面是一个简单的log4j.properties文件:
注意:如果手动配置Log4J,则先要让日志文件Log4J先启动,再spring的监听或启动。
[b]三、使用外部属性文件和配置数据源[/b]
a、使用外部属性文件
而在spring2.5的版本中提供了一种更简便的方式,如:
这样以后要使用属性文件中的资源时,可以使用${属性名}来获得。
b、常用数据源的配置
第一种是:DBCP数据源,(需要加入2个jar文件,在spring中的lib下jakarta-commons/commons-dbcp.jar和
commons-pools.jar)主要配置如下:
第二种是:c3p0数据源,跟第一种一个类型,需加入c3p0.jar包。
第三种是:JNDI数据源,配置在高性能的应用服务器(如WebLogic、WebSphere等)
从spring2.0开始提供jee命名空间,可以简化配置如下:
[b]四、事务管理配置[/b]
a、Spring JDBC 和 iBatis事务管理器的配置
b、Hibernate3以上事务管理器的配置(先要集成hibernate,再配置事务管理器)
[b]五、配置tx/aop声明式事务[/b]
[b]六、使用基于@Transactional注解形式声明事务[/b]
在bean.xml通过一 行xml配置就可以,如
提示:如果你用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略
<tx:annotation-driven/> 标签里的 'transaction-manager' 属性。
这样在需要业务的接口或实现类中加上@Transactional就可以了,详细见文档。
[b]七、spring的字符过滤器的配置[/b]
在web.xml中增加如下过滤器
[b]八、在Hibernate3中处理Lob类型数据[/b]
spring在org.springframework.orm.hibernate3.support包中为BLOB和CLOB类型提供了以下几个UserType的实现:
1、BlobByteArrayType:将BLOB数据映射为byte[]类型的属性
2、BlobStringType: 将BLOB数据映射为String类型的属性
3、BlobSerializableType:将BLOB数据映射为Serializable类型的属性
4、ClobStringType:将CLOB数据映射为String类型的属性
使用步骤如下:
然后在PO映射文件中为字段定义类型,片段如下:
这样,就可以用HibernateTemplate.save()等方法就可以正确保存LOB数据了。
注意:1、如果是Oracle9i数据库,还需要配置一个本地的JDBC抽取器,并使用特定的LobHandler实现类
2、使用LobHandler操作LOB数据时,需要在事务环境下才能工作,否则会抛出异常
[b]九、使用原生Hibernate API[/b]
Hibernate3.0.1引入了一个新的特性:通过SessionFactory.getCurrentSession()获取和当前线程绑定的Session。
然后用save()等方法就可以了,不过在这里所抛出的是Hibernate异常(也是运行期)
[b]十、配置OpenSessionInViewFilter来处理延迟加载的问题[/b]
当Web层需要访问那些需要延迟加载的数据时,而session已经关闭了。
OpenSessionInViewFilter过滤器适用于Service层使用HibernateTransactionManager或JtaTransactionManager进行事务
的环境,也可以用于非事务只读的数据操作中。
要启用这个过滤器,必须在web.xml中进行配置:
[b]十一、Introspector 缓存清除监听器[/b]
Spring 还提供了一个名为 org.springframework.web.util.IntrospectorCleanupListener 的监听器。它主要负责处理由 JavaBean Introspector 功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBean Introspector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader 的缓存和类引用。如果您使用了 JavaBean Introspector 分析应用中的类,Introspector 缓存会保留这些类的引用,结果在应用关闭的时候,这些类以及Web 应用相关的 ClassLoader 不能被垃圾回收。不幸的是,清除 Introspector 的唯一方式是刷新整个缓存,这是因为没法准确判断哪些是属于本 Web 应用的引用对象,哪些是属于其它 Web 应用的引用对象。所以删除被缓存的 Introspection 会导致将整个 JVM 所有应用的 Introspection 都删掉。需要注意的是,Spring 托管的 Bean 不需要使用这个监听器,因为 Spring 的 Introspection 所使用的缓存在分析完一个类之后会马上从 javaBean Introspector 缓存中清除掉,并将缓存保存在应用程序特定的 ClassLoader 中,所以它们一般不会导致内存资源泄露。但是一些类库和框架往往会产生这个问题。例如 Struts 和 Quartz 的 Introspector 的内存泄漏会导致整个的 Web 应用的 ClassLoader 不能进行垃圾回收。在 Web 应用关闭之后,您还会看到此应用的所有静态类引用,这个错误当然不是由这个类自身引起的。解决这个问题的方法很简单,您仅需在 web.xml 中配置 IntrospectorCleanupListener 监听器就可以了:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:beans.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注:如果在支持低版本的Servlet的web容器中,可以采用Servlet形式,把上面的
<listener>换成下面的<servlet>,
优点是可以设置自启动顺序,代码如下:
<!-- 使用自动启动的Servlet进行初始化 -->
<servlet>
<servlet-name>contextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
[b]二、关于配置日志文件Log4J[/b]
由于WebApplicationContext需要使用日志功能,用户可以将Log4J的配置文件放到类路径WEB-INF/classes下,这时Log4J
引擎可以顺利启动。如果将Log4J配置文件放在其他位置,用户还需要在web.xml中指定Log4J的位置,spring也为Log4J提供
了两种方式,跟上面类似,有监听模式和自启动模式(Servlet模式)
监听模式:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>
/WEB-INF/log4j.properties
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
而自启动模式跟上面一样把listen换成servlet,如:
<servlet>
<servlet-name>log4jConfigServlet</servlet-name>
<servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
下面是一个简单的log4j.properties文件:
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n
注意:如果手动配置Log4J,则先要让日志文件Log4J先启动,再spring的监听或启动。
[b]三、使用外部属性文件和配置数据源[/b]
a、使用外部属性文件
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:com/baobaotao/place/jdbc.properties</value>
</list>
</property>
<property name="fileEncoding" value="utf-8" />
</bean>
而在spring2.5的版本中提供了一种更简便的方式,如:
<context:property-placeholder location="classpath:config/jdbc.properties"/>
这样以后要使用属性文件中的资源时,可以使用${属性名}来获得。
b、常用数据源的配置
第一种是:DBCP数据源,(需要加入2个jar文件,在spring中的lib下jakarta-commons/commons-dbcp.jar和
commons-pools.jar)主要配置如下:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3309/sampledb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
第二种是:c3p0数据源,跟第一种一个类型,需加入c3p0.jar包。
第三种是:JNDI数据源,配置在高性能的应用服务器(如WebLogic、WebSphere等)
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/bbt"/>
</bean>
从spring2.0开始提供jee命名空间,可以简化配置如下:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/bbt"/>
[b]四、事务管理配置[/b]
a、Spring JDBC 和 iBatis事务管理器的配置
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
b、Hibernate3以上事务管理器的配置(先要集成hibernate,再配置事务管理器)
<!-- 集成hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 使用JPA注解的Hibernate时,改:class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" -->
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources"> <!-- 这里改:<property name="annotatedClasses">,也可以指定包名,name="annotatedPackages" -->
<list>
<value>classpath:product.hbm.xml</value> <!-- 这里改:<value>com.baobaotao.entity.Forum</value> -->
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
</props>
</property>
</bean>
<!-- 配置HibernateTemplate模版,之后在配置DAO时可以注入此模版来使用 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置Hibernate事务策略 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
[b]五、配置tx/aop声明式事务[/b]
<!-- 配置tx/aop声明式事务 -->
<!-- 声明一个切面 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 把切面注入到业务中 -->
<aop:config>
<aop:pointcut id="productServiceMethods" expression="execution(* com.wzc.student.business.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods" />
</aop:config>
[b]六、使用基于@Transactional注解形式声明事务[/b]
在bean.xml通过一 行xml配置就可以,如
<tx:annotation-driven transaction-manager="txManager"/>
提示:如果你用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略
<tx:annotation-driven/> 标签里的 'transaction-manager' 属性。
这样在需要业务的接口或实现类中加上@Transactional就可以了,详细见文档。
[b]七、spring的字符过滤器的配置[/b]
在web.xml中增加如下过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
[b]八、在Hibernate3中处理Lob类型数据[/b]
spring在org.springframework.orm.hibernate3.support包中为BLOB和CLOB类型提供了以下几个UserType的实现:
1、BlobByteArrayType:将BLOB数据映射为byte[]类型的属性
2、BlobStringType: 将BLOB数据映射为String类型的属性
3、BlobSerializableType:将BLOB数据映射为Serializable类型的属性
4、ClobStringType:将CLOB数据映射为String类型的属性
使用步骤如下:
<!-- 配置LOB数据处理器 -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />
<!-- 配置SessionFactory,集成Hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler" />
......
然后在PO映射文件中为字段定义类型,片段如下:
<property name="postText" column="post_text"
type="org.springframework.orm.hibernate3.support.ClobStringType"/>
<property name="postAttach" column="post_attach"
type="org.springframework.orm.hibernate3.support.BlobByteArrayType"/>
这样,就可以用HibernateTemplate.save()等方法就可以正确保存LOB数据了。
注意:1、如果是Oracle9i数据库,还需要配置一个本地的JDBC抽取器,并使用特定的LobHandler实现类
2、使用LobHandler操作LOB数据时,需要在事务环境下才能工作,否则会抛出异常
[b]九、使用原生Hibernate API[/b]
Hibernate3.0.1引入了一个新的特性:通过SessionFactory.getCurrentSession()获取和当前线程绑定的Session。
然后用save()等方法就可以了,不过在这里所抛出的是Hibernate异常(也是运行期)
[b]十、配置OpenSessionInViewFilter来处理延迟加载的问题[/b]
当Web层需要访问那些需要延迟加载的数据时,而session已经关闭了。
OpenSessionInViewFilter过滤器适用于Service层使用HibernateTransactionManager或JtaTransactionManager进行事务
的环境,也可以用于非事务只读的数据操作中。
要启用这个过滤器,必须在web.xml中进行配置:
<filter>
<filter-name>HibernateSpringFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateSpringFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
[b]十一、Introspector 缓存清除监听器[/b]
Spring 还提供了一个名为 org.springframework.web.util.IntrospectorCleanupListener 的监听器。它主要负责处理由 JavaBean Introspector 功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBean Introspector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader 的缓存和类引用。如果您使用了 JavaBean Introspector 分析应用中的类,Introspector 缓存会保留这些类的引用,结果在应用关闭的时候,这些类以及Web 应用相关的 ClassLoader 不能被垃圾回收。不幸的是,清除 Introspector 的唯一方式是刷新整个缓存,这是因为没法准确判断哪些是属于本 Web 应用的引用对象,哪些是属于其它 Web 应用的引用对象。所以删除被缓存的 Introspection 会导致将整个 JVM 所有应用的 Introspection 都删掉。需要注意的是,Spring 托管的 Bean 不需要使用这个监听器,因为 Spring 的 Introspection 所使用的缓存在分析完一个类之后会马上从 javaBean Introspector 缓存中清除掉,并将缓存保存在应用程序特定的 ClassLoader 中,所以它们一般不会导致内存资源泄露。但是一些类库和框架往往会产生这个问题。例如 Struts 和 Quartz 的 Introspector 的内存泄漏会导致整个的 Web 应用的 ClassLoader 不能进行垃圾回收。在 Web 应用关闭之后,您还会看到此应用的所有静态类引用,这个错误当然不是由这个类自身引起的。解决这个问题的方法很简单,您仅需在 web.xml 中配置 IntrospectorCleanupListener 监听器就可以了:
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
下一篇: 立秋养生关键防秋燥