四:SpringThinking
一.将对象配置到容器
1.xml文件:空参构造
<bean name="user" class="com.spring.bean.User" scope="prototype" init-method="init" destroy-method="destroy"></bean>
2.指定扫描com.spring.bean包下所有类中的注解.注:会扫描包下的所有后代包
<context:component-scan base-package="com.spring.bean"></context:component-scan>
注解:
@Component("BeanName") 将对象注册到spring容器
- @Controler 控制层
- @Service 业务层
- @Repository dao层
@Scope 指定对象的作用范围
- singleton 单例模式
- prototype 多例
@Value 值类型属性注入
@Autowired 自动属性注入.根据类型注入
@Qulifier 指定注入的对象的名称
@Resource 指定对象的名称注入
@PostConstruct 初始化方法
@PreDestory 销毁方法
二.Spring AOP开发
定义代理对象
- 配置目标对象
- 配置通知对象
- 定义代理对象
<!-- proxyInterfaces:织入目标对象接口 -->
<!-- target-ref:织入目标引用 -->
<!-- interceptorNames:织入后置增强 -->
<bean name="customerBean" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.spring.service.ICustomerService"
p:target-ref="customerService" p:interceptorNames="surveyAfterAdvice,buyBeforeAdvice">
</bean>
将通知织入到目标对象(xml文件)
- 配置目标对象
- 配置通知对象
- 配置将通知织入目标对象
<aop:config>
<!-- 配置切入点 -->
<aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
<!-- 指定通知类中方法的通知类型 -->
<aop:aspect ref="通知对象名称" >
<aop:before method="" ponintcut-ref="" />
<aop:after-returning method="" ponintcut-ref="" />
<aop:around method="" ponintcut-ref="" />
<aop:after-throwing method="" ponintcut-ref="" />
<aop:after method="" ponintcut-ref="" />
</aop:aspect>
</aop:config>
开启aop注解(注解)
配置目标对象(xml)
配置通知对象(xml)
开启使用注解完成注入
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>(xml)
@Aspect 指定当前类是通知类
@Before(execution(切点表达式)) 前置通知方法
@after-returning(execution(切点表达式)) 后置通知方法
@around(execution(切点表达式)) 环绕通知方法
@after-throwing(execution(切点表达式)) 异常拦截通知方法
@after(execution(切点表达式)) 后通知方法
@Pointcut(
"execution(* com.spring.service.*ServiceImpl.*(..))"
)
@PointCut 抽取切点表达式
public void pc(){}@Before("MyAdvice.pc()")
@after-returning("MyAdvice.pc()")
@Around("MyAdvice.pc()")
@after-throwing("MyAdvice.pc()")
@after("MyAdvice.pc()")
三.spring事务
- spring声明式事务
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 以方法为单位,指定方法应用什么事务属性 -->
<!-- name:事务方法名; isolation:隔离级别; propagation:传播行为; read-only:是否只读 -->
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置将事务通知织入目标对象 -->
<aop:config>
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(* com.spring.tx.*ServiceImpl.*(..))" id="txPc"/>
<!-- 配置切面:通知+切点 advice-ref:通知的名称 pointcut-ref:切点的名称 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>
2.spring事务注解
<!-- 开启使用注解管理aop事务 -->
<tx:annotation-driven/>
//类上
@Transaction(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class AccountServiceImpl{}
//方法上
@Transaction(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public void update*(..){}
四:SpringThinking的更多相关文章
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
随机推荐
- NetEaseGame/ATX 的MD
# ATX(AutomatorX) (中文版)[![Build Status](https://travis-ci.org/NetEaseGame/ATX.svg?branch=master)](ht ...
- Mysql 索引原理《一》索引原理与慢查询1
为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...
- ocp题库更新,052最新考试题及答案整理-31
31.Which two events always request the LGWR to write? A) when LGWR is notified by a server process t ...
- php-fpm 解析
以下内容转自:https://blog.csdn.net/u010785091/article/details/78705690 有一些工具一直在用,却从来也不知道这些东西是什么. 现在想想还是梳理一 ...
- leecode刷题(14)-- 有效的字母异位词
leecode刷题(14)-- 有效的字母异位词 有效的字母异位词 描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = " ...
- 如何实现 Python 中 selnium 模块的换行
如何实现 Python 中 selnium 模块的换行 三种方法: 直接调用 .submit() 方法,常使用在用户密码登录中 # driver.find_element_by_xpath('//*[ ...
- java集合类学习笔记之HashMap
1.简述 HashMap是java语言中非常典型的数据结构,也是我们平常用的最多的的集合类之一.它的底层是通过一个单向链表(Node<k,v>)数组(也称之为桶bucket,数组的长度也叫 ...
- ListView-电影列表
import React, { Component } from 'react';import { Platform, StyleSheet, Text, View, ListView } from ...
- 03. PNG,GIF,JPG的区别及如何选?
3.PNG,GIF,JPG的区别及如何选? 照片用 JPG. 动画用 GIF. Logo.Icon 等小图用 PNG-8. 非特殊情况,尽量不要用 PNG-24 和 PNG-32.
- Little Sub and Traveling(杭师大第十二届校赛E题) 欧拉回路
题目传送门 题目大意: 从0出发,每次只能跳到(i*2)%n或者(i*2+1)%n,求字典序最大的哈密顿回路. 思路: 首先n为奇数时无解,先来证明这一点. 先假设n为奇数,若要回到原点,则必定有一步 ...