Spring常用配置
----------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处]
文章出处:http://blog.csdn.net/sdksdk0/article/details/52471101
作者:朱培 ID:sdksdk0 邮箱: zhupei@tianfang1314.cn
--------------------------------------------------------------------------------------------
本文主要分享的是spring的基础,常用配置,都是非常重要的内容,理论+实践,文末配有案例源码下载链接。spring是开发javaee查询非常重要的一个框架,可以为后续使用springMVC打下良好的基础,其实主要的就是一些配置文件,需要哪些jar包,我们应该如何去配置,本文都有非常详细的阐述。通过使用spring整合hibernate、struts整合spring来做的SSH框架也是非常经典的一个开发模式,作为开发者都应该努力把这一部分的内容掌握,当然了,对于配置文件也不需要你一个个类的去背下来,只要记得去哪里找到这个类的配置,知道这个类有哪些方法是我们可以用的就好。同时对于不同的版本有的类方法的使用也是存在稍许差异的,学会多总结,多运用,多思考。
什么是:Spring
Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 轻量级:依赖其他内容教小,使用资源消耗也少。 核心:控制反转Ioc和面向切面AOP。 spring生成的东西叫做bean.
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器。Spring包含7大模块,每个模块可以单独使用、也可以结合起来使用;但是在实际开发过程中,一般需要结合Struts、Hibernate来使用。
核心组件:beans、core、context、expression
第一个实例
loc控制反转 1、导入jar包 2、spring核心配置文件 3、使用api获得对象实例
DI依赖注入一个类中使用了另一个类,就称为两个类存在依赖关系。从spring获得service实现类(ioc),spring自动将dao的实现类注入给service。
service提供setter方法。
BeanFactory和ApplicationContext
采用延迟加载,当第一次调用getBean方法时初始化,Application在加载完成配置文件之后进行初始化。
装配bean基于xmlbean的三种实例化方式
1、使用默认构造
!-- 创建dao -- bean id="bookDaoId" /bean !-- 创建service -- bean id="bookServiceId" !-- 使用property来完成注入,name表示当前属性名称,ref表示配置文件中另一个bean的引用 -- property name="bookDao" ref="bookDaoId" /property /bean
2、静态工厂 public class MyFactory {
public static PersonDao createPersonDao(){ return new PersonDaoImpl();
配置文件中:
bean id="personDaoId" factory-method="createPersonDao" /bean
3、实例工厂 使用工厂之前需要先创建
//实例工厂 public PersonDao createPersonDao(){ return new PersonDaoImpl();
配置文件:
bean id="myFactory" /bean bean id="personDaoId" factory-bean="myFactory" factory-method="createPersonDao" /beanbean的种类
普通bean:之前使用的所有bean,一般很常用,例如service和dao等
工厂bean:spring提供接口,FactoryBean,一个特殊的bean,具有Factory工厂,用于生产特定的Bean的bean。例如:ProxyFactoryBean用于生产代理对象的一个bean。
id属性和name属性:
id可以自动提示,名称不能重复。 name如果没有配置id,name也可以使用,可以编写多个名称,使用逗号分隔。
bean的作用域spring默认情况下创建的bean都是单例的。
取值: singleton:单例。 prototype:多例。
bean的生命周期 setter 属性注入 获得配置bean名称:replyDaoId,必须实现接口:BeanNameAware 获得spring容器,相当于TestApp new ClassPath... , 必须实现接口:ApplicationContextAware --- 也可以实现接口:BeanFactoryAware 初始化之前执行 初始化前属性设置 初始化方法,需要在xml配置 bean init-method= 初始化之后执行 save 方法-
bean id="replyDaoId" init-method="replyInit" destroy-method="replyDestory" property name="username" value="张三" /property /bean !-- 配置后处理bean -- bean /bean
手工装配:使用xml:1、构造方法注入;2、setter方法注入;3、接口注入
bean id="categoryId" !-- 描述构造方法的一个参数 index:参数的索引 type:参数的类型 value:参数的值 ref:参数的值的引用对象 constructor-arg index="0" type="java.lang.String" value="123" /constructor-arg constructor-arg index="1" type="java.lang.Integer" value="456" /constructor-arg /bean
自动装配:框架整合时:
byType:按类型装配 byName:按名称装配 constructor按构造 auto 不确定装配。p命名空间
简化set方法注入
setter方法:
bean id="" class="" property name="username" value="make" property name="address" ref="addressId"
p命名空间:
xmlns:p="http://www.springframework.org/schema/p"
bean id="companyId" p:name="指令汇科技" p:address-ref="addressId" /bean bean id="addressId" p:addr="湖南衡阳" /beanSpEL表达式
spring表达式语言。
value="#{表达式}"
bean id="studentId" property name="teacher" value="#{teacherId}" /property property name="pi" value="#{T(java.lang.Math).PI}" /property /bean bean id="teacherId" property name="tname" value="#{abc.toUpperCase()}" /property /bean
常见的5种集合:
private String[] arrayData; private List String listData; private Set String setData; private Map String,String mapData; private Properties propsData;
配置文件中:
bean id="collbeanId" !-- 数组 -- property name="arrayData" array value 数组1 /value value 数组2 /value value 数组3 /value /array /property !-- List集合 -- property name="listData" list value List集合1 /value value List集合1 /value value List集合1 /value /list /property !-- Set集合 -- property name="setData" set value set集合1 /value value set集合2 /value value set集合3 /value /set /property !-- map集合 -- property name="mapData" map entry key="aa" value="00" /entry entry key value bb /value /key value 11 /value /entry /map /property !-- properties对象 -- property name="propsData" props prop key="aa" 00 /prop prop key="bb" 11 /prop /props /property /bean装配bean基于注解
使用注解类用于取代xml配置文件,优点在于:xml配置少,使用注解配置信息简化。不足之处在于硬编码。
@Component组件,用于取代
@Component(value = "orderDaoId")
@Repository 修饰dao层
@Service 修饰service层
Controller 修饰web层
方案1:
@AutoWired 自动注入,默认按照类型 可以修饰在字段上 也可以修饰在setter方法上 缺点:如果同一个接口,有两个实现类,就会存在冲突 @Qualifier 修改AutoWired匹配,将按照名称匹配。
方案2:
@Resource 可以完成 @AutoWired 和 @Qualifier 功能 例如:@Resource("userDaoId") 按照名称匹配
@PostConstruct 初始化 @PreDestroy 销毁
@Scope 作用域
使用注解,必须将“被注解修饰的类”交予spring进行扫描。
context:component-scan base-package="类所在包名"整合junit
导入spring-test-4.2.5.RELEASE.jar
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:cn/tf/demo9/beans.xml") public class TestApp { @Autowired private UserDao userDao; @Test public void test1(){ userDao.save();
在classpath中加载注解文件
xml和注解混搭使用!-- 使 注入的注解可以使用 -- context:annotation-config /context:annotation-config !-- 所有的bean都在xml配置 所有的依赖都是注解 bean id="userDaoId" /bean bean id="userServiceId" /bean bean id="userActionId" /bean
面向切面编程:采用横向抽取机制,取代了传统纵向继承体系重复性代码。
AOP的应用:性能监视、事务管理、安全检查、缓存等。
target:目标类,需要被代理的类,也是需要被增强的类。
JoinPoint:连接点,需要被拦截点,spring中连接点就是方法,及目标类所有方法。 PointCut:切入点,已经被拦截的连接点,有哪些连接点需要被增强。 Advice:通知/增强,增强的内容。 Weaving:织入,用增强Advice应用目标类Target,生成代理对象过程。 proxy:代理。 aspect:切面,通知advice与切入点Point
spring AOP底层接口+实现类:使用jdk的动态代理。
实现类:使用的是cglib(字节码增强)
字节码增强框架,不用使用接口,在运行时,动态的创建目标类的子类,目标类不能使用final。
目标类:
public class BookService { public void addBook(){ System.out.println("cglib addBook"); public void updateBook(){ System.out.println("cglib updateBook");
切面类:
public class MyAspect { public void before(){ System.out.println("之前执行"); public void after(){ System.out.println("之后执行");
工厂:
public static Object getBean(){ final BookService bookService=new BookService(); //切面类 final MyAspect myAspect=new MyAspect(); //生成代理类。代理类是目标类的子类 //核心类 Enhancer enhancer=new Enhancer(); //确定父类 enhancer.setSuperclass(bookService.getClass()); //设置处理 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //执行目标类的方法 myAspect.before(); Object obj=method.invoke(bookService, args); methodProxy.invokeSuper(proxy, args); myAspect.after(); return obj; }); //创建代理类 Object proxyObj=enhancer.create(); return proxyObj;aop通知类型
aop是一种思想,有aop联盟提出,spring对aop的规范进行支持。
5种通知: 前置通知:在目标方法执行之前实施增强。 后置通知:在执行目标后实施增强。 环绕通知:在方法执行前后实施增强。 异常抛出通知:在方法抛出异常后实施增强。 引介通知:在目标类中添加一些新的方法和属性。
spring工厂bean--半自动切面类:需要实现接口, MethodInterceptor 环绕通知
public class MyAspect implements MethodInterceptor { @Override public Object invoke(MethodInvocation mi) throws Throwable { System.out.println("前"); //执行目标方法 Object obj = mi.proceed(); System.out.println("后"); return obj;
配置文件:
bean id="personServiceId" /bean !-- 切面类,含通知 -- bean id="myAspect" /bean !-- ProxyFactoryBean 用于生产代理类一个特殊的工厂bean proxyInterfaces 用于确定需要实现接口 interceptorNames 用于确定通知实现类,需要提供的bean名称 target 用于确定代理类bean名称 !-- 代理类 -- bean id="personServiceProxyId" !-- 确定接口 -- property name="proxyInterfaces" value="cn.tf.demo3.PersonService" /property !-- 确定通知 -- property name="interceptorNames" value="myAspect" /property !-- 确定目标类 -- property name="target" ref="personServiceId" /property !-- 强制cglib -- property name="optimize" value="true" /property /beanAOP全自动
使用AspectJ的表达式
!-- 切面类,含通知 -- bean id="myAspect" /bean !-- aop编程 -- aop:config !-- 切入点 -- aop:pointcut expression="execution(* cn.tf.demo4.*ServiceImpl.*(..))" id="myPointCut"/ !-- 一个特殊的切面 ,包含一个切入点和一个通知-- aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/ /aop:configaspectJ切入点表达式
导入jar包: aspectJ、springaop、aop联盟规范、
1、execution
execution:匹配方法的执行 格式:execution(修饰符 返回值类型 包.类名.方法名(参数列表)throws 异常)
修饰符:public|private
返回值类型:String|void|*
包:cn.tf.service --指定包 cn.tf.pm..Service --指定模块 cn.tf.pm..service.. --表示当前目录以及子目录
类名:UserService --指定名称 *Service --以Service结尾
方法名:save --执行方法名称 add* --add开头
参数列表: () --无参 (int) --参数整形 (String,int) --两个参数 (..) --参数任意
execution(* cn.tf..service...*(..))
2、within 确定包或者子包 within(cn.tf.pm.*.service..)
3、this 匹配实现接口的代理类 this(cn.tf.pm.user.service.UserService)
4、taeget 目标类
5、args 参数列表
6、bean
前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[After throwing advice]:在连接点抛出异常后执行。
返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
声明通知类型
1 前置通知 , 目标方法之前执行。 * 第一个参数为JoinPoint,可以获得目标方法名等。 aop:before method="myBefore" pointcut-ref="myPonitCut"/ 2 后置通知,目标方法之后执行,可以获得返回值。 通过“returning”属性配置第二个参数的名称,获得返回值的,类型必须Object * 第一个参数为:JoinPoint * 第二个参数为:Object xxx aop:after-returning method="myAfterReturning" pointcut-ref="myPonitCut" returning="xxx"/ 3 环绕通知, 目标方法前后 方法要求:public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{ 执行目标方法:joinPoint.proceed(); aop:around method="myAround" pointcut-ref="myPonitCut"/ 4 抛出异常通知,目标方法出现异常时才执行。通过“throwing”属性配置第二个参数的名称,获得具体的异常信息,类型必须是Throwable * 第一个参数为:JoinPoint * 第二个参数为:Throwable e aop:after-throwing method="myAfterThrowing" pointcut-ref="myPonitCut" throwing="e"/
切面类:
public void myBefore(JoinPoint joinPoint){ System.out.println("前置通知"+joinPoint.getSignature().getName()); public void myAfterReturning(JoinPoint joinPoint,Object xxx){ System.out.println("后置通知, 返回值:" + xxx); public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("前"); //必须执行目标方法 Object obj = joinPoint.proceed(); System.out.println("后"); return obj; public void myAfterThrowing(JoinPoint joinPoint, Throwable e){ System.out.println("抛出异常通知, " + e.getMessage()); public void myAfter(){ System.out.println("最终");
配置文件:
aop:config aop:aspect ref="myAspect" aop:pointcut expression="execution(* cn.tf.demo5.*.*(..))" id="myPointCut"/ !-- 声明通知类型 -- aop:before method="myBefore" pointcut-ref="myPointCut"/ aop:after-returning method="myAfterReturning" pointcut-ref="myPointCut" returning="xxx"/ aop:around method="myAround" pointcut-ref="myPointCut" / aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointCut" throwing="e"/ aop:after method="myAfter" pointcut-ref="myPointCut"/如果使用注解进行aop开发,必须进行aspectj自动代理。
aop:aspectj-autoproxy /aop:aspectj-autoproxy通知注解:
@Before @AfterReturning @Around @AfterThrowing @After
@Component @Aspect public class MyAspect { @Before("myPointCut()") public void myBefore(JoinPoint joinPoint){ System.out.println("前置通知"+joinPoint.getSignature().getName()); @AfterReturning(value="execution(* cn.tf.demo6.*.*(..))",returning="xxx") public void myAfterReturning(JoinPoint joinPoint,Object xxx){ System.out.println("后置通知, 返回值:" + xxx); @Around("myPointCut()") public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("前"); //必须执行目标方法 Object obj = joinPoint.proceed(); System.out.println("后"); return obj; @AfterThrowing(value="myPointCut()",throwing="e") public void myAfterThrowing(JoinPoint joinPoint, Throwable e){ System.out.println("抛出异常通知, " + e.getMessage()); @After("myPointCut()") public void myAfter(){ System.out.println("最终"); //用来声明切入点表达式,在通知中通过方法名来获得,相当于调用方法 @Pointcut("execution(* cn.tf.demo6.*.*(..))") private void myPointCut(){配置文件:
?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd " !-- bean definitions here --JDBC模板
!-- 扫描注解 -- context:component-scan base-package="cn.tf.demo6" /context:component-scan /beans导入spring中的jdbc,tx,c3p0,dbcp
属性文件:jdbcInfo.properties
jdbc.driver >在spring的配置文件中配置:
!-- 加载properties文件 -- context:property-placeholder location="classpath:cn/tf/jdbc/d/jdbcInfo.properties"/ !-- 配置数据源 如果properties文件已经被加载,可以通过 ${key}获得配置文件中内容 bean id="dataSourceId" property name="driverClass" value="${jdbc.driverClass}" /property property name="jdbcUrl" value="${jdbc.jdbcUrl}" /property property name="user" value="${jdbc.user}" /property property name="password" value="${jdbc.password}" /property /bean !-- 配置dao -- bean id="userDaoId" property name="dataSource" ref="dataSourceId" /property /beandao的配置可以依据实际情况写。
一组业务操作,要么全部成功,要么全部失败。
ACID:原子性、一致性、隔离型、持久性 隔离问题:脏读、不可重复读、虚读
隔离级别:读未提交、读已提交、可重复读、串行化
jdbc事务操作: //获得连接 conn=DriverManage... //开启事务 conn.setAutoCommit(false); savepoint=conn.setSavepoint(); conn.commit(); }catch(){ if(savepoint==null){ //回滚 conn.rollback(); }else{ conn.rollback(savepoint); conn.commit(); }finally{ //释放 conn.close();Spring的事务spring是基于aop进行事务管理的,导入jar包:spring-tx...
PlatformTransactionManager:平台事务管理器,spring的基本操作都必须izai事务管理器的平台上进行操作。 TransactionStatus:事务状态,用于记录事务状态,方便在事务管理器平台上,进行事务操作。
核心组件详解 平台事务管理器
TransactionDefinition:事务定义,事物详情说明,JDBC、Hibernate、Mybatis、JPA都具有自己的事务管理器。
导入jar包:spring-jdbc... spring-orm...
事务管理器: DataSourceTransactionManager , JDBC事务管理器 HibernateTransactionManager , hibernate 事务管理器
通过事务管理器去解析事务详情去获得事务状态,通过状态管理事务。
是否是新的事务、是否有保存点、设置了回滚、是否回滚、是否已经完成、刷新状态同步
事务详情:名称、是否只读、获得超时时间、隔离级别、传播行为
传播行为:
PROPAGATION_REQUIRED, required : 默认 支持当前事务,A如果已经在事务中,B将直接使用A中事务。 如果不存在创建新的,A不在事务中,B将创建新的。
PROPAGATION_SUPPORTS supports : 支持当前事务,A如果已经在事务中,B将直接使用A中事务。 使用非事务执行,A不在事务中,B将也不使用事务执行。
PROPAGATION_MANDATORY mandatory : 支持当前事务,A如果已经在事务中,B将直接使用A中事务。 如果没有事务将抛出异常,A不在事务中,B将抛异常。
PROPAGATIONREQUIRESNEW ,requires new : 创建新的。如果A没有,B将创建新的。 挂起之前的。如果A有事务,B将挂起A的事务,创建新的。
PROPAGATIONNOTSUPPORTED , not supported: B将以非事务执行,如果A已经在事务中,将A事务挂起。
PROPAGATION_NEVER ,never B将以非事务执行,如果A已经在事务中,B将抛异常。
PROPAGATION_NESTED nested : 将采用嵌套事务执行。底层使用保存点Savepoint
采用配置的方式去设置“事务详情”,spring通过事务管理器去管理事务。
案例:转账 半自动事务使用工厂Bean生成代理、 设置事务管理代码、设置事务管理器 、设置接口、设置目标、设置事务属性(事务详情)
配置文件:
!-- 事务管理器 -- bean id="txManager" property name="DataSource" ref="dataSource" /property /bean !-- 代理对象,用于生产事务的代理对象 -- bean id="accountServiceProxy" property name="transactionManager" ref="txManager" /property !-- 接口 -- property name="proxyInterfaces" value="cn.tf.service.AccountService" /property !-- 目标类 -- property name="target" ref="accountService" /property !-- 事务属性 -- property name="transactionAttributes" props prop key="transfer" PROPAGATION_REQUIRED /prop /props /property /bean使用AOP!-- 事务管理器 -- bean id="txManager" property name="dataSource" ref="dataSource" /property /bean !-- 配置事务详情 -- tx:advice id="txAdvice" transaction-manager="txManager" tx:attributes !-- tx:method 确定事务详情配置 name : 确定方法名称 transfer 确定名称 add* add开头 * 任意 propagation 传播行为 isolation 隔离级别 read-only="false" 是否只读 rollback-for="" 指定异常回滚(-) no-rollback-for="" 指定异常提交(+) 经典应用:开发中规定 tx:method name="add*"/ tx:method name="update*"/ tx:method name="delete*"/ tx:method name="find*" read-only="true"/ -- tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/ /tx:attributes /tx:advice !-- aop,将通知应用 目标类 -- aop:config aop:pointcut expression="execution(* cn.tf.service..*.*(..))" id="myPointcut"/ aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/ /aop:config添加注解:@Transactional,可以修饰在类或者方法上
在xml中配置事务管理器,并交由spring。
!-- 事务管理器 -- bean id="txManager" property name="dataSource" ref="dataSource" /property /bean !-- 使用注解 -- tx:annotation-driven transaction-manager="txManager"/web开发导入jar包,spring-web...
在web.xml中配置:
!-- 通过 servletContext 初始化参数设置xml位置 -- context-param param-name contextConfigLocation /param-name param-value classpath:applicationContext.xml /param-value /context-param !-- spring 监听器 -- listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener在servlet的post方法中:
//spring 加容器存在 ServletContext中, sc.setAttribute(name, object) ServletContext sc = this.getServletContext(); ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sc); UserService userService = (UserService) ac.getBean("userService");在applicationContext.xml中
bean id="userService" /beanSSH整合jar包
配置文件: 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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" /beanshibernate.cfg.xml
?xml version="1.0" encoding="UTF-8"? !DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" hibernate-configuration session-factory property name="hibernate.connection.driver_class" com.mysql.jdbc.Driver /property property name="hibernate.connection.url" jdbc:mysql://localhost:3306/dbone?useUnicode=true amp;characterEncoding=UTF-8 /property property name="hibernate.connection.username" zp /property property name="hibernate.connection.password" a /property property name="hibernate.dialect" org.hibernate.dialect.MySQL5Dialect /property !-- 3 sql -- property name="hibernate.show_sql" true /property property name="hibernate.format_sql" true /property !-- 4 语句ddl -- property name="hibernate.hbm2ddl.auto" update /property !-- 5 取消bean校验 -- property name="javax.persistence.validation.mode" none /property !-- 6 绑定session -- property name="hibernate.current_session_context_class" thread /property
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" hibernate-mapping class name="cn.tf.domain.User" table="t_user" id name="id" generator /generator /id property name="username" /property property name="password" /property /class /hibernate-mappingstruts.xml
?xml version="1.0" encoding="UTF-8" ? !DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" struts !-- 开发模式 -- constant name="struts.devMode" value="true" / !-- struts标签模板 -- constant name="struts.ui.theme" value="simple" /constant package name="default" namespace="/" extends="struts-default" /package /strutsweb.xml
?xml version="1.0" encoding="UTF-8"? web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" !-- 确定xml文件位置 -- context-param param-name contextConfigLocation /param-name param-value classpath:applicationContext.xml /param-value /context-param !-- spring监听器,加载xml文件 -- listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener !-- struts 前端控制器 -- filter filter-name struts2 /filter-name filter-class org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter /filter-class /filter filter-mapping filter-name struts2 /filter-name url-pattern /* /url-pattern /filter-mapping /web-appspring整合hibernate有cfg.xml
使用Hibernate模板
bean id="userService" property name="userDao" ref="userDao" /property /bean bean id="userDao" property name="hibernateTemplate" ref="hibernateTemplate" /property /bean bean id="hibernateTemplate" property name="sessionFactory" ref="sessionFactory" /property /bean session工厂 ,特殊的bean生成SessionFactory加载配置文件 bean id="sessionFactory" property name="configLocations" value="classpath:hibernate.cfg.xml" /property /bean bean id="txManager" property name="sessionFactory" ref="sessionFactory" /property /bean 事务详情 tx:advice id="txAdvice" transaction-manager="txManager" tx:attributes tx:method name="add*"/ tx:method name="update*"/ tx:method name="delete*"/ tx:method name="find*" read-only="true"/ /tx:attributes /tx:advice aop:config aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.tf.service..*.*(..))"/ /aop:config无cfg.xml
!-- 1 service层 -- bean id="userService" property name="userDao" ref="userDao" /property /bean !-- 2 dao 层 -- bean id="userDao" property name="sessionFactory" ref="sessionFactory" /property /bean !-- 3.1 加载properties配置文件 -- context:property-placeholder location="classpath:jdbcInfo.properties"/ !-- 3.2 数据源(c3p0)-- bean id="dataSource" property name="driverClass" value="${jdbc.driverClass}" /property property name="jdbcUrl" value="${jdbc.jdbcUrl}" /property property name="user" value="${jdbc.user}" /property property name="password" value="${jdbc.password}" /property /bean !-- 4 session工厂 * LocalSessionFactoryBean 特殊bean生成 SessionFactory bean id="sessionFactory" !-- 4.1 配置数据源 -- property name="dataSource" ref="dataSource" /property !-- 4.2 hibernate 特有设置 -- property name="hibernateProperties" props prop key="hibernate.dialect" org.hibernate.dialect.MySQL5Dialect /prop prop key="hibernate.show_sql" true /prop prop key="hibernate.format_sql" true /prop prop key="hibernate.hbm2ddl.auto" update /prop prop key="javax.persistence.validation.mode" none /prop /props /property property name="mappingDirectoryLocations" value="classpath:cn/tf/*" /property /bean !-- 5 事务管理 -- bean id="transactionManager" property name="sessionFactory" ref="sessionFactory" /property /bean !-- 5.2 事务详情 -- tx:advice id="txAdvice" transaction-manager="transactionManager" tx:attributes tx:method name="add*"/ tx:method name="update*"/ tx:method name="delete*"/ tx:method name="find*" read-only="true"/ /tx:attributes /tx:advice !-- 5.3 aop 事务通知 应用 切入点 -- aop:config aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.tf.service..*.*(..))"/ /aop:configstruts整合spring在applicationContext.xml中配置:
bean id="userAction" scope="prototype" property name="userService" ref="userService" /property /bean在struts.xml中
package name="default" namespace="/" extends="struts-default" action name="userAction_*" method="{1}" result name="add" /success.jsp /result /action /package配置扫描注解
bean id="hibernateTemplate" property name="sessionFactory" ref="sessionFactory" /property /bean context:component-scan base-package="cn.tf" /context:component-scan配置事务管理器
!-- 5 事务管理 -- bean id="transactionManager" property name="sessionFactory" ref="sessionFactory" /property /bean !-- 5.2 注释事务 -- tx:annotation-driven transaction-manager="transactionManager"/struts的配置中:
@Namespace("/") @ParentPackage("struts-default") public class UserAction extends ActionSupport implements ModelDriven User { private User user=new User(); @Autowired private UserService userService; @Override public User getModel() { return user; public void setUserService(UserService userService) { this.userService = userService; @Action(value="userAction_add" ,results=@Result(name="add",location="/success.jsp")) public String add(){ this.userService.addUser(user); return "add"; }
本文中使用的案例源码:
https://github.com/sdksdk0/springDemo1 (包含bean装配,scope作用域,spring表达式,spring生命周期,注解配置等)
https://github.com/sdksdk0/springDemo2 (包括AOP、aspectJ切入点表达式、jdbc模板等)
https://github.com/sdksdk0/springDemo3 (包含事务管理、转账案例、spring整合hibernate,struts整合spring等)
Spring Boot配置HTTPS,解决微信小程序上线问题 由于微信小程序在体验版和上线版本,需要用https连接,所以你需要申请一个域名,并为这个域名申请证书。怎么利用acme.sh免费申请证书在上篇文章有提到利用acme.sh免费建立https连接,这里就记录一下Spring Boot中配置HTTPS,再利用Docker进行部署。
Java Spring 定时任务配置调试多线程和执行多线程 遇到同一台服务器的定时任务部分执行的情况,暂时找不到原因,估计是因为线程被占满了,有些任务无法执行。 因项目用的是spring mvc的,这里暂时记录spring mvc配置,回头将spring boot的配置详细说明也加上。
朱培 CSDN博客专家,大数据与云计算领域,常年活跃于Github、CSDN、开源中国等开源社区。
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载
相关文章
- MyEclipse2014高速配置Spring & Spring Testing, Spring AOP简单使用
- Spring Boot OAuth 2.0 客户端
- Spring Boot修改最大上传文件限制:The field file exceeds its maximum permitted size of 1048576 bytes.
- spring boot 学习
- Spring MVC学习:配置简解
- Spring定时任务的几种实现
- spring解析xml,yml配置文件
- Spring防止Xss配置
- 网传的Spring大漏洞
- Spring Boot中使用@Async的时候,千万别忘了线程池的配置!
- Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
- Spring Cloud Config采用Git存储时两种常用的配置策略
- Spring Boot 底层级探索系列 04 - Web 开发(3)
- spring mvc 返回json数据的四种方式
- 通过eclipse配置Spring MVC项目
- spring中的AOP 以及各种通知 配置
- spring aop中的propagation(传播属性)的7种配置的意思
- Spring_Task初探(注解,XML配置)
- 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
- Spring框架中IoC(控制反转)的原理(转)
- 【spring框架】通过注解配置bean
- 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
- Spring JSR-250注解
- 玩转spring boot——AOP与表单验证
- 玩转spring boot——简单登录认证
- Quartz 在 Spring 中如何动态配置时间--转
- 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的?
- Spring AOP 和代理
- 4. 成功解决:Spring Boot Configuration Annotation Processor not configured