第一节:Spring简介
1.Spring是轻量级的开源的JavaEE框架
2.Spring可以解决企业应用开发的复杂性
3.Spring的两个核心:IOC和AOP
(1)IOC:控制反转,把创建对象过程交给Spring进行管理
(2)AOP:面向切面,不修改源代码进行功能增强
4.Spring特点
(1)方便解耦,简化开发
(2)AOP编程支持
(3)方便程序的测试
(4)方便集成各种优秀框架
(5)降低Java EE API使用难度
(6)方便进行事务操作
第二节:IOC(xml方式)
1.加载spring.xml,Applicationcontext c = new ClassPathApplicationContext("..xml")
获取配置创建的对象:context.getBean()
2.什么是IOC
控制反转,把对象创建和对象之间的调用过程交给Spring进行管理
使用IOC目的:降低耦合度
入门案例就是IOC实现
3.IOC底层原理
(1)xml解析、工厂模式、反射
单纯工厂模式解耦并不是最低限度,IOC可以达到。
加一层,工厂创建dao对象
IOC过程,进一步解耦:
IOC(接口)
1.IOC思想基于IOC容器完成 ,IOC容器底层就是对象工厂
2.Spring提供IOC容器实现两种方式:(两个接口)
(1)BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员使用
****加载配置文件不会创建对象,在获取使用对象时才创建
(2)ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用
****加载配置文件时就创建对象
(3)ApplicationContext接口有实现类
(4)BeanFactory接口包括ApplicationContext子接口
4.IOC操作Bean管理
Bean管理指的是两个操作:(1)Spring创建对象;(2)Spring注入属性
Bean管理操作两种方式:(1)基于xml配置文件方式实现;(2)基于注解方式实现
4.1.1 基于xml方式创建对象
*id属性:唯一标识;*class属性:类全路径; 创建对象是默认通过无参构造方法
4.1.2 基于xml方式注入属性(怎么在spring.xml中为对象注入属性)
(1)DI:依赖注入,就是注入属性----在IOC创建对象的基础上的具体操作
第一种就是set方法注入;
*property标签用来注入对象属性;*value标签是属性值
关于测试属性能否输出,对于private属性,类中要配有相应的set和get方法使对象能够查看。
第二种就是有参构造器注入
有参构造器需要通过constructor-arg标签注入属性值,与无参构造property标签不同。
4.1.3 xml注入其他属性类型
1.字面量
(1)null值---用null标签
(2)特殊符号----用转义符或者把特殊符号内容写到CDATA
转义符号:< >
CDATA使用:<property name="bnum"> <value><![CDATA[<<南京>>]]></value>
(3) 注入属性(xml方式):外部bean(对象类型属性)
(1)创建两个类service类和dao类(这个dao是接口实现类)
(2)在service调用dao里面的方法(在sevice中设置类型为dao的属性,最后配置在xml中)
(3)在spring配置文件中进行配置(用ref标签指明注入的对象)
(4) 注入属性-内部bean和级联赋值(对象类型属性)
(1)一对多关系:部门和员工
(2)在实体类之间表示一对多关系,员工类的部门属性用部门类的对象类型属性进行表示
//员工属于一个部门
private Dept dept;
(3)在spring配置文件中进行配置(在员工bean中嵌套所用的部门bean)
(5)注入集合类型属性(与之前的基本数据类型,集合类型可以注入多个值)
1.注入数组类型属性(<array><value>..</value></array>
2.注入List集合类型属性(<list><value>..</value></list>
3.注入Map集合类型属性(<map><entry key=, value=>..</entry></map>
(5.1)注入集合类型属性的细节问题
1.在集合里面设置对象类型值
(5.2)使用util标签完成list集合注入提取
4.2 IOC操作Bean管理(FactoryBean)
1.Spring有两种类型的bean,一种是普通bean,另外一种是工厂bean
2.普通bean:在xml中定义bean类型就是返回类型;
3.工厂bean:在xml中定义bean类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
测试时对象类型直接就是返回类型(意思就是不直接拿到对象,而是通过工厂拿到)
4.3 Bean的作用域(单、多实例)
(1)在Spring中默认的bean对象是单实例的;
(2)在Springxml的bean标签中有属性(scope)用于设置单实例或多实例
4.4 Bean生命周期(带后置处理器实现接口BeanPostProcesser)
(1)通过构造器创建bean实例(无参构造)
(2)为bean属性注入值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器postProcessBeforeInitialization
(4)调用bean的初始化方法(需要进行配置初始化的方法:bean标签中的属性init)
(5)把bean实例传递bean后置处理器postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时,调用bean的销毁的方法(需要进行配置销毁方法)
4.5 Bean管理(xml自动装配)(为对象属性装配对应的bean)(在bean标签内选择autowire)
(1)自动装配:根据指定装配规则(属性名称或者类型),Spring自动将匹配的属性值注入
byName:根据名称注入,被注入bean的id必须和属性名相同。
byType:根据类型注入,不能定义多个同类型的bean,不然无法选择。
4.6 Bean管理(外部属性文件)
1.使用外部属文件配置数据库连接池
(1)添加context名称空间:
(2)用context标签指示外部属性文件位置:
(3)创建连接池对象bean:
属性由表达式给出,给出名称
第三节:bean管理(基于注解方式)
1.什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值...)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化xml配置
2.Spring针对Bean管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository
*上面四个注解功能是一样的,都可以用来创建bean实例
3.基于注解方式实现创建对象
第一步 引入aop依赖
第二步:开启组件扫描
(1)先创建名称空间context
(2)利用context标签进行组件扫描(可以扫描多个包,用“,”隔开)(多个包也可以直接扫描上层目录)
第三步 创建类,在类上面添加创建对象的注解
测试方法与基于xml方式的相同
组件扫描(默认扫描所有)中的两个常见配置:1.只扫描哪些内容 2.排除那些内容
4.基于注解方式实现属性注入(前三个都是注入对象类型属性)
(1)@AutoWired:根据属性类型进行自动装配
第一步:把service和dao的类上添加注解创建对象;
第二步:在sevice类中注入dao对象,在service类添加dao属性,在属性上面添加注解;(当注入类有多个对象时不适用)
(2)@Qualifier:根据属性名称进行自动装配
这个@Qualifier注解的使用,和@AutoWired一起使用;
被注入的类对象应在相应出给出名称,这两个一起使用准确找到注入bean
(3)@Resource:可以根据类型注入,可以根据名称注入
第一种:类型注入---直接@Resource
第二种:名称注入---@Resource(name = "")
(4)@Value:注入普通类型属性
5.完全注解开发(无xml文件)
(1)创建配置类:需要添加@Configuration和@ComponentScan两个注解
(2)加载配置类:使用AnnotationConfigApplicationContext类
第四节:AOP
1.什么是AOP?
(1)AOP面向切面编程:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码的方式,在主干功能里面添加新功能。
2.AOP底层原理
(1)AOP底层使用动态代理(有两种情况动态代理)
第一种:有接口情况,使用JDK动态代理
●创建接口实现类代理对象,增强类的方法
第二种:没有接口情况,使用CGLIB动态代理
●创建当前类的子类代理对象,增强类的方法
3.AOP(JDK动态代理实现)
(1)使用JDK动态代理,使用Proxy类里面的方法创建代理对象
第一步:调用newProxyInstance方法
方法有三个参数:
参数1:类加载器Proxy.class.getClassLoader()
参数2:增强方法所在的类,这个类实现的接口,支持多个接口(接口列表:Class[] interfaces = {UserDao.class})
参数3:实现这个接口InvocationHandler,创建代理对象,写增强方法
4.AOP(术语)
**1.连接点
类里面哪些方法可以被增强,这些方法成为连接点;
**2.切入点
实际被增强的方法,称为切入点;
**3.通知(增强)
(1)实际增强的逻辑部分称为通知(增强)
(2)通知有多种类型
--前置通知@Before
--后置通知@After
--环绕通知@Around
--异常通知@AfterThrowing
--最终通知 finally
**4.切面
是动作,把通知应用到切入点的过程
5.AOP操作(准备)
(1)Spring框架一般都是基于AspectJ实现AOP操作:AspectJ不是Spring的组成部分,是独立的AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作。
6.基于AspectJ实现AOP操作
(1)基于xml配置文件实现
(2)基于注解方式实现(使用)
7.在项目引入AOP相关依赖
8.切入点表达式
(1)切入点表达式作用:知道对哪个类里的哪个方法进行增强
(2)语法结构:
execution([权限修饰符] [返回类型] [类全路径].[方法名称]([参数列表]))
com.pack.User.add()----com.pack.User.*-----com.pack.* (某个方法---某个类所有方法---包下所有方法)
9.AOP操作(AspectJ注解方式)
--1--:创建类User,在类里面定义方法
--2--:创建增强类UserProxy(编写增强逻辑):在增强类里创建方法,让不同的方法代表不同的通知类型
--3--:进行通知的配置:
●在spring配置文件中,开启注解扫描
●使用注解创建User和UserProxy对象
●在增强类上面添加注解:@Aspect
●在spring配置文件中开启生成代理对象
--4--:配置不同类型的通知:在增强类中,作为通知方法上面添加通知类型注解,使用切入点表达式配置
最终测试执行被增强类的方法,会调用通知。
10.AspectJ注解细节问题
(1)相同切入点抽取:利用@PiontCut注解
(2)多个增强类对同一个方法进行增强,设置增强类的优先级
在增强类的上面添加注解:@Order(数字类型值),数字越小优先级越高
第五节:JDBCTemplate
1.什么是JdbcTemplate?
(1)Spring框架对JDBC进行封装,使用JdbcTemplate方便对数据库操作
2.准备工作
(1)引入相关jar包
(2)在spring配置文件中配置数据库连接池 (3)配置JdbcTemplate对象,注入dataSource
(4)创建service类,创建dao类,在dao注入jdbcTemplate对象
在service和dao类中添加注解
具体操作:编写serviece和dao
(1)在dao里进行数据库添加操作
(2)dao中调用jdbcTemplate对象里面的update方法对数据库进行gengxin
●第一个参数:sql语句
●第二个参数:可变参数,设置sql语句值
JdbcTemplate操作数据库(修改和删除)
JdbcTemplate操作数据库(查询返回某个值)
1.查询表里有多少条记录,返回的是某个值
2.使用JdbcTemplate查询表中记录数
JdbcTemplate操作数据库(查询返回对象)
1.场景:查询图书详情
2.JdbcTemplate实现查询返回对象 ●第一个参数:sql语句
●第二个参数:RowMapper,是接口,返回不同类型数据,使用这个接口里面实现类BeanPropertyRowMapper完成数据封装
●第三个参数:
JdbcTemplate操作数据库(查询返回集合)
1.场景:查询图书列表分页...
2.调用JdbaTemplate实现查询返回集合(类型设置为集合类型)
●第一个参数:sql语句
●第二个参数:RowMapper,是接口,返回不同类型数据,使用这个接口里面实现类BeanPropertyRowMapper完成数据封装
●第三个参数:
JdbcTemplate操作数据库(批量操作:操作表里的多条记录)
1.使用JdbcTemplate实现批量增加的操作(batchUpdate方法);
参数1:sql语句; 参数2:List集合,添加多条记录的数据;
2.使用JdbcTemplate实现批量修改的操作(batchUpdate方法);
参数相同,注意顺序!!!
2.使用JdbcTemplate实现批量删除的操作(batchUpdate方法);
第六节:事务操作
1.什么是事务
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败,所有操作都失败。
(2)经典场景:银行转账
2.事务四个特性(ACID)
(1)原子性:事务是基本单元
(2)一致性:操作前后总量不变
(3)隔离性:多事务不会相互影响
(4)持久性:事务完成,数据发生变化
3.事务操作(搭建事务操作环境)
(1)创建数据库表,添加记录
(2)创建service,搭建dao,完成对象的创建和注入,配置连接池。
service注入dao,dao注入JdbcTemplate,JdbcTemplate注入Datasource
(3)在dao中创建两个方法,一个多钱,一个少钱,service创建方法(转账方法)
***用事务解决操作数据库异常情况
事务操作过程:开启事务--开启业务操作--无异常,提交事务---出现异常,事务回滚
4.Spring声明式事务管理:一般把事务添加到JavaEE三层结构的Service层(业务逻辑层)
(1)基于注解方式; (2)基于xml配置文件方式
*****Spring进行声明式事务管理,底层使用AOP
*****Spring事务管理API:提供一个接口,这个接口针对不同的框架提供不同的实现类
注解方式具体操作:
(1)在配置文件配置事务管理器
(2)在配置文件中,开启事务注解
第一步:引入名称空间tx
(3)在service类上面(或者service类里面方法上面)添加事务注解(@Transactional)
如果添加到类上,该类所有方法添加事务;如果具体到某个方法,该方法添加事务
@Transactional注解参数介绍
(1)propagation:事务传播行为-----多事务方法直接进行调用,这个过程中事务是如何进行管理的
(2)isolation:事务隔离级别(serilizable最高)
不考虑隔离性会产生三个读问题:脏读、不可重复读、虚(幻)读
脏读:一个未提交的事务读取到另一个未提交的事务的数据
不可重复读:一个未提交的事务读取到另一个已提交的事务修改数据
虚读:一个未提交的事务读取到另一个提交事务添加数据
(3)timeout(默认-1):超出时间
事务要在一定的时间内进行提交,否则会进行回滚。
(4)readOnly(默认false):是否只读
(5)rollbackFor:回滚
设置出现哪些异常进行事务回滚
(6)noRollbackFor:不会滚
设置出现哪些异常不进行事务回滚
声明式事务管理完全注解开发
通过@Bean注解来创建原先在xml中的bean