




免费预览已结束,剩余123页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
springinaction 一 开始spring之旅 Spring是一个非常活跃的开源框架 它是一个基于IOC和AOP来构架多层JavaEE系统的框架 Spring不强迫你必须在每一层中必须使用Spring 因为它在模块化方面做的很好 它允许你根据自己的需要选择使用它的某一个模块 它实现了很优雅的MVC 对不同的数据访问技术提供了统一的接口 采用IOC使得开发者可以很方便的实现对Bean类的装配 同时 它提供了简洁的AOP并据此实现TranscationManagment 等等 Spring提供了一种轻量级的解决方案 它以一种非侵入式的方式来管理你的代码 Spring提倡 最少侵入 这也就意味着你可以适当的时候安装或卸载Spring Spring介绍 一 开始spring之旅 Spring模块 一 开始spring之旅 控制反转 IOC IOC就是InversionofControl 控制反转是相对于Spring的容器而言 这里的控制指的就是程序相关类之间的依赖关系 在Spring中 这种依赖关系被反转了 创建被调用者的工作不再由调用者来完成 目的是为了获得更好的扩展性和良好的可维护性 一 开始spring之旅 依赖注入 DependencyInjection 让bean与bean之间以配置文件的方式组织在一起 它是IOC的另外一种解释 很多时候 我们把DI和IOC等同起来 表达同一观点 当调用者需要使用被调用者对象时 由Spring容器来完成创建被调用者对象的工作 称为控制反转 然后将对象的值注入给调用者 称为依赖注入 二 装配Bean 2 1容纳你的bean spring容器 1 bean工厂容器 最简单的容器 提供了基础的依赖注入支持 创建各种类型的Bean 2 应用上下文容器 建立在bean工厂基础之上 提供系统架构服务 二 装配Bean 2 1容纳你的bean2 1 1bean工厂介绍采用工厂设计模式 创建分发各种类型的bean 配置好它们之间的协作关系 参与bean的生命周期 spring容器实例化Resourceresource newClassPathResource beans xml BeanFactorybeanfactory newXmlBeanFactory resource bean工厂只把bean的定义信息加载进来 用到的时候才实例化 延迟加载到bean工厂中的 beanfactory getBean mybean 就可得到一个bean 这时工厂就会实例化bean 并且使用依赖注入开始设置bean的属性 二 装配Bean 2 1容纳你的bean2 1 2使用应用上下文ApplicationContext spring更加高级的容器 功能强大 1 提供文本信息解析工具 包括对国际化支持 2 提供载入文件资源的通用方法 如图片 3 可以向注册为监听器的bean发送事件 只有在资源很少的情况下 使用BeanFactory 如在移动设备 二 装配Bean 2 1容纳你的bean2 1 2使用应用上下文 续 三种经常用到的实现 1 ClassPathXmlApplicationContext 从类路径中加载 2 FileSystemXmlApplicationContext 从文件系统加载 3 XmlWebApplicationContext 从web系统中加载 二 装配Bean 2 1容纳你的bean2 1 2使用应用上下文 续 只能在指定的路径中寻找xml文件ApplicationContextcontext newFileSystemXmlApplicationContext E workspace springlession src beans xml 可以在整个类路径中寻找xml文件 通过这种方式加载 需要将spring的配置文件放到当前项目的classpath路径下 classpath路径指的是当前项目的src目录 该目录是java源文件的存放位置 ApplicationContextcontext newClassPathXmlApplicationContext beans xml 二 装配Bean 2 1容纳你的bean2 1 2使用应用上下文 续 除了应用上下文提供的附加功能外 应用上下文与bean工厂的另一个重要区别是关于单例bean如何被加载 bean工厂延迟加载所有bean 直到getBean 方法被调用 应用上下文会在启动后预载入所有单例bean 这样可确保应用不需要等待他们被创建 二 装配Bean 2 1容纳你的bean2 1 3bean的生命周期bean被载入到容器中时 他的生命周期就开始了 bean工厂在一个bean可以使用前完成很多工作 1 容器寻找bean的定义信息并实例化 2 使用依赖注入 spring按bean定义信息配置bean的所有属性 3 若bean实现了BeanNameAware接口 工厂调用Bean的setBeanName 方法传递bean的ID 4 若bean实现了BeanFactoryAware接口 工厂调用setBeanFactory 方法传入工厂自身 5 若有BeanPostProcessor和bean关联 则它们的postProcessBeforeInitialization 方法将被调用 6 若bean指定了init method方法 它将被调用 7 最后 若有BeanPostProcessor和bean关联 则它们的postProcessAfterInitialization 方法被调用 至此 Bean可以被应用系统使用了 二 装配Bean 2 1容纳你的bean2 1 3bean的生命周期 续 将bean从工厂中删掉有两种方法 1 若bean实现了DisposableBean接口 distroy 方法被调用 2 如果指定了定制的销毁方法 就调用这个方法 bean在应用上下文中的生命周期和在bean工厂的生命周期唯一不同的是 若bean实现了ApplicationContextAware 接口 setApplicationContext 方法会被调用 二 装配Bean 2 1容纳你的bean2 1 3bean的生命周期 续 实例化 设置属性值 调用BeanNameAware的setBeanName 方法 调用BeanFactoryAware的setBeanFactory 方法 调用BeanPostProcessor的预初始化方法 调用InitializingBean的afterPropertiesSet 方法 调用定制的初始化方法 调用BeanPostProcessor的后初始化方法 Bean可以使用了 容器关闭 调用DisposableBean的destory 方法 调用定制的销毁方法 Bean在SpringBean工厂中的生命周期 二 装配Bean 2 1容纳你的bean2 1 3bean的生命周期 续 实例化 设置属性值 调用BeanNameAware的setBeanName 方法 调用BeanFactoryAware的setBeanFactory 方法 调用BeanPostProcessor的预初始化方法 调用InitializingBean的afterPropertiesSet 方法 调用定制的初始化方法 调用BeanPostProcessor的后初始化方法 Bean可以使用了 容器关闭 调用DisposableBean的destory 方法 调用定制的销毁方法 Bean在SpringBean应用上下文中的生命周期 调用ApplicationContextAware方法setApplicationContext 方法 二 装配Bean 2 2基本装配在spring容器内拼凑bean叫做装配 装配bean的时候 需要告诉容器哪些bean以及容器如何使用依赖注入将它们配合在一起 二 装配Bean 2 2基本装配2 2 1使用XML装配xml是最常见的spring应用系统配置源 几种spring容器都支持使用xml装配bean 包括 1 XmlBeanFactory 调用InputStream载入上下文定义文件 2 ClassPathXmlApplicationContext 从类路径载入上下文定义文件 3 XmlWebApplicationContext 从web应用上下文中载入定义文件 4 FileSystemXmlApplicationContext 从文件系统加载 二 装配Bean 2 2基本装配2 2 1使用XML装配 续 上下文定义文件的根元素是 有多个子元素 每个元素定义了一个bean如何被装配到spring容器中 二 装配Bean 2 2基本装配2 2 2添加一个bean对bean的最基本的配置包括bean的ID和它的全称类名 bean的id是foo 二 装配Bean 2 2基本装配2 2 2添加一个bean 续 原型与单实例spring中的bean缺省情况下是单例模式 始终返回一个实例 若想返回不同的实例的话需要定义成原型模式 作用域描述singleton在每个SpringIoC容器中一个bean定义对应一个对象实例 prototype一个bean定义对应多个对象实例 二 装配Bean 2 2基本装配2 2 2添加一个bean 续 实例化与销毁spring实例化bean或销毁bean时 有时需要作一些处理工作 因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法 当bean被载入到容器的时候调用setup 当bean从容器中删除的时候调用teardown 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖元素的子元素指明了使用它们的set方法来注入 可以注入任何东西 从基本类型到集合类 甚至是应用系统的bean 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 简单bean配置配置bean的简单属性 基本数据类型和String tom 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 引用其它bean 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 内部bean这种方式的缺点是你无法在其它地方重用这个bar实例 原因是它是专门为foo而用 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 装配集合若bean的属性是集合类型 按如下处理 装配List和数组 bar1bar2 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 装配集合装配set bar1set使用方法和list一样 不同的是对象被装配到set中 而list是装配到List或数组中装配 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 装配map bar1map中的的数值和以及的一样 可以使任何有效的属性元素 需要注意的是key值必须是String的 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 装配Properties bar1bar2 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 若bean的属性是集合类型 按如下处理 设置null 二 装配Bean 2 2基本装配2 2 3通过set方法注入依赖 续 Set注入的替代 set注入是一种直接方式 缺点是它假设了所有的可变属性都可以通过set方法访问到 例如有些属性在创建时设置一次 以后不再改变 替代方式是通过构造函数设置一些属性值 二 装配Bean 2 2基本装配2 2 4通过构造函数注入依赖42set注入的缺点是无法清晰表达哪些属性是必须的 哪些是可选的 构造注入的优势是通过构造强制依赖关系 不可能实例化不完全的或无法使用的bean 二 装配Bean 2 2基本装配2 2 4通过构造函数注入依赖 续 解决构造函数参数不确定性构造函数带多个参数或参数类型大都相同该如何处理 spring并不是按照参数的顺序来配置参数的 有两种方法来解决构造参数的不确定性 序号和类型 有一个可选的index属性 可用来指定参数的顺序 二 装配Bean 2 2基本装配2 2 4通过构造函数注入依赖 续 解决构造函数参数不确定性通过参数的顺序 bar1 二 装配Bean 2 2基本装配2 2 4通过构造函数注入依赖 续 解决构造函数参数不确定性通过参数的类型 bar1 二 装配Bean 2 3自动装配有四种自动装配类型 1 byName 寻找和属性名相同的bean 若找不到 则装不上 2 byType 寻找和属性类型相同的bean 若找不到 则装不上 找到多个 抛异常 3 constructor 查找和bean的构造参数一致的一个或多个bean 若找不到或找到多个 抛异常 按照参数的类型装配 与 2 相似 4 autodetect 首先尝试用 3 来装配 然后使用 2 方式 不确定性的处理与 3 和 2 一致 二 装配Bean 2 3自动装配2 3 1处理自动装配的不确定性使用byType和constructor自动装配时 若找到多个符合条件的bean 会报异常 因此最好的方式是不用自动组装 二 装配Bean 2 3自动装配2 3 2混合使用手动和自动组装 二 装配Bean 2 3自动装配2 3 3缺省自动组装默认bean不是自动组装 在spring根元素中设置可将bean设置为自动组装 二 装配Bean 2 4使用spring的特殊bean2 4 1分散配置将配置文件分成几个分散的配置文件是很有益的 如数据源 jdbc propertiessecurtiy propertiesapplication properties 二 装配Bean 2 4使用spring的特殊bean2 4 1分散配置 续 jdbc propertiesdatabase url database driver datebase username datebase password 二 装配Bean 2 4使用spring的特殊bean2 4 1分散配置 续 使用占位符变量代替bean装配文件中的硬编码配置 占位符采 variable 形式 database url Spring容器的启动方法1contextConfigLocation WEB INF classes applicationContext xml 如有多个spring配置文件用逗号隔开org springframework web context ContextLoaderListener Spring容器的启动方法2contextConfigLocation WEB INF classes applicationContext xml 如有多个spring配置文件用逗号隔开contextLoaderorg springframework web context ContextLoaderServlet2 Spring容器的启动方法3Struts的启动方法3 三 创建切面 3 1AOP介绍 CourseService CourseService CourseService 安全 事务 其他 三 创建切面 3 1AOP介绍3 1 1定义AOP术语1 切面 aspect 要实现的交叉功能 是系统模块化的一个切面或领域 如日志记录 2 连接点 应用程序执行过程中插入切面的地点 可以是方法调用 异常抛出 或者要修改的字段 3 通知 切面的实际实现 他通知系统新的行为 如在日志通知包含了实现日志功能的代码 如向日志文件写日志 通知在连接点插入到应用系统中 切面的功能被称为通知4 切入点 定义了通知应该应用在哪些连接点 通知可以应用到AOP框架支持的任何连接点 5 引入 为类添加新方法和属性 6 目标对象 被通知的对象 既可以是你编写的类也可以是第三方类 7 代理 将通知应用到目标对象后创建的对象 应用系统的其他部分不用为了支持代理对象而改变 8 织入 将切面应用到目标对象从而创建一个新代理对象的过程 把通知应用到目标对象的过程 织入发生在目标对象生命周期的多个点上 编译期 切面在目标对象编译时织入 这需要一个特殊的编译器 类装载期 切面在目标对象被载入JVM时织入 这需要一个特殊的类载入器 运行期 切面在应用系统运行时织入 通知 程序执行 切入 连接点 三 创建切面 3 1AOP介绍3 1 2SpringAOP实现用java编写spring通知在spring中所有的通知都是以java类的形式编写的 切入点定义在配置文件中编写 所以切面代码和配置文件对我们来说都很熟悉 对于其他框架 Aspectj 需要特定的语法编写 如果使用的话 还需学习新的语言 三 创建切面 3 1AOP介绍3 1 2SpringAOP实现 续 spring在运行时通知对象spring在运行期创建代理 不需要特殊的编译器 spring有两种代理方式 1 若目标对象实现了若干接口 spring使用JDK的java lang reflect Proxy类代理 该类让spring动态产生一个新类 它实现了所需的接口 织入了通知 并且代理对目标对象的所有请求 2 若目标对象没有实现任何接口 spring使用CGLIB库生成目标对象的子类 使用该方式时需要注意 1 对接口创建代理优于对类创建代理 因为会产生更加松耦合的系统 对类代理是让遗留系统或无法实现接口的第三方类库同样可以得到通知 这种方式应该是备用方案 2 标记为final的方法不能够被通知 spring是为目标类产生子类 任何需要被通知的方法都被复写 将通知织入 final方法是不允许重写的 spring只支持方法连接点 不提供属性接入点 spring的观点是属性拦截破坏了封装 面向对象的概念是对象自己处理工作 其他对象只能通过方法调用的得到的结果 三 创建切面 3 2创建通知 三 创建切面 3 2创建通知3 2 1前置通知publicinterfaceMethodBeforeAdvice voidbefore Methodm Object os Objecttarget 该接口提供了获得目标方法 参数和目标对象的机会 不能够改变运行时参数 即不能替换参数对象和目标对象 注意在方法结束后不返回任何值东西 原因是该接口返回后 目标方法将会被调用 应该返回目标对象的返回值 该接口唯一能阻止目标方法被调用的途径是抛出异常或 System exit 三 创建切面 3 2创建通知3 2 1前置通知 续 publicclassLoginBeforeAdviceimplementsMethodBeforeAdvice intcount 0 method 目标方法 obj 目标参数 target 目标对象 publicvoidbefore Methodmethod Object obj Objecttarget throwsThrowable System out println 目标方法method method getName System out println 目标参数值obj 0 obj 0 System out println 目标参数值obj 1 obj 1 System out println obj obj length System out println 目标对象target target getClass toString count System out println 本站点被访问 count 1 次 您是第 count 位访问者 三 创建切面 3 2创建通知3 2 1前置通知 续 org aop before ILoginadvice 三 创建切面 3 2创建通知3 2 1前置通知 续 ProxyFactoryBean是一个在BeanFactory中显式创建代理对象的中心类 可以给它一个要实现的接口 一个要代理的目标对象 一个要织入的通知 并且他将创建一个崭新的代理对象 三 创建切面 使用proxyFactoryBean 三 创建切面 使用proxyFactoryBean 续 三 创建切面 3 2创建通知3 2 2后置通知同前置通知类似publicinterfaceAfterReturningAdvice publicvoidafterReturning ObjectreturnValue Methodm Object os Objecttarget 可以获得被通知方法的返回值 改变流程的唯一方法就是抛出异常 三 创建切面 3 2创建通知3 2 1后置通知 续 publicclassRegisterAfterAdviceimplementsAfterReturningAdvice returnValue 方法返回值 method 目标方法 obj 目标参数 target 目标对象 publicvoidafterReturning ObjectreturnValue Methodmethod Object obj Objecttarget throwsThrowable System out println 目标方法返回值 returnValue System out println 目标方法method method getName System out println 目标参数值obj 0 obj 0 System out println 目标参数值obj 1 obj 1 System out println obj obj length System out println 目标对象target target getClass toString 三 创建切面 3 2创建通知3 2 1后置通知 续 org aop after IRegisterregadvice 三 创建切面 3 2创建通知3 2 3环绕通知publicinterfaceMethodInterceptorextendsInterceptor Objectinvoke MethodInvocationinvocation 该接口同前两种通知有两个重要区别 1 该通知能够控制目标方法是否真的被调用 通过invocation proceed 方法来调用 2 该通知可以控制返回的对象 可以返回一个与proceed 方法返回对象完全不同的对象 但要谨慎使用 三 创建切面 3 2创建通知3 2 1环绕通知 续 publicclassTransactionInterceptorimplementsMethodInterceptor publicObjectinvoke MethodInvocationinvocation throwsThrowable 获取方法名StringmethodName invocation getMethod getName System out println 目标方法名 methodName System out println 目标对象 invocation getThis getClass toString System out println 目标参数值 invocation getArguments 0 System out println 目标参数值 invocation getArguments 1 System out println 目标参数个数 invocation getArguments length 预处理 这里 我们已经可以得到调用的方法名 根据获取的方法名 我们就可以进行 横切 的处理 比如 在这里我们要进行事务的处理 对增加 修改 和删除操作进行事务的控制if methodName null if methodName startsWith insert methodName startsWith delete methodName startsWith update System out println r n 事务启动 准备调用 methodName 三 创建切面 3 2创建通知3 2 1环绕通知 续 elseif methodName startsWith find 这里不需要进行事务处理System out println r n 调用目标方法obj方法的返回值 方法无返回值时 返回值为obj nullObjectobj invocation proceed System out println 方法的返回值 obj toString 后处理 if methodName null if methodName startsWith insert methodName startsWith delete methodName startsWith update System out println 事务提交完成 methodName 方法调用结束 三 创建切面 3 2创建通知3 2 1环绕通知 续 org aop around BizInterface 三 创建切面 3 2创建通知3 2 1环绕通知 续 transactionInterceptorbizImpl 三 创建切面 3 2创建通知3 2 4异常通知publicinterfaceThrowsAdvice 该接口为标识性接口 没有任何方法 但实现该接口的类必须要有如下形式的方法 voidafterThrowing Throwablethrowable voidafterThrowing Methodm Object os Objecttarget Throwablethrowable 第一个方法只接受一个参数 需要抛出的异常 第二个方法接受异常 被调用的方法 参数以及目标对象 三 创建切面 3 2创建通知3 2 1异常通知 续 publicclassUserAccountThrowAdviceimplementsThrowsAdvice publicvoidafterThrowing Methodmethod Object obj Objecttarget Throwableex throwsThrowable System out println 目标方法method method getName System out println 目标参数值obj 0 obj 0 System out println obj obj length System out println 目标对象target target getClass toString System out println 异常消息 ex getMessage 三 创建切面 3 2创建通知3 2 4异常通知 续 org aop throwadvice IUserAccountthrowadvice 三 创建切面 3 2创建通知3 2 5引入通知以前定义的通知类型是在目标对象的方法被调用的周围织入 引入通知给目标对象添加新的方法和属性 三 创建切面 3 3定义切入点如果不能表达在应用系统的什么地方应用通知的话 通知将毫无用处 这就是切入点的用处 切入点决定了一个特定的类的特定方法是否满足一定的规则 若符合 通知就应用到该方法上 三 创建切面 3 3定义切入点3 3 1理解Advisor大多数切面是由定义切面行为的通知和定义切面在什么地方执行的切入点组合而成的 spring认识到了这一点 提供了Advisor类 他把通知和切入点组合到一个对象中 更确切地说PointcutAdvisor提供了这些功能 publicinterfacePointcutAdvisor PointcutgetPointcut AdvicegetAdvice 这样方便在一个地方定义切入点和通知 三 创建切面 3 3定义切入点3 3 2使用spring的静态切入点静态切入点只在代理创建的时候执行一次而不是在运行期间每次方法调用都执行 所以性能比动态切入点好 是首选的切入点方式 spring为创建静态切入点提供了方便的父类 staticMethodMatherPointcut 三 创建切面 3 3定义切入点3 3 2使用spring的静态切入点NameMatchMethodPointcut publicvoidsetMappedName String publicvoidsetMappedNames String 当调用的方法名字与给出的映射名字匹配时 切点才匹配 也可在名字的开始和结束使用通配符 NameMatchMethodPointcut类可以将pointcut和Advisor结合起来 三 创建切面 3 3定义切入点3 3 2使用spring的静态切入点 续 update delete 三 创建切面 3 3定义切入点3 3 2使用spring的静态切入点 续 org aop pointcut IUserDaouserdaoimplAdvisor 三 创建切面 3 3定义切入点3 3 2使用spring的静态切入点 续 publicclassUserDaoImplAdviceimplementsAfterReturningAdvice publicvoidafterReturning ObjectreturnValue Methodmethod Object obj Objecttarget throwsThrowable System out println 目标方法返回值 returnValue System out println 目标方法method method getName System out println 目标参数值obj 0 obj 0 System out println 目标参数值obj 1 obj 1 System out println obj obj length System out println 目标对象target target getClass toString System out println method getName 方法被截取 三 创建切面 3 3定义切入点3 3 3使用spring的静态切入点 续 正则表达式切入点RegexpMethodPointcut利用正则表达式的力量来定义切入点RegexpMethodPointcutAdvisor类可以利用正则表达式来定义切入点 三 创建切面 3 3定义切入点3 3 3使用spring的静态切入点 续 org aop regexppoincut IUserDao update org aop regexppoincut IUserDao delete 三 创建切面 3 3定义切入点3 3 3使用spring的静态切入点 续 org aop regexppoincut IUserDaouserdaoimplRegexpAdvisor 三 创建切面 3 3定义切入点3 3 3使用spring的静态切入点 续 publicclassUserDaoImplAdviceimplementsAfterReturningAdvice publicvoidafterReturning ObjectreturnValue Methodmethod Object obj Objecttarget throwsThrowable System out println 目标方法返回值 returnValue System out println 目标方法method method getName System out println 目标参数值obj 0 obj 0 System out println 目标参数值obj 1 obj 1 System out println obj obj length System out println 目标对象target target getClass toString System out println method getName 方法被截取 三 创建切面 3 3定义切入点3 3 4使用动态切入点动态切入点需要判断运行时属性的值 spring提供了一种内置的动态切入点 ControlFlowPointcut该切入点根据线程调用堆栈的信息来匹配方法 也就是说只有当指定的方法或类能在当前线程执行堆栈中找到时 返回true 三 创建切面 3 4创建引入引入是为需要消息的类添加属性和方法 可以用一个已存在的类让它实现另外的接口 维持另外的状态 这也叫混合 引入能够动态的建立复合对象 提供了多态继承的好处 其他类型的通知是在方法调用的周围织入到不同连接点引入则是影响整个类 三 创建切面 3 4创建引入谨慎使用引入通知spring通知是在运行时织入 而不象其他的AOP框架将通知织入到类的字节码当中 这意味着 从其他方法创建或得道的对象不会被引入通知 例如直接实例化或返序列化的对象 三 创建切面 3 5自动代理有许多类需要通知时 显式的创建每个代理就会显得很笨拙 spring有一个自动代理机制 它可以让容器为我们产生代理 BeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator 三 创建切面 3 5自动代理3 5 1BeanNameAutoProxyCreator该类为匹配一系列名字的Bean自动创建代理 这种名字匹配和前面讲到的NameMethodMatherPointcut类似 它也允许在名字的两端进行通配符 通常为符合相同命名规则的bean应用一个或一组切面 三 创建切面 3 6自动代理3 6 1BeanNameAutoProxyCreator 续 publicclassPerformancethreshodInterceptorimplementsMethodInterceptor privatefinallongthresholdInMillis publicObjectinvoke MehtodInvocationmi longt System currentTimeMillis Objecto mi proceed t System currenttimeMillis t if t thresholdInMillis returno 三 创建切面 3 6自动代理3 6 1BeanNameAutoProxyCreator 续 5000 ServiceperformanceThresholdInterceptor 三 创建切面 3 5自动代理3 5 2DefaultAdvisorAutoProxyCreator 更强大自动代理创建器 续 该类实现了BeanPostProcessor接口 当应用上下文读入所有的Bean的配置信息后 该类将扫描上下文 寻找所有的Advisor 它将这些Advisor应用到所有符合切入Advisor点的Bean中 很重要的一点是这个代理创建器只能与Advisor配合使用 一个Advisor是一个切入点和一个通知的结合体 DefaultAdvisorAutoProxyCreator需要Advisor来知道哪些Bean需要通知 三 创建切面 3 6自动代理3 6 2DefaultAdvisorAutoProxyCreator 续 Service 四 征服数据库 4 1学习dao的理念DAO 数据访问对象 dataaccessobject 服务对象 数据访问接口 数据访问实现 四 征服数据库 4 1学习dao的理念通过jndi获得数据源java comp env jdbc myDatasource 四 征服数据库 4 1学习dao的理念创建一个DataSource连接池 使用Spring框架下的JDBC 可以屏蔽使用JDBC的细节 可以不必像传统的使用方式那样 在程序中硬编码驱动程序的加载 数据库连接的获取等等 Spring封装后的JDBC实现大大的简化了数据访问的过程 其中JdbcTmeplate是核心类实现Spring框架中提供了一致的抽象类 让不同的数据访问对象中使用相同的基类 统一了Dao类中模版的使用 作为开发者 我们可以直接使用基类中提供的方法 而无需关注于具体方法的实现方式 从设计的层面上讲 它隐藏了实现的细节 将开发者的任务集中在业务实现上 如 JdbcDaoSupport HibernateDaoSupport 四 征服数据库 4 4介绍orm框架支持4 4 2管理hibernate资源 java comp env jdbc trainingDatasource 四 征服数据库 4 4介绍orm框架支持4 4 2管理hibernate资源 续 将hibernate properties里的信息设定在LocalSessionFactoryBean中net sf hibernate dialect MySQLDialect student hbm xmlCourse hbm xml 四 征服数据库 4 4介绍orm框架支持将hibernate properties里的信息设定在LocalSessionFactoryBean中net sf hibernate dialect MySQLDialect classpath com spring persistence Course hbm xml 四 征服数据库 4 4介绍orm框架支持 续 四 征服数据库 4 4介绍orm框架支持用hibernate模板访问hibernatepublicStudentgetStudent finalIntegerid return Student hibernateTemplate execute newHibernateCallback publicObjectdoInHibernate Sessionsession throwsHibernateException returnsession load Student class id hibernateTemplate可以隐含创建hibernateCallback类 publicStudentgetStudent Integerid return Student hibernateTemplate load Student class id publicvoidupdateStudent Students hibernateTemplate update s 四 征服数据库 4 4介绍orm框架支持HibernateDaoSupport子类classStudentDaoHibernateextendsHibernateDaoSupport voidupdateStudent Students getHibernateTemplate update s 五 事务管理 5 1理解事务事务的概念 事务是一组操作的执行单元 相对于数据库操作来讲 事务管理的是一组SQL指令 比如增加 修改 删除等 事务的一致性 要求 这个事务内的操作必须全部执行成功 如果在此过程种出现了差错 比如有一条SQL语句没有执行成功 那么这一组操作都将全部回滚仅用四个词解释事务 ACID atomic 原子性 要么都发生 要么都不发生 consistent 一致性 数据应该不被破坏 Isolate 隔离性 用户间操作不相混淆Durable 持久性 永久保存 例如保存到数据库中等 五 事务管理 5 1理解事务Spring提供了两种事务管理方式编程序事务管理编写程序式的事务管理可以清楚的定义事务的边界 可以实现细粒度的事务控制 比如你可以通过程序代码来控制你的事务何时开始 何时结束等 与后面介绍的声明式事务管理相比 它可以实现细粒度的事务控制 声明式事务管理如果你并不需要细粒度的事务控制 你可以使用声明式事务 在Spring中 你只需要在Spring配置文件中做一些配置 即可将操作纳入到事务管理中 解除了和代码的耦合 这是对应用代码影响最小的选择 从这一点再次验证了Spring关于AOP的概念 当你不需要事务管理的时候 可以直接从Spring配置文件中移除该设置 Spring提供的两种事务管理策略可以让我们很方便的实现事务的管理 相对于编程序的事务管理 声明式的事务更具优势 Spring使用AOP的机制自动拦截相关的方法调用 将大量的事务管理逻辑从应用代码中分离出来 开发者无需手动干预事务的开始 提交 关闭操作 一个完整的事务管理逻辑一经定义 几乎一劳永逸 其效果就如同事务管理不存在一样 五 事务管理 五 事务管理 5 1理解事务介绍spring的事务管理器spring没有直接管理事务 而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事物实现 五 事务管理 5 1理解事务spring的事务管理器 续 platformTransactionmanager datasourceTransactionmanager hibernateTransactionmanager jdoTransactionmanager persistenceBrokerTransactionmanager JTATransactionmanager jdbc hibernate JDO OJB JTA 每种事务管理器都充当了对特定平台的事务实现的代理 这样我们就只需要和spring中的事务打交道 而不用关系实际上事务实现是什么样的 要使用一个事务管理器 你得再上下文中声明它 程序控制事务管理能让你在代码中精确定义事务边界 声明式事务帮助把一个操作从事务规则中分离出来 五 事务管理 5 2JDBC编程式序事务处理 publicbooleaninsertCustomer Objectobj null booleanflag false 创建事物管理对象这里使用DataSourceTransactionManager对象的方式它接收一个DataSource对象 并返回一个具体的PlatformTransactionManager实现 DataSourceTransactionManager是PlatformTransactionManager的子类 DataSourceTransactionManagerdtm newDataSourceTransactionManager this getDataSource 创建TransactionTemplate实例 使用DataSourceTransactionManager对象 transactiontempale采用和其他spring模板 如jdbctempalte和hibernatetemplate一样的方法 它使用回调方法 把应用程序从处理取得和释放资源中解脱出来 如同其他模板 transactiontemplate是线程安全的TransactionTemplatetransactionTemplate newTransactionTemplate dtm TransactionCallback执行事务处理后有返回值是个接口obj transactionTemplate execute newTransactionCallback 五 事务管理 TransactionStatus事物的状
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年建筑结构设计师专业技能模拟题与答案详解
- 电信弱电知识培训课件
- 2025年玻璃熔化工中级实操考试面试指南及技巧
- 2025年物资仓库保管员招聘面试题详解实际案例与答题技巧
- 办公室文员实习工作报告
- 急性CO中毒的急救和护理
- 甲状腺手术的麻醉
- 甲流预防课件
- 《百年孤独(节选)》课件
- 田径跳高课件
- GB/T 45997-2025科技成果五元价值评估指南
- 转让网约车合同协议书范本
- 医院 捐赠协议书
- 小学食堂供餐管理方案(3篇)
- 湖北省武汉市武昌区重点名校2026届中考语文全真模拟试题含解析
- 2.4抽象函数的周期性与对称性-讲义(原卷版)
- 养老院重要环境因素控制措施
- 藏文教学课件
- 血透室手卫生管理课件
- 风电场安全规程考试题库(附答案)
- DB11∕T 1205-2024 用能单位能源审计报告编制与审核技术规范
评论
0/150
提交评论