- 概述
Spring 5.0.6版本
Spring 是一个一站式的框架,是一个轻量级的开源框架,是一个半成品的项目是解决一部分领域的业务
一站式:j2ee中三层架构的 web (springmvc) service(spring) dao(spring jdbcTemplate)
轻量级:非侵入性的,高内聚低耦合
开源:源代码开放的
框架好处:
提高开发效率,减少程序员的工作量
下载地址:http://repo.spring.io/release/org/springframework/spring/5.0.6.RELEASE/
- Ioc
Ioc : 控制反转:将对象的创建及管理(生命周期)交由spring ioc 大工厂来管理
Ioc : 底层实现就是一个大工厂
Ioc 也称 依赖注入 DI 依赖注入是在ioc基础上完成的
- Ioc 案例
- 创建一个java project 工程
- 导入核心jar包 beans core context expreession logging
- 创建配置文件 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for data access objects go here --></beans>
- 创建spring ioc 容器
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);// use configured instanceList<String> userList = service.getUsernameList();
- Bean的配置
生命周期的几个属性 init-method destroy-method
懒加载 lazy-init
属性赋值:构造注入 setter注入
P 空间 简化属性setter注入
自动装配 autowire : byName | byType
复杂 类型 注入:
Array
List
Set
Map
Properties
- 注解
@Component @Controller @Service @Repository 创建对象的
@Autowired @Resource @Value(#{spEL(id[‘key’])}) @Value(${}) 注入值
@Scope 作用域
- Aop
面向切面编程(将业务功能和非业务功能分离)底层就是动态代理
动态代理:jdk cglib
Jdk : 针对的是接口
Cglig :针对的是实现的子类
应用场景:
审计日志 系统监控 事务控制 权限控制 ....
切面
连接点
切点
切点表达式
通知
实例:使用注解形式配置aop
1.导包 需要到 aop 包 aspects 包 aspectjweaver-1.9.1.jar aopalliance-1.0.jar
2.开启aop 注解
<!-- 开启aop 注解驱动 -->
<!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> -->
3.配置
@Aspect 配置切面
@Component创建对象
@Befor 前置
@After 后置
@Around 环绕
@AfterReturning 最终
@AfterThrowing 异常
切点表达式:
execution(public * *(..))
名称以“set”开头的任何方法的执行:
execution(* set*(..))
执行AccountService接口定义的任何方法:
execution(* com.xyz.service.AccountService.*(..))
执行服务包中定义的任何方法:
execution(* com.xyz.service.*.*(..))
执行服务包或子包中定义的任何方法:
execution(* com.xyz.service..*.*(..))
实例:使用xml形式配置aop
<!-- 切面 切点= 切点表达式 (配置连接点) 通知 -->
<!-- 目标组件 -->
<bean id="myAop" class="com.zc.sp.aop.MyAop"></bean>
<aop:config>
<aop:aspect ref="myAop"><!-- 切面 -->
<!-- 切点
切点表达式:execution(* com.zc.sp.service.impl.*.*(..))
表达式(连接点:需要增强的方法)
-->
<aop:pointcut expression="execution(* com.zc.sp.service.impl.*.*(..))" id="pt"></aop:pointcut>
<!-- 后置通知 -->
<aop:after method="end" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
- 事务
事务:指的是逻辑上的一组操作,这组操作要么一起成功要么一起失败
特性:
原子性:事务是一个不可分割的工作单位,事务中的操作要么都成功要么都不成功
一致性:事务前后数据的完整性必须保存一致
隔离性:多个用户访问数据库时,一个用户的事务不能被其他用户的事务所干扰多个并发事务之间数据要相互隔离
持久性:一个事务一旦被提交,就永久性的保存到数据库中
事务管理的3个接口:
platformTransactionManager 事务管理器
transactionDefinition 事务定义的信息(隔离,传播,超时,只读)
transactionStatus 事务具体运行状态
看api
事务如果不考虑隔离性就会引发安全问题:如 脏读 不可重复读 幻读
隔离级别就是解决这样的问题:
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据则是无效的
不可重复读 :在同一事务中,多次读取同一事务返回的结果有所不同
幻读 :一个事务读取了几行记录后,另一个事务就插入了一些记录,幻读就发生了,再后来的查询中,第一个事务就会发现有些原来没有的记录
Mysql 默认的隔离级别是 repeatable_read
Oracle 默认的隔离级别是 read_commited
分三类:
前三个一类:支持当前事务,在同一个事务里面
456 为一类:不在同一个事务里面
最后一个:a 执行完设置一个保存点,b执行异常可以回滚到保存点或者最初状态
Spring 事务
编程式事务 (不讲)
声明式事务:
Xml :
<!-- 配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务的通知属性 -->
<!-- <tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
查询时只读
<tx:method name=" find*" read-only="true"/>
所有的方法都有 isolation="DEFAULT" propagation="REQUIRED" 默认事务
<tx:method name="*" />
</tx:attributes>
</tx:advice> -->
<!-- 配置aop -->
<!-- <aop:config>
<aop:pointcut expression="execution(* com.zc.sp.service.impl.*.*(..) )" id="pt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config> -->
注解:在业务实现类上添加一个事务注解@Transactional
<!-- 配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务驱动,开启事务注解 -->
<tx:annotation-driven transaction-manager="txManager"/>