腾讯信用分,今天五号了会瘫痪的,信用卡没开通认证支付的抓紧抓紧,通宵开

1018人阅读
Spring框架整理第一发,Spring框架介绍,HelloWorld,IoC容器介绍,Bean配置
Spring概述
& & &①Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能够实现,而在Spring中却非常的优雅和简洁。
& & &②Spring是一个开源的IoC(DI)和AOP容器框架。
& & &③Spring的优良特性
&&&& [1]非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
&&&& [2]依赖注入:DI——Dependency Injection,反转控制(IoC)最经典的实现。
&&&& [3]面向切面编程:Aspect Oriented Programming——AOP
&&&& [4]容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
&&&& [5]组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
&&&& [6]一站式:在IoC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
小结:Spring框架完全改变了我们以往获取对象的方式,项目中所有的对象都由Spring框架统一管理,我们在需要的时候只需要从容器中拿,不需要自己创建。同时Spring框架提供的声明式事务也给我们事务管理带来了极大的方便。同时从上图可以看出Spring框架是分模块的这样我们在使用的时候就可以自行组装。
Spring-HelloWorld
& & &①导入核心包(CoreContainer)& & & &&
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
& 还有一个依赖的日志包
commons-logging-1.1.3.jar
& & &②准备一个JavaBean
&publicclassBook
&&&&privateStringtitle;
&&&&privateStringauthor;
&&&&privatedoubleprice;
& & 无参/有参构造器
& & get/set方法
& & &③编写配置文件
& & & & & & applicationContext.xml(使用set方法注入),这个文件需要放到类路径下,方便测试。
&bean id=&book& class=&com.java.bean.Book&&
& &&&property name=&title& value=&明天会更好&&&/property&
& & &④测试(使用Junit4测试)
package com.java.
import org.junit.T
import org.springframework.context.ApplicationC
import org.springframework.context.support.ClassPathXmlApplicationC
public class IOCTest {
&&&&public void test() {
& & & & //获取ioc容器
&&&&&&&&ApplicationContext ioc = new ClassPathXmlApplicationContext(&applicationContext.xml&);
& & & & //根据id获取到bean对象
&&&&&&&&Object bean = ioc.getBean(&book&);
&&&&&&&&System.out.println(bean);
&HelloWorld分析:
& & &①注意:要导入依赖包 commons-logging-1.1.3.jar
& & & & & && &&&&&准备一个JavaBean类
& & &②配置文件的编写
& & & & & & &bean&标签 &id任意设置,用于从容器中获取组件,一般为类名小写
& & & & & & & & & & & & & & & & &class全类名
& & & & & & &property&子标签设置对象的属性(Spring框架会根据这个配置帮你创建对象)
& & & & & & & 它是使用set方法注入
& & &③测试
& & & & & & & 通过ClassPathXmlApplicationContext获取IoC容器对象,然后就可以根据设置的id名获取对应的bean
IoC容器和Bean配置
①IoC(Inversion of Control):控制反转。
& & 传统的资源获取方式:由开发人员手动创建资源,并管理资源。这种方式,当项目中的资源比较多的时候,创建,管理就会显得异常复杂。并且各种资源的创建方式不尽相同,开发人员学习各种创建资源的方式的成本也会大大增加。
& & 控制反转,让这种主动创建资源的方式变成被动,所有的资源获取只需要被动的获取就行。开发人员在需要某资源的时候,只需要根据一定的规则从容器中获取即可。
& & Spring框架的IoC容器的设计就是基于这种模式,由IoC容器管理所有资源,资源创建,资源释放,全部由IoC容器管理,开发人员即用即取,而不用考虑其他事情。
②DI(Dependency Injection):依赖注入。
&&&&&IoC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IoC而言,这种表述更直接。
③IoC容器在Spring中的实现
&&&&&[1]在通过IoC容器读取Bean的实例之前,需要先将IoC容器本身实例化。
&&&&&[2]Spring提供了IoC容器的两种实现方式
& & & & & BeanFactory:IoC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
& & & & & ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。
④ApplicationContext的主要实现类
& && ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件(HelloWorld使用此方式获取IoC容器的实例)
& && FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件
& && 在初始化时就创建单例的bean,也可以通过配置的方式指定创建的Bean是多实例的。(IoC容器默认单例)
⑤ConfigurableApplicationContext
& && 是ApplicationContext的子接口,包含一些扩展方法
& && refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。
⑥WebApplicationContext
&&&&&专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作
IoC容器Bean配置3种方式:
&&&&&①基于XML文件进行配置(在XML文件中使用bean标签进行配置)
&&&&&②基于注解进行配置(利用在类和属性的相应位置加上注解完成配置)
&&&&&③基于java进行配置(利用几个特殊的注解)(不常用)
IoC容器的作用:控制反转(依赖注入),用于管理用户的所要使用组件和组件之间的关系。
使用ioc容器,ioc容器会依据你所配置的要求生成对象,根据要求装配对象之间的关系,ioc容器在初始化的时候,会自动根据要求创建对象并装配对象之间的关系,用户在需要的时候只需要在容器中取就行了。
依赖注入的方式主要有三种:
& ①接口注入
& ②使用构造器注入
& ③使用set方法注入
& ②③比较常用
XML配置组件:
& 使用bean标签进行配置
& ①使用set方法注入(设置要求创建的对象的属性)(这里的属性名是类的set方法后边的名字)
&&&&&bean id=&book01& class=&com.atguigu.beans.Book&&
&&&&&&&&&!-- 利用property标签给bean属性赋值 --&
&&&&&&&&&property name=&author& value=&盐田七生&&&/property&
&&&&&&&&&property name=&title& value=&罗马人的故事&&&/property&
&&&&&&&&&property name=&price& value=&34.5&&&/property&
&&&&&/bean&
& & 使用property给属性赋值也可以使用ref引用容器中的其他bean
& 当需要修改组件的属性时,也可以使用property标签
& &property name=&属性名& value=&属性值&&&/property&
&② 使用构造器注入,可以使用name/index精确定位每个参数进行赋值
& &constructor-arg name=&参数名& value=&参数值&&&/constructior-arg&
& & &不使用name/index,Spring框架底层算法会依次进行匹配,若不匹配,会报异常。
&bean id=&book03& class=&com.atguigu.beans.Book&&
& & &constructor-arg value=&平凡的世界&&&/constructor-arg&
& & &constructor-arg value=&10.9& &&/constructor-arg&
& & &constructor-arg value=&路遥&&&/constructor-arg&
& & &使用name对每个参数精确赋值 name指定参数名
&bean id=&book04& class=&com.atguigu.beans.Book&&
&& &constructor-arg value=&平凡的世界& name=&title&&&/constructor-arg&
&& &constructor-arg value=&10.9& name=&price& &&/constructor-arg&
&& &constructor-arg value=&路遥& name=&author&&&/constructor-arg&
& & &使用index对每个参数进行赋值,index指定被赋值的参数索引
&bean id=&book03& class=&com.atguigu.beans.Book&&
&&&&&&constructor-arg value=&10.9& index=&1&&&/constructor-arg&
& & &&constructor-arg value=&平凡的世界& index=&0&&&/constructor-arg&
& && &constructor-arg value=&路遥& index=&2&&&/constructor-arg&
& & &当调用参数个数相同但某些类型兼容的构造器时,可以使用type指定类型来调用
&&&&&!-- 使用type精确调用参数个数相同,但是某些类型兼容的构造器,自定义类型需要使用全类名,java.lang包下的不用写全类名 --&
&&&&&bean id=&book05& class=&com.atguigu.beans.Book&&
&&&&&&&&&constructor-arg value=&平凡的世界& index=&0&&&/constructor-arg&
&&&&&&&&&constructor-arg value=&12& index=&1& type=&double&&&/constructor-arg&
&&&&&&&&&constructor-arg value=&路遥& index=&2&&&/constructor-arg&
&&&&&/bean&
IoC容器创建组件默认是单例的,可以使用scope指定其他模式
组件创建模式:
prototype 多实例
request 组件在一次请求内有效
session 组件在一次回话内有效
singleton 单实例
&例:指定创建的方式是多实例的。
&bean id=&book01& class=&com.atguigu.beans.Book& scope=&prototype&&
&&&&&&&&&!-- 利用property标签给bean属性赋值 --&
&&&&&&&&&property name=&author& value=&盐田七生&&&/property&
&&&&&&&&&property name=&title& value=&罗马人的故事&&&/property&
&&&&&&&&&property name=&price& value=&34.5&&&/property&
小结:在使用构造器注入的时候,若要精确调用,直接使用name属性指定参数名更为方便。
配置集合组件
& && 使用list标签,map标签,props标签(配置properties集合组件)常用于配置数据库连接
& & &集合中的值可以是内部bean,可以是基本数据类型,可以是一个引用
& & &List集合属性赋值
&!-- 给List集合属性赋值 --&
&&&&&bean id=&book07& class=&com.atguigu.beans.Book&&
&&&&&&&&&property name=&title& value=&追风筝的人&/&
&&&&&&&&&property name=&price& value=&20&/&
&&&&&&&&&property name=&freeBook&&
&&&&&&&&&&&&&bean p:title=&免费书籍& class=&com.atguigu.beans.Book&&&/bean&
&&&&&&&&&/property&
&&&&&&&&&property name=&list&&
&&&&&&&&&&&&&!-- 给List集合属性赋值 --&
&&&&&&&&&&&&&list&
&&&&&&&&&&&&&&&&&!-- 可以是内部bean --&
&&&&&&&&&&&&&&&&&bean p:title=&内部Bean& class=&com.atguigu.beans.Book&&&/bean&
&&&&&&&&&&&&&&&&&!-- 可以是String字符串 --&
&&&&&&&&&&&&&&&&&value&String字符串&/value&
&&&&&&&&&&&&&&&&&!-- 可以是一个引用 --&
&&&&&&&&&&&&&&&&&ref bean=&book01&/&
&&&&&&&&&&&&&/list&
&&&&&&&&&/property&
&&&&&/bean&
& & &&map集合属性赋值
&!-- 给Map集合属性赋值 --&
&&&&&bean id=&book08& class=&com.atguigu.beans.Book&&
&&&&&&&&&property name=&title& value=&明朝那些事&&&/property&
&&&&&&&&&property name=&map&&
&&&&&&&&&&&&&map&
&&&&&&&&&&&&&&&&&entry key=&免费书籍& value-ref=&book01&&&/entry&
&&&&&&&&&&&&&&&&&entry key=&2&&
&&&&&&&&&&&&&&&&&&&&&bean p:title=&鹿鼎记(内部bean)& class=&com.atguigu.beans.Book&&&/bean&
&&&&&&&&&&&&&&&&&/entry&
&&&&&&&&&&&&&&&&&entry key=&3& value=&String字符串&&&/entry&
&&&&&&&&&&&&&/map&
&&&&&&&&&/property&
&&&&&/bean&
& & properties集合属性赋值
&&&&&!-- 利用props标签,prop标签给Properties集合属性赋值 --&
&&&&&bean id=&book09& class=&com.atguigu.beans.Book& p:title=&鲁滨逊漂流记&&
&&&&&&&&&property name=&properties&&
&&&&&&&&&&&&&props&
&&&&&&&&&&&&&&&&&prop key=&url&&jdbc:mysql//localhost:8080/test&/prop&
&&&&&&&&&&&&&&&&&prop key=&root&&root&/prop&
&&&&&&&&&&&&&&&&&prop key=&password&&123456&/prop&
&&&&&&&&&&&&&/props&
&&&&&&&&&/property&
&&&&&/bean&
&&&&&util名称空间的使用
&&&&&!-- 通过util命名空间创建一个通用的List --&
&&&&&util:list id=&list01&&
&&&&&&&&&bean p:title=&数据之巅& class=&com.atguigu.beans.Book&&&/bean&
&&&&&&&&&value&String字符串&/value&
&&&&&&&&&ref bean=&book01&/&
&&&&&/util:list&
&&&&&!-- 通过util命名空间创建一个通用的map --&
&&&&&util:map id=&map01&&
&&&&&&&&&entry key=&i1& value=&字符串&&&/entry&
&&&&&&&&&entry key=&i2& value-ref=&book01&&&/entry&
&&&&&&&&&entry key=&i3&&
&&&&&&&&&&&&&bean p:title=&温州一家人& class=&com.atguigu.beans.Book&&&/bean&
&&&&&&&&&/entry&
&&&&&/util:map&
&&&&&!-- 通过util命名空间创建一个通用properties --&
&&&&&util:properties id=&properties01&&
&&&&&&&&&prop key=&url&&jdbc:mysql//127.0.0.1:8080/test&/prop&
&&&&&&&&&prop key=&root&&root&/prop&
&&&&&&&&&prop key=&password&&123456&/prop&
&&&&&/util:properties&
&&&&&!-- 创建一个bean调用上边的通用的List,Map,Properties --&
&&&&&bean id=&book10& class=&com.atguigu.beans.Book&&
&&&&&&&&&property name=&title& value=&集合大杂烩&&&/property&
&&&&&&&&&property name=&map& ref=&map01&&&/property&
&&&&&&&&&property name=&list& ref=&list01&&&/property&
&&&&&&&&&property name=&properties& ref=&properties01&&&/property&
&&&&&/bean&
使用其他方式配置IoC组件
使用p标签给组件的属性赋值(set方法注入)
& ①添加p命名空间(xmlns:p=&http://www.springframework.org/schema/p&)
& ②使用p标签进行赋值
使用p标签给组件的属性赋值,同时使用ref引用容器中另一个bean组件
&bean p:title=&平凡的世界2&& p:author=&路遥& p:price=&23& p:sales=&100& id=&book01& class=&com.atguigu.beans.Book&/&
&bean p:title=&平凡的世界1& p:author=&路遥& p:price=&23& p:sales=&100& p:freeBook-ref=&book01& id=&book02& class=&com.atguigu.beans.Book&/&
获取bean组件
& & 方式①:使用id获取
& & ApplicationContext ioc = new ClassPathXmlApplicationContext(&ioc.xml&);
&&&&public void test5() {
&&&&&&&&Object bean = ioc.getBean(&book05&);
&&&&&&&&System.out.println(bean);
& & &方式②:使用类型获取
&&&& * 通过类型获取bean,若ioc.xml中有同类型的多个bean会报no unique异常
&&&& * 这时只能通过id获取
&&&& * org.springframework.beans.factory.NoUniqueBeanDefinitionException:
&&&& *& No qualifying bean of type [com.atguigu.bean.Book] is defined:
&&&& *& expected single matching bean but found 2: book,book02
&&&&public void test2() {
&&&&&&&&Book bean = ioc.getBean(Book.class);
&&&&&&&&System.out.println(bean);
基于注解配置组件(最常用的方式)
1.给需要添加到IoC容器中的类加注解
2.导入aop包(spring-aop-4.0.0.RELEASE.jar)
3.配置自动扫描加了注解的类
使用注解配置的组件:
& & &①默认id是类名首字母小写
& & &②注解的value属性可以设置新的id
@Repository
public class BookDao {
& & &使用注解的value属性设置新的id
@Repository(value=&bd&)
public class BookDao {
& & &@Service注解和@Autowired注解
public class BookService {
&&&&@Autowired
&&&&private BookDaobookD
& & &@Autowired注解:框架自动在IoC容器中查找对应的组件给属性赋值。默认是required=true,意思是必须装配上,若装配不上,报错。可以设置required=false设置此属性的装配不是必须的。
进行装配的时候尝试的方式:
&1.类型& & & & & & & & & & &&
&2.属性名作为id& & & & & & & & & & &&
&3.@Qualifier 的value值& & & & & &
&自动装配时这三种方式都会进行尝试
框架装配步骤:& & & & & &
&利用@Autowired对BookDao进行装配& & & & &
&首先根据类型进行装配,找到就装配,找不到报错。
&若同种类型找到多个,再按照属性名作为id找到指定的,找不到报错,若根据id找不到,在看@Qualifier注解。&
&无论怎么找最后找到唯一的一个就返回,所有方式都尝试了,还没有找到就报错
注意:@Qualifier注解要加到属性名上,或者set方法处(@Autowired与这个注解要如影随行)
@Qualifier注解使用方式
public class BookService {
&&&&//这个注解默认是true意思是必须装配上,false为若找不到可以不装配,这样找不到就不会报错了
&&&&@Autowired(required=false)
&&&&@Qualifier(&bookDao&)
&&&&private BookDao bookDao2;
&&&&@Autowired
&&&&public void setBookDao(@Qualifier(&bookDao&)BookDao bookDao2) {
&&&&&&&&this.bookDao = bookDao2;
@Controller
@Controller
public class BookServlet {
& & @Autowired
&&&&private BookService bookS
在配置文件中配置自动扫描加了注解的类
配置时常用的标签和属性介绍:
&context:component-scan base-package=&&&&/ context:component-scan&
base-package设置要扫描的基包,框架会扫描这个包路径下的所有类
use-default-filters=&true& 默认 :全部扫描
use-default-filters=&false& 全不扫描
子标签①:
&context:exclude-filter type=&annotation& expression=&&/& 基于注解配置不扫描的类
&context:exclude-filter type=&assignable& expression=&&/&基于类型配置不扫描的类
子标签②:
&context:include-filter type=&annotation& expression=&&/& 基于注解配置要扫描的类
&context:include-filter type=&assignable& expression=&&/& 基于类型配置要扫描的类
&context:component-scan base-package=&com.myframe&&
& & &!-- 设置不扫描的注解 --&
& & &context:exclude-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
& & &!-- 类型是全类名 --&
& & &context:exclude-filter type=&assignable& expression=&com.myframe.service.BookService&/& --&& & &
&/context:component-scan&
&context:component-scan base-package=&com.myframe& use-default-filters=&false&&
& && &context:include-filter type=&annotation& expression=&org.springframework.stereotype.Repository&/&
& && &context:include-filter type=&assignable& expression=&com.myframe.service.BookService&/&
&/context:component-scan&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:44066次
积分:1203
积分:1203
排名:千里之外
原创:66篇
评论:14条
阅读:10961
阅读:7475
阅读:2821
(2)(8)(7)(7)(17)(24)(1)java(158)
源代码下载地址:
在SpringSide 3社区中,不断有人提出多数据源配置的问题,但是时至今日却一直没有一个完美的答案。经过一个星期的折腾,我总算搞清楚了在SpringSide 3中配置多数据源的各种困难并加以解决,在这里,特地把我配置SpringSide 3项目中多数据源的过程写出来,与大家分享。
我使用的SpringSide的版本是江南白衣最新发布的3.1.4翻墙版,在上一篇博文中,记录了我折腾的全过程,感兴趣的朋友可以看看:
下面进入正题:
结论:在基于SpringSide 3的项目中,如果要使用多个数据库,首先要配置多个数据源,然后配置多个SessionFactory,这本身没有问题,但是一涉及到事务,问题就来了,在多数据源的环境下,必须使用JTATransactionManager,而使用JTATransactionManager,就必须得有提供JTA功能的应用服务器或提供JTA功能的别的什么组件。
以上结论绝对正确,是属于SpringSide 3中关于使用多个数据库的最权威解答,下面来看具体过程:
方法一、使用GlassFish应用服务器
1、准备GlassFish服务器,下载地址为 ,我选择的是08-Jul-发布的大小为72M的latest-glassfish.zip,这里需要强调的一点是千万不要选择latest-glassfish-windows.exe这个版本,因为这个版本在Windows环境中只安装GlassFish而不提供合理的初始化配置,对于新手来说使用门槛太高,而ZIP版一解压缩就可以使用,其服务器是配置好了的;
2、在GlassFish中配置多个数据源,启动GlassFish后,访问4848端口就可以进入到GlassFish的管理界面,在其中配置两个数据源,其资源名称分别为jdbc/dataSourceContent和jdbc/dataSourceIndex,如下图:
3、在项目中配置多个DataSource和多个SessionFactory,并选择JTATransactionManager作为事务管理器,这里的DataSource是使用JNDI查找从应用服务器中获得的。下面是我项目中的applicationContext.xml文件:
&?xml version=&1.0&encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:jee=&http://www.springframework.org/schema/jee& xmlns:tx=&http://www.springframework.org/schema/tx&
xmlns:context=&http://www.springframework.org/schema/context&
xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&
default-lazy-init=&true&&
&description& Spring公共配置文件 &/description&
&!-- 定义受环境影响易变的变量 --&
&bean class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&systemPropertiesModeName& value=&SYSTEM_PROPERTIES_MODE_OVERRIDE& /&
&property name=&ignoreResourceNotFound& value=&true& /&
&property name=&locations&&
&!-- 标准配置 --&
&value& classpath*:/application.properties &/value&
&/property&
&!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --&
&context:component-scan base-package=&cn.puretext& /&
&!-- 数据源配置,使用应用服务器的数据库连接池 --&
&jee:jndi-lookup id=&dataSourceContent& jndi-name=&jdbc/dataSourceContent& /&
&jee:jndi-lookup id=&dataSourceIndex& jndi-name=&jdbc/dataSourceIndex& /&
&!-- Hibernate配置 --&
&bean id=&sessionFactoryContent& class=&org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceContent& /&
&property name=&namingStrategy&&
&bean class=&org.hibernate.cfg.ImprovedNamingStrategy& /&
&/property&
&property name=&hibernateProperties&&
&prop key=&hibernate.dialect&&org.hibernate.dialect.MySQL5InnoDBDialect &/prop&
&prop key=&hibernate.show_sql&&${hibernate.show_sql} &/prop&
&prop key=&hibernate.format_sql&&${hibernate.format_sql} &/prop&
&prop key=&hibernate.cache.provider_class&&org.hibernate.cache.EhCacheProvider
&prop key=&hibernate.cache.provider_configuration_file_resource_path&&${hibernate.ehcache_config_file} &/prop&
&/property&
&property name=&packagesToScan& value=&cn.puretext.entity.*& /&
&bean id=&sessionFactoryIndex& class=&org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceIndex& /&
&property name=&namingStrategy&&
&bean class=&org.hibernate.cfg.ImprovedNamingStrategy& /&
&/property&
&property name=&hibernateProperties&&
&prop key=&hibernate.dialect&&org.hibernate.dialect.MySQL5InnoDBDialect &/prop&
&prop key=&hibernate.show_sql&&${hibernate.show_sql} &/prop&
&prop key=&hibernate.format_sql&&${hibernate.format_sql} &/prop&
&prop key=&hibernate.cache.provider_class&&org.hibernate.cache.EhCacheProvider
&prop key=&hibernate.cache.provider_configuration_file_resource_path&&${hibernate.ehcache_config_file} &/prop&
&/property&
&property name=&packagesToScan& value=&cn.puretext.entity.*& /&
&!-- 事务管理器配置,多数据源JTA事务 --&
&bean id=&transactionManager& class=&org.springframework.transaction.jta.JtaTransactionManager& /&
&!-- 使用annotation定义事务 --&
&tx:annotation-driven transaction-manager=&transactionManager& /&
4、由于配置了多个SessionFactory,所以需要在web.xml中配置两个OpenSessionInViewFilter,下面是我的web.xml文件:
&?xml version=&1.0&encoding=&UTF-8&?&
&web-app version=&2.4& xmlns=&/xml/ns/j2ee& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd&&
&display-name& PureText &/display-name&
&!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔
此参数用于后面的Spring Context Loader --&
&context-param&
&param-name& contextConfigLocation &/param-name&
&param-value& classpath*:/applicationContext*.xml &/param-value&
&/context-param&
&!-- Character Encoding filter --&
&filter-name& encodingFilter &/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-name& hibernateOpenSessionInViewFilterContent &/filter-name&
&filter-class& org.springside.modules.orm.hibernate.OpenSessionInViewFilter &/filter-class&
&init-param&
&param-name& excludeSuffixs &/param-name&
&param-value& js,css,jpg,gif &/param-value&
&/init-param&
&init-param&
&param-name& sessionFactoryBeanName &/param-name&
&param-value& sessionFactoryContent &/param-value&
&/init-param&
&filter-name& hibernateOpenSessionInViewFilterIndex &/filter-name&
&filter-class& org.springside.modules.orm.hibernate.OpenSessionInViewFilter &/filter-class&
&init-param&
&param-name& excludeSuffixs &/param-name&
&param-value& js,css,jpg,gif &/param-value&
&/init-param&
&init-param&
&param-name& sessionFactoryBeanName &/param-name&
&param-value& sessionFactoryIndex &/param-value&
&/init-param&
&!-- SpringSecurity filter --&
&filter-name& springSecurityFilterChain &/filter-name&
&filter-class& org.springframework.web.filter.DelegatingFilterProxy &/filter-class&
&!-- Struts2 filter --&
&filter-name& struts2Filter &/filter-name&
&filter-class& org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter &/filter-class&
&filter-mapping&
&filter-name& encodingFilter &/filter-name&
&url-pattern& /* &/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name& springSecurityFilterChain &/filter-name&
&url-pattern& /* &/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name& hibernateOpenSessionInViewFilterContent &/filter-name&
&url-pattern& /* &/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name& hibernateOpenSessionInViewFilterIndex &/filter-name&
&url-pattern& /* &/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name& struts2Filter &/filter-name&
&url-pattern& /* &/url-pattern&
&/filter-mapping&
&!-- Spring的ApplicationContext 载入 --&
&listener&
&listener-class& org.springframework.web.context.ContextLoaderListener &/listener-class&
&/listener&
&!-- Spring 刷新Introspector防止内存泄露 --&
&listener&
&listener-class& org.springframework.web.util.IntrospectorCleanupListener &/listener-class&
&/listener&
&!-- session超时定义,单位为分钟 --&
&session-config&
&session-timeout& &/session-timeout&
&/session-config&
&!-- 出错页面定义 --&
&error-page&
&exception-type& java.lang.Throwable &/exception-type&
&location& /common/500.jsp &/location&
&/error-page&
&error-page&
&error-code& &/error-code&
&location& /common/500.jsp &/location&
&/error-page&
&error-page&
&error-code& &/error-code&
&location& /common/404.jsp &/location&
&/error-page&
&error-page&
&error-code& &/error-code&
&location& /common/403.jsp &/location&
&/error-page&
&/web-app&
5、由于项目中有多个SessionFactory,所以编写Dao层的时候需要使用@Resource注解来明确指定使用哪一个SessionFactory,如下面代码所示,ArticleDao使用sessionFactoryContent,而ArticleIndexDao使用sessionFactoryIndex:
package cn.puretext.
import javax.annotation.R
import org.hibernate.SessionF
import org.springframework.stereotype.R
import org.springside.modules.orm.hibernate.HibernateD
import cn.puretext.entity.web.A
@Repository
public class ArticleDao extends HibernateDao &Article, Long& {
@Resource(name= & sessionFactoryContent & )
public void setSessionFactory(SessionFactory sessionFactory) {
// TODO Auto-generated method stub
super .setSessionFactory(sessionFactory);
package cn.puretext.
import javax.annotation.R
import org.hibernate.SessionF
import org.springframework.stereotype.R
import org.springside.modules.orm.hibernate.HibernateD
import cn.puretext.entity.web.ArticleI
@Repository
public class ArticleIndexDao extends HibernateDao &ArticleIndex, Long& {
@Resource(name= & sessionFactoryIndex & )
public void setSessionFactory(SessionFactory sessionFactory) {
// TODO Auto-generated method stub
super .setSessionFactory(sessionFactory);
6、在GlassFish中部署项目,部署项目的时候依然使用前面提到的GlassFish的管理界面,这里不赘述。
经过以上六步,就可以成功的在基于SpringSide 3的项目中使用多个数据库。如果你确实很不相使用GlassFish,而对Tomcat情有独钟的话,就要使用我前面提到的“提供JTA功能的其它组件”了。在这里,我推荐使用Atomikos,这是一个很优秀的JTA实现,它的官方网站为
,它提供开源版和商业版,下面是从其官方网站上截取的图片:
很烦人的是,该网站不直接提供下载地址,如果要下载,就必须先填写姓名邮箱和电话,如果大家不想填写这些信息,可以直接进入这个网址下载 ,我选择的是3.5.5版。
方法二、使用Tomcat服务器和Atomikos
1、将Atomikos整合到Tomcat服务器中,其步骤可以参考Atomikos的文档,如下:
2、在Tomcat中配置JNDI数据源,方法是修改Tomcat的content.xml文件,在文件中加入如下两个&Resource/&和一个&Transaction/&:
&Transaction factory=&com.atomikos.icatch.jta.UserTransactionFactory& /&
&Resource name=&jdbc/dataSourceContent& auth=&Container&
type=&com.atomikos.jdbc.AtomikosDataSourceBean& factory=&com.atomikos.tomcat.BeanFactory&
uniqueResourceName=&jdbc/myDB& xaDataSourceClassName=&com.mysql.jdbc.jdbc2.optional.MysqlXADataSource&
xaProperties.databaseName=&puretext& xaProperties.serverName=&localhost&
xaProperties.port=&3306& xaProperties.user=&USER&
xaProperties.password=&PASSWORD& xaProperties.url=&jdbc:mysql://localhost:3306/puretext& /&
&Resource name=&jdbc/dataSourceIndex& auth=&Container&
type=&com.atomikos.jdbc.AtomikosDataSourceBean& factory=&com.atomikos.tomcat.BeanFactory&
uniqueResourceName=&jdbc/myDB& xaDataSourceClassName=&com.mysql.jdbc.jdbc2.optional.MysqlXADataSource&
xaProperties.databaseName=&puretext_index& xaProperties.serverName=&localhost&
xaProperties.port=&3306& xaProperties.user=&USER&
xaProperties.password=&PASSWORD& xaProperties.url=&jdbc:mysql://localhost:3306/puretext_index& /&
剩下的四步就和使用GlassFish的第3、4、5、6步一模一样了,这里不赘述。
以上Atomikos和Tomcat的整合方案有时候或多或少出现一点问题,这些问题基本上都和JNDI有关,我想可能是Tomcat实现的JNDI配置有问题。如果出现这样的问题无法解决的话,还有第三种方案,那就是直接在Spring的配置文件中配置Atomikos的JTA相关组件。
方法三、直接在Spring的配置文件中配置Atomikos的JTA相关组件
1、将下载的Atomikos中的jta.properties拷贝到项目的classpath中,将Atomikos的相关jar文件拷贝到项目的classpath中。
2、在项目的applicationContext.xml文件中配置JTA的相关组件,配置文件如下:
&?xml version=&1.0&encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:jee=&http://www.springframework.org/schema/jee& xmlns:tx=&http://www.springframework.org/schema/tx&
xmlns:context=&http://www.springframework.org/schema/context&
xsi:schemaLocation=&http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&
default-lazy-init=&true&&
&description& Spring公共配置文件 &/description&
&!-- 定义受环境影响易变的变量 --&
&bean class=&org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&&
&property name=&systemPropertiesModeName& value=&SYSTEM_PROPERTIES_MODE_OVERRIDE& /&
&property name=&ignoreResourceNotFound& value=&true& /&
&property name=&locations&&
&!-- 标准配置 --&
&value& classpath*:/application.properties &/value&
&/property&
&!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --&
&context:component-scan base-package=&cn.puretext& /&
&bean id=&dataSourceContent& class=&com.atomikos.jdbc.AtomikosDataSourceBean& init-method=&init& destroy-method=&close&&
&property name=&uniqueResourceName&&
&value& jdbc/dataSourceContent &/value&
&/property&
&property name=&xaDataSourceClassName&&
&value& com.mysql.jdbc.jdbc2.optional.MysqlXADataSource &/value&
&/property&
&property name=&xaProperties&&
&prop key=&serverName&&localhost &/prop&
&prop key=&portNumber&&3306 &/prop&
&prop key=&databaseName&&puretext &/prop&
&prop key=&user&&***&/prop&
&prop key=&password&&***&/prop&
&/property&
&property name=&poolSize&&
&value& &/value&
&/property&
&bean id=&dataSourceIndex& class=&com.atomikos.jdbc.AtomikosDataSourceBean& init-method=&init& destroy-method=&close&&
&property name=&uniqueResourceName&&
&value& jdbc/dataSourceIndex &/value&
&/property&
&property name=&xaDataSourceClassName&&
&value& com.mysql.jdbc.jdbc2.optional.MysqlXADataSource &/value&
&/property&
&property name=&xaProperties&&
&prop key=&serverName&&localhost &/prop&
&prop key=&portNumber&&3306 &/prop&
&prop key=&databaseName&&puretext_index &/prop&
&prop key=&user&&***&/prop&
&prop key=&password&&***&/prop&
&/property&
&property name=&poolSize&&
&value& &/value&
&/property&
&!-- Hibernate配置 --&
&bean id=&sessionFactoryContent& class=&org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceContent& /&
&property name=&namingStrategy&&
&bean class=&org.hibernate.cfg.ImprovedNamingStrategy& /&
&/property&
&property name=&hibernateProperties&&
&prop key=&hibernate.dialect&&org.hibernate.dialect.MySQL5InnoDBDialect &/prop&
&prop key=&hibernate.show_sql&&${hibernate.show_sql} &/prop&
&prop key=&hibernate.format_sql&&${hibernate.format_sql} &/prop&
&prop key=&hibernate.cache.provider_class&&org.hibernate.cache.EhCacheProvider
&prop key=&hibernate.cache.provider_configuration_file_resource_path&&${hibernate.ehcache_config_file} &/prop&
&/property&
&property name=&packagesToScan& value=&cn.puretext.entity.*& /&
&bean id=&sessionFactoryIndex& class=&org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&&
&property name=&dataSource& ref=&dataSourceIndex& /&
&property name=&namingStrategy&&
&bean class=&org.hibernate.cfg.ImprovedNamingStrategy& /&
&/property&
&property name=&hibernateProperties&&
&prop key=&hibernate.dialect&&org.hibernate.dialect.MySQL5InnoDBDialect &/prop&
&prop key=&hibernate.show_sql&&${hibernate.show_sql} &/prop&
&prop key=&hibernate.format_sql&&${hibernate.format_sql} &/prop&
&prop key=&hibernate.cache.provider_class&&org.hibernate.cache.EhCacheProvider
&prop key=&hibernate.cache.provider_configuration_file_resource_path&&${hibernate.ehcache_config_file} &/prop&
&/property&
&property name=&packagesToScan& value=&cn.puretext.entity.*& /&
&!-- 事务管理器配置,多数据源JTA事务 --&
&bean id=&atomikosTransactionManager& class=&com.atomikos.icatch.jta.UserTransactionManager& init-method=&init& destroy-method=&close&&
&property name=&forceShutdown&&&value&true &/value&&/property&
&bean id=&atomikosUserTransaction& class=&com.atomikos.icatch.jta.UserTransactionImp&&
&property name=&transactionTimeout& value=&300&/&
&bean id=&transactionManager& class=&org.springframework.transaction.jta.JtaTransactionManager&&
&property name=&transactionManager& ref=&atomikosTransactionManager& /&
&property name=&userTransaction& ref=&atomikosUserTransaction&/&
&!-- 使用annotation定义事务 --&
&tx:annotation-driven transaction-manager=&transactionManager& /&
3、在web.xml中配置多个OpenSessionInViewFilter,其配置方法同前。
4、在Dao类中使用@Resource指定使用哪一个sessionFactory。
5、运行项目,成功。
在以上的三个方法中,我强烈推荐第三种,因为该方法只需要将Atomikos的相关文件拷贝到项目的classpath中,并在applicationContext.xml文件中完成配置即可,不需要修改应用服务器的任何文件,是非侵入性的,是最轻量级的,同时,也是配置起来最容易成功的,在我的测试过程中基本上是一次成功,没有报错。
好了,就写到这里了,希望SpringSide的fans们少走弯路,天天开心。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3206057次
积分:32693
积分:32693
排名:第129名
原创:655篇
转载:89篇
评论:1215条
阅读:62446
(1)(1)(9)(2)(12)(18)(19)(13)(28)(29)(28)(31)(29)(2)(1)(2)(1)(2)(9)(5)(31)(30)(31)(31)(33)(26)(22)(1)(1)(3)(2)(1)(2)(1)(6)(30)(11)(3)(3)(11)(7)(11)(14)(1)(16)(43)(15)(71)(54)

我要回帖

更多关于 信用卡没开通收年费吗 的文章

 

随机推荐