- Spring的IOC的注解开发
- 注解的入门
- 引入aop的包
- 引入context约束
- <context:component-scan />
- <context:annotation-config />
- 使用注解开发
- @Component :定义Bean
- @Controller :WEB层
- @Service :Service层
- @Repository :DAO层
- 属性注入:
- 普通属性 :@Value
- 对象属性 :@Resource
- @Autowired :按类型注入属性,按名称@Qulifier
- @Component :定义Bean
- XML方式和注解方式比较
- XML方式 :适用性更广,结构更加清晰。
- 注解方式 :适用类是自己定义,开发更方便。
- XML和注解的整合开发
- XML定义一些工具类和配置的属性
- 注解属性注入
- 注解的入门
- Spring的AOP的基于AspectJ的XML的开发
- AOP的概述
- AOP:面向切面编程,是OOP的扩展和延伸,是用来解决OOP遇到问题。
- Spring的AOP
- 底层的实现
- JDK的动态代理
- Cglib的动态代理
- AOP的相关术语
- 连接点:可以被拦截的点。
- 切入点:真正被拦截的点。
- 通知:增强方法
- 引介:类的增强
- 目标:被增强的对象
- 织入:将增强应用到目标的过程。
- 代理:织入增强后产生的对象
- 切面:切入点和通知的组合
- AOP的入门开发
- 引入jar包
- 编写目标类并配置
- 编写切面类并配置
- 进行aop的配置
- 底层的实现
- AOP的概述
<aop:config>
<aop:pointcut expression=”execution(表达式)” id=”pc1”/>
<aop:aspect >
<aop:before method=”” pointcut-ref=”pc1”/>
</aop:aspect>
</aop:config>
-
-
- 通知类型
- 前置通知
- 后置通知
- 环绕通知
- 异常抛出通知
- 最终通知
- 切入点表达式写法
- Spring的JDBC的模板的使用
-
- Spring的JDBC的模板
-
-
Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。Spring对持久层也提供了解决方案:ORM模块和JDBC的模板。
Spring提供了很多的模板用于简化开发:
-
-
-
- JDBC模板使用的入门
-
-
- 创建项目,引入jar包
- 引入基本开发包:
- 数据库驱动
- Spring的JDBC模板的jar包
-
-
-
- 创建数据库和表
-
-
-
create database spring5_day06;
use spring5_day06;
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
-
-
-
- 使用JDBC的模板:保存数据
-
-
-
-
-
- 将连接池和模板交给Spring管理
- 引入Spring的配置文件
- 将连接池和模板交给Spring管理
-
-
-
-
- 使用Jdbc的模板
-
-
- 引入spring_aop的jar包
-
-
- 使用开源的数据库连接池:
- druid的使用
- 使用开源的数据库连接池:
-
-
- DRUID介绍
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。
- 配置参数
和其它连接池一样DRUID的DataSource类为:com.alibaba.druid.pool.DruidDataSource,基本配置参数如下:
配置
缺省值
说明
name
配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。
如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)jdbcUrl
连接数据库的url,不同数据库不一样。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnautousername
连接数据库的用户名
password
连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
driverClassName
根据url自动识别
这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下)
initialSize
0
初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive
8
最大连接池数量
maxIdle
8
已经不再使用,配置了也没效果
minIdle
最小连接池数量
maxWait
获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements
false
是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements
-1
要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery
用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
testOnBorrow
true
申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn
false
归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdle
false
建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis
有两个含义:
1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明numTestsPerEvictionRun
不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis
connectionInitSqls
物理连接初始化的时候执行的sql
exceptionSorter
根据dbType自动识别
当数据库抛出一些不可恢复的异常时,抛弃连接
filters
属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wallproxyFilters
类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系
- 引入jar包
-
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
- 配置druid连接池
-
<!--使用开源的连接池druid 德鲁伊--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc_url}"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> <!-- 数据源初始化自动创建10个连接 --> <property name="initialSize" value="10" /> <property name="maxActive" value="20" /> <property name="minIdle" value="0" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
-
- 抽取配置到属性文件
- 定义一个属性文件
- 抽取配置到属性文件
-
-
- 在Spring的配置文件中引入属性文件
-
-
-
- 注解方式的声明式事务管理
-
<aop:config> <aop:pointcut id="tx" expression="execution(public * com.vp.service.impl.*.*(..) )"></aop:pointcut> <aop:advisor advice-ref="txinterceptor" pointcut-ref="tx"></aop:advisor> </aop:config> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
在spring3以上版本中使用spring的依赖注入(注解或者xml方式)和aop功能时,发现了一个问题,如果不设置<aop:aspectj-autoproxy proxy-target-class="true"/>那么在获取bean时一直报:(无论通过name还是type都获取不到bean)
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type
或者
java.lang.ClassCastException: com.sun.proxy.$Proxy12 cannot be cast to cn.edu.nuc.SpringTest.service.impl.DemoServiceImpl
proxy-target-class="true" 与proxy-target-class="false"的区别:
proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理
---------------------
<!--事务增强--> <tx:advice id="txinterceptor" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice>
- 第三步:配置事务管理器
-
- Spring的事务管理:二类:声明式事务管理(通过配置实现)---AOP
- XML方式的声明式事务管理
- Spring的事务管理:二类:声明式事务管理(通过配置实现)---AOP
-
-
- 测试:
-
-
-
- 编写事务管理的代码
-
-
-
- 第三步:在业务层注入事务管理的模板
-
-
-
- 第二步:Spring提供了事务管理的模板类
-
-
- Spring的事务管理:一类:编程式事务(需要手动编写代码)--了解
- 第一步:配置平台事务管理器
- Spring的事务管理:一类:编程式事务(需要手动编写代码)--了解
- 配置连接池和JDBC的模板
- 在DAO注入Jdbc的模板:
-
- Spring的事务管理
- 搭建Spring的事务管理的环境
- Spring的事务管理
- 嵌套式事务
PROPAGATION_NESTED
:嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。
- 保证多个操作不在同一个事务中
PROPAGATION_REQUIRES_NEW
:如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
PROPAGATION_NOT_SUPPORTED
:如果A中有事务,将A的事务挂起。不使用事务管理。
PROPAGATION_NEVER
:如果A中有事务,报异常。
Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
-
- Spring的事务的传播行为
- Spring的传播行为
- Spring的事务的传播行为
- 保证多个操作在同一个事务中
PROPAGATION_REQUIRED
:默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
PROPAGATION_SUPPORTS
:支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
PROPAGATION_MANDATORY
:如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
-
-
- 事务的特性
-
-
-
- 如果不考虑隔离性引发安全性问题
-
- 脏读 :一个事务读到另一个事务未提交的数据
- 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
- 虚读、幻读 :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
- 丢失更新
-
- 解决读问题
-
- Read uncommitted :未提交读,任何读问题解决不了。
- Read committed :已提交读,解决脏读,但是不可重复读和虚读有可能发生。(oracle)
- Repeatable read :重复读,解决脏读和不可重复读,但是虚读有可能发生。(mysql)
- Serializable :解决所有读问题。(不允许有事务并发,安全但是效率低)
- Spring的事务管理的API
- PlatformTransactionManager:平台事务管理器
- Spring的事务管理的API
- DataSourceTransactionManager :底层使用JDBC管理事务
- HibernateTransactionManager :底层使用Hibernate管理事务
-
- TransactionDefinition :事务定义信息
-
-
-
- TransactionStatus:事务的状态
-
-
-
- 事务管理的API的关系:
-
-
- 事务的回顾
- 什么事务
- 事务的回顾
-
-
- 查询操作
-
-
-
- 删除操作
-
-
-
- 修改操作
-
-
- 使用JDBC的模板完成CRUD的操作
- 保存操作
- 使用JDBC的模板完成CRUD的操作
-
-
- 测试
-
-
-
- 引入属性文件的值
-
-
- 通知类型
-