spring框架案例学习文档笔记_第1页
spring框架案例学习文档笔记_第2页
spring框架案例学习文档笔记_第3页
spring框架案例学习文档笔记_第4页
spring框架案例学习文档笔记_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

spring框架案例学习文档笔记spring框架案例学习文档笔记spring框架案例学习文档笔记spring框架案例学习文档笔记编制仅供参考审核批准生效日期地址:电话:传真:邮编:Spring–SSH整合学习笔记wjt276[2010-05-14]目录第一课:面向抽象编程 4第二课:Jdom的基本使用 4第三课:模拟Spring功能 5第四课:搭建sping的运行环境 8一、 建立一个新的项目 8二、 建立spring的配置文件 8三、 引入spring的jar包 8四、 测试代码: 8五、 注意接口的使用: 8第五课:IOC(DI)配置及应用 9一、 什么是IOC、DI 9二、 编辑xml文件时,没有提示 9三、 注入类型(Injectingdependencies) 9(一) setter注入类型SetterInjection 9(二) 构造方法ConstructorInjection 10四、 id、name 11五、 简单属性的注入 11六、 Bean的作用范围scope 12七、 集合注入 12八、 自动装配autowire 13(一) byName 13(二) byType 14(三) 注意 14九、 生命周期 15(一) lazy-init/default-lazy-init 15(二) init-methoddestroy-method不要和prototype一起用(了解) 15第六课:annotation方式Spring 16一、 开始使用annotation配置Spring 16二、 @Autowired、@Qualifier 16(一) @Autowired 16(二) @Qualifier 17三、 @Resource(重要、推荐) 17(一) JSR-250 17(二) @Resource 17四、 @Componet 18五、 @Scope、@PostConstruct、@PreDestroy 19六、 注解对应的jar包 19第七课:AOP(面向切面编程) 19一、 AOP概念 19二、 利用动态代理实现面向切面编程 20第八课:SpringAOP配置选项 21一、 AOP配置annotation方式 21(一) 搭建annotation开发环境 21(二) aspectJ类库 22(三) AOP的annotation实例 22(四) AspectJ的专业术语 23(五) 织入点语法 23(六) Advice 24(七) Pointcut 26(八) annotatin方式的AOP实例 26二、 AOP配置xml方式 27三、 AOP实现动态代理注意 28第九课:DataSource 28一、 Sping配置数据源: 28二、 注入使用 29三、 29第十课Spring整合Hiberante3 30一、 Spring配置hibernate3的SessionFactory 30(一) xml形式的SessionFactory 30(二) annotation注解方式的SessionFactory 30二、 引入hibernate所需要使用的jar 31(一) 基本jar 31(二) 加入annotation功能的jar包 31(三) 搭建日志环境并配置显示DDL语句jar包 31三、 Spring整合hibernate3事务 31(一) Annotation注解方式配置事务管理 31(二) Spring事务选项 35(三) XML文件形式配置Spring事务管理 37四、 HibernateTemplate 38(一) HibernateTemplate 38(二) HibernateDaoSupport 39第十一课:Spring整合-SSH 40一、 第一步:加入jar包(需要的jar包列表) 40二、 第二步:首先整合Spring+Hibernate 41三、 第三步:再来整合Struts2 41四、 struts的读常量: 43第十二课:DTO、VO 43一、 DTO 43二、 VO 43第十二课:SSH整合存在的问题 43一、 Jsp中访问Session时,Session已经关闭 43二、 如果不配置事务,openSessionView出现异常 44三、 中文乱码问题: 44第十三课:SSH整合的jar包 45一、 Struts2 45二、 45三、 Spring 46

第一课:面向抽象编程原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。实例:User实体类publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){ returnusername; } publicvoidsetUsername(Stringusername){=username;} publicStringgetPassword(){returnpassword; } publicvoidsetPassword(Stringpassword){ =password; }}UserDao接口publicinterfaceUserDao{ publicvoidsave(Useru);}UserDao的实现UserDaoImplpublicclassUserDaoImplimplementsUserDao{ @Override publicvoidsave(Useru){ "usersave..."); }}User管理类publicclassUserService{ ewInstance(); (id,o); } } publicObjectgetBean(Stringname){ return(name); }}测试:BeanFactoryfactory=newClassPathXmlApplicationContext(); UserServiceservice=newUserService(); ewInstance(); (id,o); oUpperCase()+(1); "methodName="+methodName); etMethod(methodName,().getInterfaces()[0]); DI与IOC相对来说是一样的概念。编辑xml文件时,没有提示window–preferences–myeclipse–FilesandEditing-xml–xmlcatalogadd按钮Location: D:\share\0900_Spring\soft\ Type: SchemaLocationKey: 注入类型(Injectingdependencies)setter(重要)构造方法(使用的非常少)接口注入(可以忘记)setter注入类型SetterInjection 就是在bean中使用setXXX方法进行注入来 在bean类中,成员属性需要setXXX方法如下:publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){ returnuserDao; } publicvoidsetUserDao(UserDaouserDao){ =userDao; } publicvoidadd(Useru){ (u);}}spring配置文件如下:<beanid="u"class=""></bean><beanid="userService"class=""> <propertyname="userDao"ref="u"/><!--这里的ref表示参考id=u的那个bean--> <!--或是下面的方式 <propertyname="userDao"> <refbean="u"></ref> </property>--></bean>构造方法ConstructorInjection首先在bean类中需要有成员属性作为参数的构造方法 代码如下:publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserService(UserDaouserDao){ super(); =userDao; } publicUserDaogetUserDao(){returnuserDao;} publicvoidsetUserDao(UserDaouserDao){ =userDao;} publicvoidadd(Useru){ (u);}}注意:背景较深的代码为构造方法,带有参数的构造方法spring配置文件如下:<beanid="u"class=""></bean><beanid="userService"class=""> <constructor-arg> <beanclass=""></bean> <!--<refbean="u"/>--> <!-- 需要注意的: 使用<bean>表示,重新new一个bean然后注入进去, 使用<ref>表示,使用已经new好的bean,这是只是引用它。 --> </constructor-arg></bean>使用<constructor-arg>和其子标签<bean>或<ref>进行构造方法注入当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入:bean代码:publicclassExampleBean{privateintyears;privateStringultimateAnswer;publicExampleBean(intyears,StringultimateAnswer){=years;=ultimateAnswer;}}1、参数类型方式进行区分参数:xml配置文件:<beanid="exampleBean"class=""> <constructor-argtype="int"value="7500000"/><constructor-argtype=""value="42"/></bean>注意:这样就是参数类型为int的注入7500000,而参数类型为的参数注入”42”,但这个方法不适合多个参数是相同的类型。2、利用索引进行区分参数xml配置文件<beanid="exampleBean"class=""><constructor-argindex="0"value="7500000"/><constructor-argindex="1"value="42"/></bean>注意:index=0的注入到第一个参数,index=1的注入到第二个参数。构造方法的注入不方便,所以我们需要使用setter注入方式。id、name注xml配置文件中<bean>标签中的属性名称如下:<beanid="u"class=""></bean>或<beanname="u"class=""></bean>以上标签中的属性id与name作用是一样,唯一的区别:id中不可以含有特殊字符,而name中可以有特殊字符简单属性的注入当bean中存在简单属性时的注入方式:bean代码如下:publicclassUserDaoImplimplementsUserDao{ privateintdaoId; privateStringdaoStatus; publicintgetDaoId(){returndaoId;} publicvoidsetDaoId(intdaoId){=daoId; } publicStringgetDaoStatus(){ returndaoStatus; } publicvoidsetDaoStatus(StringdaoStatus){=daoStatus;} @Override publicvoidsave(Useru){"usersave...");}}xml配置文件如下:<beanid="u"class=""> <propertyname="daoId"value="8"></property> <propertyname="daoStatus"> <value>good</value> </property></bean>直接使用value属性或是<value>子标签来注入Bean的作用范围scope在Spring配置文件中的<bean>标签可以指定bean的作用范围利用<bean>标签中的scope属性来指定scope值:singleton单例:每次取出的bean都是同一个bean。默认就是这个prototype原型:每次取的bean时,都会重新创建一个新的beanrequestsessionglobalsession实例:<beanid="u"class=""></bean><beanname="userService"class=""scope="prototype"> <propertyname="userDao"ref="u"/> </bean>注意:只有spring与web框架结合时才会使用request/session/globalsession,但也非常少用,因为其它框架已经有功能非常强大的scope了(例如:struts的scope)集合注入很少用,不重要,参考程序<beanid="u"class=""> <propertyname="properties"> <props> <propkey="administrator"</prop> <propkey="support"</prop> <propkey="development"</prop> </props> </property> <propertyname="list"> <list> <value>alistelementfollowedbyareference</value> <refbean="myDataSource"/> </list> </property> <propertyname="map"> <map> <entry> <key> <value>anentry</value> </key> <value>justsomestring</value> </entry> <entry> <key> <value>aref</value> </key> <refbean="myDataSource"/> </entry> </map> </property> <propertyname="set"> <set> <value>justsomestring</value> <refbean="myDataSource"/> </set> </property> </bean>自动装配autowire含义:在bean注入时不需要我们来指定注入哪个具体的bean,而spring容器会根据我的使用autowire属性来确定自动装配功能。autowire值:autodetect;byName:根据bean中成员属性的名称来自动装配byType:根据bean中成员属性的类型来自动装配。constaractordefault:会根据<beans>标签中的default-autowire属性来进行自动装配的方式no(默认就是这个,需要手动指定注入那个bean)byName根据bean中成员属性的名称来自动装配。bean代码:UserDaoImpl类publicclassUserDaoImplimplementsUserDao{ privateintdaoId; publicintgetDaoId(){returndaoId;} publicvoidsetDaoId(intdaoId){=daoId; } @Override publicStringtoString(){ return"daoId="+; }}UserService类publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){ returnuserDao; } publicvoidsetUserDao(UserDaouserDao){ =userDao; } publicvoidadd(Useru){ (u); }}spring的配置文件<beanid="userDao"class=""> <propertyname="daoId"value="1"></property></bean><beanid="userDao2"class=""> <propertyname="daoId"value="2"></property></bean><beanname="userService"class=""scope="prototype"autowire="byName"></bean>测试代码: publicvoidtestAdd_4()throwsException{ ApplicationContextfactory=newClassPathXmlApplicationContext(""); UserServiceservice=(UserService)("userService"); }结果:daoId=1说明:因为在配置文件中配置了两个UserDaoImpl(名称分别:userDao、userDao2)和一个UserService类。而在userService的bean中并没有进行注入配置。而是使用了autowire属性指定了byName值,这样结果是正确的,是因为spring看到autowire=byName后,会在配置文件中查找bean的id与userService成员属性名称一至,然后将其注入,这样就完成了根据名称自动装配功能。byType根据类型自动装配:就是spring在初始化时,会在配置文件中查找<bean>的类型与userService成员属性的类型相比较,类型一致的将其注入,这样就完成了根据类型自动装配。注意自动装配使用并不多;只有在使用anntation注解时会使用的。byType如果出现相同类型在两个以上,就会出现异常。生命周期lazy-init/default-lazy-init(不重要)bean的何时初始化lazy-init值:default:表示使用<beans>标签中的default-lazy-init值 true:表示context在初始化时,不会初始化这个bean,只有在使用时才会初始化 false:表示context在初始化时,就会初始化这个bean例如:<xmlversion=""encoding="UTF-8"><beansxmlns=""xmlns:xsi=""xsi:schemaLocation=""default-lazy-init="false"><beanid="userDao"class=""lazy-init="true"> <propertyname="daoId"value="1"></property></bean><beanid="userDao2"class=""lazy-init="default"> <propertyname="daoId"value="2"></property></bean><beanname="userService"class=""lazy-init="false"></bean></beans>init-methoddestroy-method不要和prototype一起用(了解)init-method:用于<bean>标签中的属性,表示在初始化这个bean之前所需要的执行方法destroy-method:用于<bean>标签中的属性,表示在这个bean销毁时所需要的执行方法。例如关闭连接池。注意:此属性不要与scpoe=”prototype”一起使用,否则会出现其它的问题。例如:<beanid="u"class=""> <propertyname="daoId"value="1"></property></bean><beanname="userService"class=""init-method="init"destroy-method="destroy"> <propertyname="userDao"ref="u"></property></bean>userService类的代码publicclassUserService{ publicvoidinit(){ "现在开始初始化UserService"); } privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){returnuserDao; } publicvoidsetUserDao(UserDaouserDao){=userDao;} publicvoidadd(Useru){ (u);} publicvoiddestroy(){"destory"); }}测试代码: publicvoidtestAdd_4()throwsException{ ClassPathXmlApplicationContextfactory=newClassPathXmlApplicationContext(""); UserServiceservice=(UserService)("userService"); .");} @Override publicvoiddelete(Useru){"userdelete...");}}UserService(业务层)publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){returnuserDao;} publicvoidsetUserDao(UserDaouserDao){=userDao;} publicvoidadd(Useru){ (u);} publicvoiddelete(Useru){ (u);}}User(实体对象)publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){returnusername; } publicvoidsetUsername(Stringusername){=username;} publicStringgetPassword(){returnpassword; } publicvoidsetPassword(Stringpassword){=password;} }Spring的配置文件<beans> <beanid="u"class=""/> <beanid="userService"class=""> <!--<propertyname="userDao"bean="u"/>--> </bean></beans>需要处理的日志类(实现了InvocationHandler接口)只有实现了InvocationHandler接口的类才可以进行动态代理publicclassLogIntroductionimplementsInvocationHandler{privateObjecttergert; publicLogIntroduction(UserDaouserDao){=userDao;}etClassLoader(),newClass[]{},li); Useru=newUser(); (userDaoProxy); (u); (u);}结果:beforMethodusersave...beforMethoduserdelete...这样就在执行每个方法之前加入日志处理程序了。就是利用JAVA的动态代理实现的。第八课:SpringAOP配置选项 Spring实现动态代理配置是有两种配置文件:xml文件方式;annotation方式(使用AspectJ类库实现的。)AOP配置annotation方式搭建annotation开发环境首先:需要在配置文件中加入@AspectJ标签<aop:aspectj-autoproxy/>自动帮我产生代理注意:Spring默认并没有加入aop的xsd文件,因为我们需要手动加入(红色部分)<beansxmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <aop:aspectj-autoproxy/></beans> 另外需要引用aspectJ的jar包: aspectJ类库AspectJ是一个专门用来实现动态代理(AOP编程)的类库AspectJ是面向切面编程的框架Spring使用就是这个类库实现动态代理的AOP的annotation实例要求:在执行save()方法之前加入日志逻辑spring的配置文件同上面的model类、dao层类、service层类都与上面天下一致切面类(LogInterceptor)importclassLogInterceptor{ @Before("execution(publicvoid") publicvoidbefore(){ "methodstart..."); } } 结果:这样在运行publicvoid方法之前就会先执行这个逻辑了。 注意: 1、@Aspect:意思是这个类为切面类 2、@Componet:因为作为切面类需要Spring管理起来,所以在初始化时就需要将这个类初始化加入Spring的管理; 3、@Befoe:切入点的逻辑(Advice) 4、execution…:切入点语法三个连接点(切入点)AspectJ的专业术语三个连接点(切入点)JoinPoint切入面连接点(切入点)切入面程序执行过程程序执行过程PointCut切入点人集合当需要定义一个切入点时,则需要使用这个@Pointcut("execution(*")publicvoidbusinessService(){}Aspect切面Advice切入点的逻辑例如上例中的@BeforeTarget被代理对象Weave织入织入点语法无返回值、方法参数为Userexecution(publicvoid任何包、任何类、任何返回值、任何方法的任何参数execution(public**(..))任何包、任何类、任何返回值、任何set开头方法的任何参数execution(*set*(..))任何返回值、类中的任何方法、任何参数execution(*任何返回值、包中任何类中的任何方法、任何参数execution(*任何返回值、包中任何层次子包(..)、任何类、任何方法、任何参数execution(*和!void(非void)execution(publicvoid!void注意:上以是AspectJ的织入点语法,SpringAOP也实现了自己的织入点语法,同样可以使用within执行方法之前@AspectpublicclassBeforeExample{@Before("")publicvoiddoAccessCheck(){.}}@AspectpublicclassBeforeExample{@Before("execution(*")publicvoiddoAccessCheck(){.}}@

AfterReturning方法正常执行完之后@AspectpublicclassAfterReturningExample{@AfterReturning("")publicvoiddoAccessCheck(){.}}@AspectpublicclassAfterReturningExample{@AfterReturning(pointcut="",returning="retVal")publicvoiddoAccessCheck(ObjectretVal){.}}@

AfterThrowing方法抛出异常之后@AspectpublicclassAfterThrowingExample{@AfterThrowing("")publicvoiddoRecoveryActions(){.}}@AspectpublicclassAfterThrowingExample{@AfterThrowing(pointcut="",throwing="ex")publicvoiddoRecoveryActions(DataAccessExceptionex){.}}

@After(finally)方法抛出异常被catch之后,需要进行的部分(相当于finally功能)@AspectpublicclassAfterFinallyExample{@After("")publicvoiddoReleaseLock(){.}}@

Around在方法之前和之后都要加上但是需要一个参数ProceedingJoinPoint,并者需要ObjectretVal=();和返回returnretVal;@AspectpublicclassAroundExample{@Around("")publicObjectdoBasicProfiling(ProceedingJoinPointpjp)throwsThrowable{."); } @AfterReturning("myMethod()") publicvoidafterReturning(){ "methodafterreturning..."); }}注意:那个空方法,只是为了给Pointcut起个名字,以方便别处使用annotatin方式的AOP实例importclassLogInterceptor{ @Pointcut("execution(public*") publicvoidmyMethod(){}; @Before(value="myMethod()") publicvoidbefore(){ "methodstart..."); } @AfterReturning("myMethod()") publicvoidafterReturning(){ "methodafterreturning..."); } @Around(value="myMethod()") publicvoidaround(ProceedingJoinPointpjp)throwsThrowable{ ."); ."); }}AOP配置xml方式xml方式是我们以后使用的比较多的,因为当切面类我们没有源代码时、当我们使用第三方的切面类时,我就不能使用annotation的方式,而且如果使用annotation方式一但程序编译后就不可以修改了。如果使用xml方式就不一样了,我们只需要修改xml文件就可以了。xml方式与annotation的作用是一样。现在就是实例:<xmlversion=""encoding="UTF-8"><beansxmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <beanid="logInterceptor"class=""></bean> <aop:config> <!--<aop:pointcut>在此处定义的pointcut是全局的pointcut可以供所有的aspect使用 id:表示这个pointcut的名称,以方便使用--> <aop:pointcutid="myMethod" expression="execution(public*"/> <!--<aop:aspect>表示定义一个切面类(这需要Spring初始化加入其管理) id:切面类的名称, ref:引用哪个bean(需要使用<bean>标签初始化)--> <aop:aspectid="logAspect"ref="logInterceptor"> <!--在此处定义的pointcut是全局的pointcut只供当前的aspect使用 id:表示这个pointcut的名称,以方便使用 --> <aop:pointcutid="myMethod2" expression="execution(public*"/> <!-- 定义advice时的参数 method:切面逻辑的方法名称(切面类中的方法名) pointcut-ref:表示引用哪个pointcut(要求已经在上面定义好了) pointcut:定义一个pointcut --> <aop:beforemethod="before"pointcut-ref="myMethod"/> <aop:after-returningmethod="afterReturning"pointcut="execution(public*"/> </aop:aspect> </aop:config></beans>AOP实现动态代理注意因为Spring要实现AOP(面向切面编程),需要加入切面逻辑的类就会生成动态代理。在动态代理类中加入切面类从而实现面向切面编程,但生成动态代理存在以下注意事项:被动态代理的类如果实现了某一个接口,那么Spring就会利用JDK类库生成动态代理。如果被动态代理的类没有实现某一个接口,那么Spring就会利用CGLIB类库直接修改二进制码来生成动态代理(因为利用JDK生成动态代理的类必须实现一个接口),需要在项目中引用CGLIB类库第九课:DataSource DataSource是一个接口 DataSource是一个标准,其它只需要实现它的接口,然后随意怎样实现。 Sping配置数据源: <beanid="dataSource"class=""destroy-method="close"> <propertyname="driverClassName"value=""/> <propertyname="url"value="jdbc:"/> <propertyname="username"value="root"/> <propertyname="password"value="root"/> </bean>或者Planceholder(占位符的方式)配置数据源 <!-- 下面是使用占位符(Placeholder)的方式配置数据源 首先需要配置一个占位符类bean 然后给其注入properties配置文件 classpath:表示classpath下的文件 再是在配置数据源时可以使用占位符(${})获取一些值 例如:${}:表示获取配置文件中项的值等。 --> <bean class=""> <propertyname="locations"> <value>classpath:</value> </property> </bean> <beanid="dataSource"destroy-method="close" class=""> <propertyname="driverClassName"value="${}"/> <propertyname="url"value="${}"/> <propertyname="username"value="${}"/> <propertyname="password"value="${}"/> </bean>文件=注入使用然后在其它的bean中自动注入(Spring需要使用的功能),就可以使用了。@Component("userDaoImpl")publicclassUserDaoImplimplementsUserDao{ privateDataSourcedataSource; publicDataSourcegetDataSource(){returndataSource;} @Resource(name="dataSource") publicvoidsetDataSource(DataSourcedataSource){ =dataSource;} @Override publicvoidsave(Useru){ try{ Connectionconn=(); ().executeUpdate("insertintouservalues(null,'wjt276')"); (); }catch(SQLExceptione){ ();}"usersave..."); }}#<!--初始化连接-->initialSize=10#<!--最大空闲连接-->maxIdle=20#<!--最小空闲连接-->minIdle=5#最大连接数量maxActive=50#是否在自动回收超时连接的时候打印连接的超时错误logAbandoned=true#是否自动回收超时连接removeAbandoned=true#超时时间(以秒数为单位)removeAbandonedTimeout=180#<!--超时等待时间以毫秒为单位6000毫秒/1000等于60秒-->maxWait=1000第十课Spring整合Hiberante3Spring整合hibernate3重点就是需要初始化SessionFactory这个bean,需要在Spring的配置文件中进行配置,实现实例如下:Spring配置hibernate3的SessionFactory实现上xml方式的配置文件与annotation注解方式的区别,只是在配置时所使用的bean不一样,而且配置实体类所使用的属性也不一样(xml:mappingResources;annotation:annotatedClasses),如下:xml形式的SessionFactory <!--hibernater的xml方式LocalSessionFactoryBean是处理xml方式的bean 再利用mappingResources来配置实体类(model)映射文件 再利用hibernateProperties来配置相关属性--><beanid="mySessionFactory"class=""><propertyname="dataSource"ref="dataSoure"/><propertyname="mappingResources"><list><value></list></property><propertyname="hibernateProperties"> <props> <propkey=""> <propkey="show_sql">true</prop> <propkey="format_sql">true</prop> </props></property>annotation注解方式的SessionFactory<!--hibernater的xml方式AnnotationSessionFactoryBean是处理annotation方式的bean 再利用annotatedClasses来配置实体类(model)是否进行了注解 再利用hibernateProperties来配置相关属性--><beanid="mySessionFactory"class=""><propertyname="dataSource"ref="dataSource"/><propertyname="annotatedClasses"><list><value></list></property><propertyname="hibernateProperties"> <props> <propkey=""> <propkey="">true</prop> <propkey="">true</prop> </props></property>注意:配置SessionFactory要求前面已经配置了一个数据源的bean了,这里的dataSource引用了那个bean,同时,在dao层中的dataSource成员属性要求使用自动装配功能,进行自动注入。将指定包的实体类全部扫描到SessionFactory注意:如果您想在某一包或子包下扫描需要实现类,那么在annotation下配置SessionFactory可以使用annotatedPackages选项指定实体类所在包的包路径就可以了。这样就不需要把所有的实体类都配置这样了。<propertyname="packagesToScan"> <list> <value> </list></property>这样就不需要使用annotatedClassess来一个一个配置实现类了。只要将实现类所有的包配置进来就可以了。可以配置多个包路径。引入hibernate所需要使用的jar基本jarHibernatecore/lib/requiredSlf-nopjarmysql的JDBC驱动名加入annotation功能的jar包HibernateannotationjarEjb3persistencejarHibernatecommonannotationsjar搭建日志环境并配置显示DDL语句jar包我们使用slf接口,然后使用log4j的实现。首先引入log4j的jar包,然后再引入slf4j实现LOG4J和适配器jar包最后创建log4j的配置文件,并加以修改,只要保留 注意:在引入jar包时,一定要小心,可少引入,再根据错误提示引入其它包,但不可以多引入或引入不同版本或错误的jar,否则会出现想不到的异常。Spring整合hibernate3事务Spring整合hiberante最常用的就是整合事务管理(TransactionManager)当Spring整合hibernate事务后,默认就是运行期异常RunTimeException,Spring自动回滚Annotation注解方式配置事务管理<xmlversion=""encoding="UTF-8"><beansxmlns="" xmlns:xsi="" xmlns:context="" xmlns:aop="" xmlns:tx="" xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <!--下面是使用占位符(Placeholder)的方式配置数据源 首先需要配置一个占位符类bean 然后给其注入properties配置文件 classpath:表示classpath下的文件 再是在配置数据源时可以使用占位符(${})获取一些值 例如:${}:表示获取配置文件中项的值等。 --> <bean class=""> <propertyname="locations"> <value>classpath:</value> </property> </bean> <beanid="dataSource"destroy-method="close" class=""> <propertyname="driverClassName"value="${}"/> <propertyname="url"value="${}"/> <propertyname="username"value="${}"/> <propertyname="password"value="${}"/> </bean><!--hibernater的xml方式AnnotationSessionFactoryBean是处理annotation方式的bean 再利用annotatedClasses来配置实体类(model)是否进行了注解 再利用hibernateProperties来配置相关属性 --><beanid="sessionFactory"class=""> <propertyname="dataSource"ref="dataSource"/> <propertyname="annotatedClasses"> <list> <value> <value> </list> </property> <propertyname="hibernateProperties"> <props> <propkey=""> <propkey="">true</prop> <propkey="">true</prop> </props> </property></bean><beanid="txManager"class=""> <propertyname="sessionFactory"ref="sessionFactory"/></bean><tx:annotation-driventransaction-manager="txManager"/> </beans>说明:首先:如果想使用Spring管理事务,则首需要在配置文件中加入下列(上面红色加粗部分): xmlns:tx="" xsi:schemaLocation=”">其次:配置一个事务管理器的bean,这里使用的是Hibernate的事务管理HibernateTransactionManager,也可以使用,并且需要注入一个SessionFactory的bean,利用这个bean可以获取数据源配置等其它的数据库信息。但要求已经在这之前配置了一个SessionFactory的bean了。<beanid="txManager"class=""> <propertyname="sessionFactory"ref="sessionFactory"/></bean>再次:需要在配置文件中告诉Spring,我们需要使用Spring来管理事务,并且要告诉它,使用哪个事务管理器(这里我们就使用上面的刚则配置的txManager),<tx:annotation-driventransaction-manager="txManager"/> 注意:这里我们是使用annotation注解方式配置事务管理,所以使用<tx:annotation-driven>标签最后:就是对什么方法进行事务管理,只需要在这个方法上加上@Transactional。如下:@Transactional publicvoidadd(Useru){……}这样,Spring就会对这个方法进行事务管理了。实例:场景:当保存一个用户后,需要向数据库添加一条日志记录,说明已经添加一个用户了。需要使用Spring管理其事务,如果两者有一者发生异常,执都需要进行回滚。Spring的配置文件同上;代码Log实体类@Entity@Table(name="t_log")publicclassLog{ privateintid; privateStringmsg; ……}User实体类@EntitypublicclassUser{ privateintid; privateStringname; ……}UserDao接口的实现@Component("userDaoImpl")publicclassUserDaoImplimplementsUserDao{ privateSessionFactorysessionFactory; publicSessionFactorygetSessionFactory(){returnsessionFactory;} ."); }}LogDao接口的实现@Component("logDaoImpl")publicclassLogDaoImplimplementsLogDao{ privateSessionFactorysessionFactory; publicSessionFactorygetSessionFactory(){returnsessionFactory;} ."); }}业务层代码@Component(value="userService")publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); privateLogDaologDao; publicLogDaogetLogDao(){ returnlogDao;}只读型事务超时timeoutint型(以秒为单位)事务超时回滚异常类(rollbackFor)一组Class类的实例,必须是Throwable的子类一组异常类,遇到时必须进行回滚。默认情况下checkedexceptions不进行回滚,仅uncheckedexceptions(即RuntimeException的子类)才进行事务回滚。回滚异常类名(rollbackForClassname)一组Class类的名字,必须是Throwable的子类一组异常类名,遇到时必须进行回滚不回滚异常类(noRollbackFor)一组Class类的实例,必须是Throwable的子类一组异常类,遇到时必须不回滚。不回滚异常类名(noRollbackForClassname)一组Class类的名字,必须是Throwable的子类一组异常类,遇到时必须不回滚Propagationkey属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。IsolationLevel(事务隔离等级):1、Serializable:最严格的级别,事务串行执行,资源消耗最大;2、REPEATABLEREAD:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。3、READCOMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。4、ReadUncommitted:保证了读取过程中不会读取到非法数据。隔

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论