栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring

文章目录
  • 一 Spring
    • 1 Spring体系
      • 1.1 Springframework
      • 1.2 Spring生态
    • 2 Spring容器
      • 2.1 BeanFactory
      • 2.2 ApplicationContext
      • 2.3 总结
  • 二 IOC
    • 1 面向对象类间关系
    • 2 IOC 控制反转
    • 3 DI 依赖注入
  • 三 AOP
    • 1 代理模式
      • 1.1 静态代理
      • 1.2 动态代理
      • 1.3 CGLIB代理
    • 2 面向切面
      • 2.1 AOP术语
      • 2.2 AOP三要素
    • 3 AOP实现
      • 3.1 ProxyFactoryBean
      • 3.2 AspectJ
    • 4 事务管理
      • 4.1 Spring JDBC Template
      • 4.2 Spring 事务管理
      • 4.3 Spring 声明式事务
  • 四 Bean管理
    • 1 Bean配置
      • 1.1 Bean作用域
      • 1.2 Bean生命周期
    • 2 Bean实例化
      • 2.1 Spring工厂实例化
      • 2.2 自定义工厂实例化
    • 3 Bean装配注入
      • 3.1 getBean
      • 3.2 配置文件
      • 3.3 注解装配
      • 3.5 自动装配
      • 3.6 Java Config 装配
      • 3.7 装配总结
  • 五 后记

一 Spring

以 IOC AOP为核心的贯穿表现层,业务层,持久层的一站式开源框架

1 Spring体系 1.1 Springframework

1.2 Spring生态

2 Spring容器 2.1 BeanFactory

管理Bean的工厂

BeanFactory xxx = newXmlBeanFactory(new FileSystemResource("C:/xxx-config.xml"));
2.2 ApplicationContext

BeanFactory子接口

  1. xml
ApplicationContext xxx = new ClassPathXmlApplicationContext("xxx-config.xml");//相对路径
ApplicationContext xxx = new FileSystemXmlApplicationContext("xxx-config.xml");//绝对路径
  1. web

	classpath:xxx/applicationContext.xml


	org.springframework.web.context.ContextLoaderlistener

2.3 总结

BeanFactory对比ApplicationContext

BeanFactoryApplicationContext
初始化不检查初始化检查
占资源小占资源多
二 IOC
1 面向对象类间关系
类间关系意义体现
继承/实现is-aextend/implements
关联/聚合/组合has-axxx=new xxx()
依赖use-axxx.use.xxx()
2 IOC 控制反转

控制反转 : 依赖对象的获得权 (控制权) 被反转
控制反转 : 将控制权从单个Bean交给Bean工厂( 容器 )

解耦目的: 我只是用这个对象(依赖这个对象), 不想和他产生关联(has-a)关系.

3 DI 依赖注入

IOC的实现方式: DI

为了一坛醋,做的一顿饺子

声明即用, 不用关联不用new啦

三 AOP
1 代理模式

1.1 静态代理

自己用接口/父类实现

1.2 动态代理

Spring 默认 : 用接口

用JDK提供的Proxy类, 在内存中动态的用接口实现

1.3 CGLIB代理

Spring Boot 默认 : 用父类

用CGLIB提供的类, 在内存中动态的用父类实现

特点 : 不会产生接口类型转换异常, 不能是final类

2 面向切面

面向谁就是关注谁

切面 : 指增强的方法, 与业务无关, 可独立运行
面向切面 : 关注切面这种独立运行功能的开发

2.1 AOP术语
AOP术语含义说明
Aspect切面增强功能日志,事务
Joinpoint连接点某类中的业务方法一个方法,被增强
Pointcut切入点多个连接点的集合多个方法,被增强
Advice通知 / 增强处理切面/增强 功能执行的时间方法前?方法后…
Target Object目标对象方法被通知的对象被增强的对象
Proxy代理被动态创建的类
Weaving织入将切面代码插入目标对象的过程
2.2 AOP三要素
AOP三要素术语
(1) 切面功能Aspect
(2) 切面位置Joinpoint
(3) 切面执行时间Advice

3 AOP实现 3.1 ProxyFactoryBean

MyAspect.java (切面类)

//MethodInterceptor : 环绕通知

class MyAspect implements MethodInterceptor{
	@Override
	public Objext invoke(MethodInvocation m) throws Throwable{
		before();
		Object o = m.proceed();
		after();
		return o;
	}

	void before(){}
	void after(){}
}

applicationContext.xml

1.目标类 (连接点)


2.切面类 (切面)


3.织入 (通知)

	1.指定连接点接口
	
	2.指定连接点
	
	3.指定切面+通知
	
	4.指定代理方式: JDK动态代理/CGLIB代理
	

Main.java

xxx=application.getBean("proxy");//ref=""
  1. ProxyFactoryBean属性
属性名含义
proxyTargetClass代理要实现的接口, 多个用 ...
target代理目标对象
interceptorNames需要织入的切面Advice
proxyTargetClasstrue为CGLIB代理
singleton单例, 默认true
optimizetrue强制用CGLIB
  1. 通知类型
通知类型实现接口用处
环绕通知MethodInterceptor日志事务
前置通知MethodBeforeAdvice权限
后置通知AfterReturningAdvice关闭流
异常通知ThrowsAdvice处理异常
引介通知introductionInterceptor新增方法

3.2 AspectJ

切面(XML/注解) + 切入点(切入点表达式) + 通知(XML/注解)

  1. AspectJ核心

(1) 切入点表达式

excution( [访问修饰符] [返回值类型] [全路径] [方法名] (参数列表) [throws异常])

注 : 切入点 = 连接点+连接点…

(2) 通知执行顺序

  1. XML声明式

(1) 配置切面

属性含义
id标识
ref切面的Bean

(2) 配置切入点

属性含义
id切入点Bean的标识
expression切入点表达式

(3) 配置通知

属性含义
pointcut指定一个切入点表达式
pointcut-ref指定一个切入点表达式id
method切面Bean的方法增强
throwiing对有效
returning对有效

切面类.java

class MyAspect{
	1.前置通知
	void before(){}
	2.后置通知
	void after(){}
	
	3.环绕通知: 
		(1)必须是Object类型返回
		(2)必须接收一个参数,类型为JoinPoint,表示执行目标方法
		(3)必须throws Throwable
	void Object around(ProceedingJoinPoint p)throws Throwable{
		//前
		Object o = p.proceed();
		//后

		return o;
	}

	4.异常通知
	void throwing(JoinPoint j, Throwable e){}
	5.最终通知
	void After(){}
}

applicationContex.xml

1.目标类

2.切面

3.AOP

	(1) 配置切面
	
		(2)配置切入点 + (3) 切入点表达式
		
		(4)通知类型
		
		//前置通知
		
		//后置通知
		
		//环绕通知
		
		//抛出通知
		
		//最终通知
		
			
	


  1. 注解声明式
类型注解含义用处
切面@Aspect定义一个切面放类上
切入点@Poincut定义一个切入点表达式放类中
通知类型 :放方法上
前置通知@Before最前面
环绕通知@Around前置通知后, 最终通知后
最终通知@After必执行
抛出通知@AfterThrowing抛出异常后执行
后置通知@AfterReturning最后执行
引介通知@DeclareParents向目标类添加新方法/属性

切面类.java

@Aspect
@Component
class MyAspect{
	1.切入点表达式
	@Pointcut("execution(* com.*.*(..))")
	
	2.切入点:
	void x(){}

	3.通知
	//前置通知 
	@Before("x()")
	void before(){}
	//后置通知
	@AfterReturning("x()")
	//环绕通知
	@Around("x()")
	Object around(ProceedingJoinPoint p){
		环绕1
		Object o = p.proceed();
		环绕2
		return o;
	}
	//异常通知
	void throwing(Throwable e){}
	//最终通知
	@After("x()")
	void After(){}
}

applicationContxt.xml



4 事务管理

Spring默认用ProxyFactoryBean管理事务

4.1 Spring JDBC Template

1.xml

(1)配置数据源

	
	
	
		

(2)配置JDBC模板

	

(3)配置注入类

	

xxxDaoImpl.java

class xxxDaoImpl{
	jdbcTemplate j = applicationContext.getBean("jdbcTemplate");
	j.execute("sql语句")
}

4.2 Spring 事务管理
  1. 事务管理接口
接口方法作用
PlatformTransactionManager管理事务
(1)TransactionStatus getTransaction()获取事务状态信息
(2)void commit()提交事务
(3)void rollback()回滚事务
TransactionDefinition定义事务规则
(1)String getName()获取事务名称
(2)int getIslationLevel()获取事务隔离级别
(3)int getPropagationBehavior()获取事务传播行为
(4)int getTimeout()获取事务超时时间
(5)boolean isReadonly()获取事务是否只读
TransactionStatus获取事务状态信息
(1)void flush()刷新事务
(2)boolean hasSavepoint()获取是否存在保存点
(3)boolean isCompleted()获取事务是否完成
(4)boolean isNewTransacation()获取是否是新事务
(5)boolean isRollbackonly()获取是否回滚
(6)void setRollbackonly()设置事务回滚
  1. 事务传播行为

同一方法中, 不同操作前后所使用的事务 ,控制是否/如何创建事务

注: 查询一般不用事务

属性名作用
PROPAGATION_REUIREDREUIRED有就用,没就开
PROPAGATION_SUPPORTSSUPPORTS有就用,没就没
PROPAGATION_MANDATORYMANDATORY
PROPAGATION_REUIRES_NEWREUIRES_NEW永远开新的事务
PROPAGATION_NOT_SUPPORTEDNOT_SUPPORTED
PROPAGATION_NEVERNEVER
PROPAGATION_NESTEDNESTED
  1. 事务管理方式
  1. 事务特性 - ACID
特性含义
A 原子性SQL执行时, 都成都不成Atomicity
C 一致性SQL执行后, 数据库完整性与之前无破环 (前后一致)Consistency
I 隔离性事务运行时, 事务与事务之间隔离 (四个隔离级别)Isolation
D 持久性事务结束后, 提交数据永久的Durability
  1. Spring 事务回滚时间
Thorwable回滚
运行时异常空指针…
编译时异常受查异常:IO,SQL
ERROR
4.3 Spring 声明式事务
  1. XML声明式事务
属性名称内容
name通配符*
propagation默认REUIRED
isolation默认DEFAULT
read-only默认false, 事务是否只读
timeout默认 -1 , 永不超时
rollback-for触发回滚的异常类, 逗号分隔
no-rollback-for不触发回滚的异常类, 逗号分隔

(1) 事务隔离级别
注: DEFAULT与数据库设置保持一致

DEFAULTREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLESERIALIZABLE
脏读读未提交
不可重复读读一行
幻读读多行
默认读未提交读已提交可重复读 (行锁)串行化 (表锁)

(2) 事务并发问题

不可重复读:
指同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集 (一行)

幻读:
指同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集 (多行)

xxxDao.java

void a();

xxxDaoImpl.java

jdbcTemplate j;
void a(){
	this.j.update();
}

applicationContext.xml

1.事务管理器

	

2.编写通知:对事务进行增强(通知),编写切入点

	
		
	

3.AOP

	
	将切入点与通知整合
	

  1. 注解声明式事务

注: @Transaction相当于

注解属性作用
@Transactional类/方法需要使用事务的Bean
value事务管理器: 默认为"", 别名为transactionManager
transactionManager事务管理器: 默认为"", 别名为value
isolation事务隔离级别: 默认为Isolation.DEFAULT
noRollbackFor指定不回滚异常
noRollbackForClassName指定多个不回滚异常
propagation事务传播行为: 默认Propagation.REUIRED
read-only指定事务是否只读, 默认false
rollbackFor遇异常回滚
rollbackForClassName遇多个异常回滚
timeout超时时间, 默认底层事务系统默认时间

xxxDao.java

void a();

xxxDaoImpl.java

jdbcTemplate j;

@Transactional(propagation=Propagation.REUIRED,isolation=Isolation.DEFAULT,readOnly=false)
void a(){
	this.j.update();
}

applicationContext.xml


四 Bean管理
1 Bean配置

	

		构造注入
		
		
		
		set注入
		
		
		 
		
		
			
				xxx
			
			
			
				xxx
			
	
			
				
 				
			
			
		
		
	

1.1 Bean作用域
分类作用域
singleton单例
prototype原型
request一次请求
session一次会话
globalSession全局会话
application每一个 SerletContext : ApplicationContext
websocket每一个 websocket : ApplicationContext
1.2 Bean生命周期

Bean生命周期

2 Bean实例化 2.1 Spring工厂实例化

注册Bean 即用


2.2 自定义工厂实例化
  1. 静态工厂实例化

注册工厂+声明方法 即用

class MyFactory{
	static Bean xxx(){
		return new Bean();
	}
}

Main.java

方式1:
Bean bean02 = applicationContext.getBean("bean02");

方式2:

	

...

  1. 实例工厂实例化

注册工厂+实例工厂+声明方法 即用

class MyFactory{
	Bean xxx(){
		return new Bean();
	}
}


Main.java

方式1:
Bean bean03 = applicationContext.getBean("bean03");

方式2:

	

...

3 Bean装配注入 3.1 getBean

applicationContext.xml


Main.java

Object o = applicationContext.getBean("xxx")
3.2 配置文件
  1. 构造方法

Main.java

class Main{
	private xxx x;
}

applicationContext.xml




	

  1. set()方法

Main.java

class Main{
	private xxx x;
}

applicationContext.xml




	

3.3 注解装配

不用ref+不用XML声明(context:componet-san base-package="")

  1. 声明
注解作用xml
@Component组件
@RepositoryDAO层
@ServiceService层
@ControllerController层
  1. 注入
注解作用xml
@Autowried类型装配
@Qualifier用名装配
@Resource(name=“xxx”,type="")自选装配(默认用名)
  1. 自动扫描
3.5 自动装配

不用ref+不用注解

autowire属性

属性值作用
default由上一级beans确定
byName根据属性名装配
byType根据属性类型装配
constructor根据构造函数参数类型装配
no用ref=""装配
3.6 Java Config 装配

不用ref+不用声明+自动查错

3.7 装配总结
XML装配注解装配自动装配JavaConfig装配
ref=" "
XML声明
注解√+自动查错
五 后记

多态是什么?
多态就是你看到这个问题的时候, "多态"这两个字想到很多种解释, 这就是多态!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298667.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号