Spring 笔记

什么是spring?
spring 是一个一站式的分层次的轻量级控制反转(ioc)和面向切面(Aop)
spring是一个开源框架,为解决企业开发的复杂性而创建
Spring 体系结构
Core Container 里有Beans,Core,Context,Spel(核心容器)
Data Access/Intergration (用来和数据库进行交互的)
web (用来和其他的web 层进行交互)自己的web 访问时Springmvc
Aop (面向切面编程权限的拦截)
Test (测试)
在这里插入图片描述

spring 框架的优点
方便解耦,简化开发
Aop 编程的支持
声明式事务的支持
方便程序的测试
方便集成各种优秀框架
降低JavaEE Api 的使用难度
spring 环境的搭建
spring的jar 包结构
docs :存在的是Api 和规范文档
libs:开发的jar 包
schema 开发过程中需要的xml 的schema 约束
在这里插入图片描述
在这里插入图片描述
实例化的三种方式

a.无参构造实例化(必须提供无参构造)
在这里插入图片描述b.静态工厂实例化
1创建工厂类,并且放回实体类对象
在这里插入图片描述
xml实例化factory的bean factory-method 指向方法
在这里插入图片描述

c.实例工厂
在这里插入图片描述

1.xml实例化factory的bean
在这里插入图片描述

2.创建user的bean引用factory的bean类+ factory-method
在这里插入图片描述

Ioc 与DI 需要使用Spring 的核心功能
beans 相关 。core 相关,context 相关,spel 相关
Ioc 和 Dl
Ioc :控制反转,简单来说就是原来由我们自己实例化对象交给Spring 容器来实例化,这时对象的实例化的权利就会反转。
DI:依赖注入,在spring框架 负责创建Bean 对象时动态将依赖对象注入到bean组件
ioc
在applicationContext.xml 文件中配置bean
在这里插入图片描述
创建一个ApplicationContext 对象
ApplicationContext 是BeanFactory 的一个子接口,我们使用的是ApplicationContext 的实现类 classPathXmlApplicationContext,通过getbean(配置文件中的id 名称)来获取指定对象
在这里插入图片描述
Dl 依赖注入
先写实体类
在这里插入图片描述
构造器注入
在这里插入图片描述
时间是Date 类型,所以用了引用
在这里插入图片描述
set注入(这种必须提供无参构造)
在这里插入图片描述
p标签的注入
先写命名空间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

spel 注入
先写实体类
在这里插入图片描述
语法是#{}
在这里插入图片描述
了解集合注入
先写实体类
在这里插入图片描述
在这里插入图片描述
Bean 的生命周期
加入init-method和 destory-method属性,里面方法为当前使用类中的方法
init 方法不需要并调用执行在对象创建前自动执行
destory 方法需要使用 applicationContext 对象的子类进行调用 destory()来实现

Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
Bean实例化后对将Bean的引入和值注入到Bean的属性中
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
多例和单例的模式
在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)
singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
Spring bean 默认是单例模式。
prototype 会出现并发情况下的程序需要使用多利模式,一般情况下不采用。
requestL每一次都会产生一个新的对象,对象会存在request请求中
session:没一个会话都会产生一个新的对象,对象存在于session中
Clobal session :全局的session ,一般会用在集群中
注解开发
spring 常用注解
在spring中使用注解,我们必须在applicationContext.xml 文件中加入
在这里插入图片描述
让spring中常用的一些注解生效
在这里插入图片描述
完成bean注册操作
在这里插入图片描述
在spring 2.5后为@Component添加了三个衍生的注解
在这里插入图片描述
属性依赖
简单的注入
在这里插入图片描述
复杂的属性注入
在这里插入图片描述
@Value @Autowired可以修饰属性,也可以修饰setter方法,如果写在属性上,就不需要提供setter方法
@Autowired它默认是根据类型进行注入,如果与@Qualifier一起使用,就可以根据名称来进行注入,也可以使用@Resource来根据名称进行属性注入
在这里插入图片描述
在这里插入图片描述
xml开发和注解开发的优势?

xml开发维护起来方便,但是配置比较繁琐,代码量大
注解开发维护困难,维护需要改源代码,工作量大,方便快捷开发
**Spring Aop编程 **
1Aop 概述
Aop是面向切面编程
AOP 是OOP的延续,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
利用Aop 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
spring 2.0 之后整合Aspect 第三方Aop 技术,Aspectl 是一个面向切面的框架,它扩展了Java 语言。
主要功能和意图
主要功能
日志记录,性能统计,安全控制,事务处理,异常处理等
主要意图
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。
Aop 和OOP 的区别
OOP (面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,获得更加清晰高效的逻辑单元划分
而Aop 则是针对业务处理中的切面进行提取,它所面对的是处理过程中的某个步骤或者阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异
换而言之,OOP、Aop 一个是面向名词领域,一个是面向动词领域
Aop 的相关术语
目标对象(target)
指的是需要被增加的对象,由于spring aop 是通过代理模式实现,从而这个对象永远是被代理对象
连接点(join porint)
所谓连接点是指那些被拦截到的点,在spring 中这些点值得是方法,因为spring 只支持方法类型的连接点
切入点(pointcut)
表示一组joint point ,这些joint point 或是通过逻辑关系组合起来,或者通过通配,正则表达式等方式集中起来,它定义相应的Advice 将要发生的地方
简单来说切入点是指我们要对那些连接点进行拦截的定义
通知(advice)
所谓通知是拦截到接入点之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
advice 定义了在pointcut 里面定义的程序点具体要做的操作
引介(introduction)
引介是一种特殊的通知,在不被修改类代码的前提下,introduction 可以在运行期为类动态的添加一些方法或者属性
切面(aspect)
是切入点和通知的结合
织入(weaving)
织入是一个过程,是将切面应用到目标对象从而创建出Aop 代理对象的过程,织入可以在编译期,类转载期,运行期进行
spring 采用动态织入,而aspectj 采用静态织入
代理(Proxy)
一个类被Aop 织入增强后,就产生一个结果代理类
画图解释一下相关术语在这里插入图片描述Aop底层实现
Aop 分为静态Aop 和动态Aop 。静态Aop 是指Aspectj实现的Aop,他是将切面代码直接编译到
Java类文件中。动态Aop 是指将切面代码进行动态织入实现Aop

Spring 的Aop 为动态Aop,实现的技术为Jdk 提供动态代理技术和CGLIB(动态字节码技术)
Jdk 和Cglib 代理区别
Jdk动态代理
在运行,在JVM内部动态生成class 字节码对象(class对象)
jdk 动态代理只针对对于接口操作
第一个参数:目标类的类加载器对象
第二个参数:目标类的实现接口的class[]
第三个参数:InvocationHandler 它是一个接口,它的左右是代理实例的调用处理程序,实现的接口
定义一个方法
接口
在这里插入图片描述
实现类
在这里插入图片描述

代理对象
在这里插入图片描述
测试类
在这里插入图片描述CGLIB动态代理
jdk动态代理只可以为接口去完成操作,而cglib 它可以为没有实现接口的类去做代理
也可以实现接口的类去做代理
在这里插入图片描述
在这里插入图片描述

传统的Aop 开发
在传统的spring aop 开发中它支持的有5种
前置通知,目标方法执行前(MethodbeforeAdvice)
后置通知 ,目标方法执行后增强(AfterReturningAdvice)
环绕通知,目标方法执行前后增强(MethodInterceptor)
异常抛出通知,目标方法抛出异常后增强(ThrowsAdvice)
引介通知,在目标类中添加一些新的方法或者属性(IntroductionInterceptor)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
基于aspectj 的Aop 开发

AspectJ 框架的通知类型有6种:
前置通知Before ,相当于BeforeAdvice
后置通知AfterReturning,相当于AfterReturningAdvice
环绕通知Around ,相当于MethodInterceptor
异常抛出通知AfterThrowing,相当于ThrowAdvice
引介通知DeclareParents,相当于IntroductionInterceptor
最终通知After,不管是否异常,该通知都会执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**** <aop:aspect > 和<aop:advisor > 区别****
在这里插入图片描述
只能配置一个,只能实现通知的接口
在这里插入图片描述可以写多个不用实现接口只需要写方法就可以了

方法里的参数可以获取拦截的目标方法等。。。
切入点表达式
在开发中使用的比较多的是execution语法,关于execution语法常用的:
execution(public * ()) 所有的public 的方法
execution(
com.dw.aop.(…)) 所有aop 包下的所有类的方法(不包含子包)
execution(
com.dw.aop…*(…)) 所有aop 包下的所有类的方法(包含子包)
execution(com.dw.aop.IOrderSService.(…)) IOrderSService.接口所有类的方法
execution(save(…))区配所有的以save 开头的方法
Spring JDBCTemplate
Spring 提供看一个Jdbc 模板可以用来操作数据库
配置spring 内置的连接池DriverManagerDataSourc
在这里插入图片描述
测试类
在这里插入图片描述
使用c3p0 连接池
在这里插入图片描述
外部文件
在这里插入图片描述
外部文件可以用${}来获取
JdbcTemplate CRUD增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)

**只需要使用JdbcTemplate的update方法就可以执行insert update delete操作
**
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行select 操作
简单数据返回
在这里插入图片描述
复杂数据返回

在这里插入图片描述
RowMapper它有一个实现类叫BeanPropertyRowMapper如果使用BeanPropertyRowmapper,实体类必须提供一个无参数的public构造方法,类中的bean属性名称与表中的列要对应
在这里插入图片描述
Spring 事务管理
什么是事务?
将一系列操作当作一个完整的工作单元,要么成功,要么失败,就是事务
事务的特性?
ACID
原子性:不可分割的最小单元,是一个整体
持久性:事务一创建对数据的改变是永久性的
一致性:数据能够保持一致
隔离性:一个事务与另一个事务不能相互调用,互相干扰
如果没有隔离性会出现什么问题?
对读数据来说:
脏读:一个事务读取到另一个事务提交的数据
幻读/虚读 :一个事务读取到另一个事务,insert 的数据,导致事务
多次读取的数据不一致
不可重复读:一个事务读取到另一个事务 update 的数据,导致事务多次读取的数据不一致

对数据产生的问题:
数据不能够正常更新
隔离性的隔离级别
read uncommited 读未提交,不能解决任何问题
Replated read 重复读,解决了脏读的问题,但是幻读和不可重复读有可能发生
read commited 读已提交,解决了不可重读的问题,但是脏读、幻读有可能发生
Serilizable 序列化,能够解决所有读的问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 9 一、 什么是IOC、DI 9 二、 编辑xml文件时,没有提示 9 三、 注入型(Injecting dependencies) 9 (一) setter注入型Setter Injection 9 (二) 构造方法Constructor Injection 10 四、 id、name 11 五、 简单属性的注入 11 六、 Bean的作用范围scope 12 七、 集合注入 12 八、 自动装配autowire 13 (一) byName 13 (二) byType 14 (三) 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:annotation方式Spring 16 一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope、@PostConstruct、@PreDestroy 19 六、 注解对应的jar包 19 第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ库 22 (三) AOP的annotation实例 22 (四) AspectJ的专业术语 23 (五) 织入点语法 23 (六) Advice 24 (七) Pointcut 26 (八) annotatin方式的AOP实例 26 二、 AOP配置xml方式 27 三、 AOP实现动态代理注意 28 第九课:DataSource 28 一、 Sping配置数据源: 28 二、 注入使用 29 三、 dbcp.BasicDataSource 29 第十课 Spring整合Hiberante3 30 一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的jar包 31 (三) 搭建日志环境并配置显示DDL语句jar包 31 三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步: 首先整合Spring + Hibernate 41 三、 第三步:再来整合Struts2 41 四、 struts的读常量: 43 第十二课:DTO、VO 43 一、 DTO 43 二、 VO 43 第十二课:SSH整合存在的问题 43 一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值