# spring **Repository Path**: wu_guan_jun/spring ## Basic Information - **Project Name**: spring - **Description**: spring入门 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-03-14 - **Last Updated**: 2023-07-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring #### 介绍 spring入门 #### 什么是Spring框架
它是一个容器,它是整合其它框架的框架,它的核心是Ioc和Aop,它由20多个模块构成,它在很多领域都
都提供优秀的解决方案。之后还会学springmvc,springboot等。
Spring的主要作用是:解耦合,对象和对象(模块和模块)之间不使用代码关联,而是通过配置来说明,即在spring 中说明对象关系。

Spring的特点:

(1)轻量级:由20多个模块构成,每一个jar包都很小,小于1M,核心包也就3M左右,对代码无污染

(2)面向接口编程:使用接口,就是面向灵活,项目的可扩展性,可维护性都极高,接口不用关心实现类的类型 使用时接口指向实现类,切换实现类就是切换功能

(3)AOP面向切面编程:就是将公共的,通用的,重复的代码单独开发,在需要的时候反织回去,底层的原理是动态代理

(4)整合其他框架:它整合后是其他框架更易用
#### 什么是IoC 控制反转IoC是一种概念,是一种思想。由Spring容器进行对象的创建和管理,程序员在使用时直接取出使用。
正转:由程序员进行对象的创建和管理,程序员说了算,比如:

Student stu = new Student();

stu.setName=("张三");

stu.setAge=("张三");

反转:由spring容器进行创建和管理对象
#### spring常用注解 切记:基于注解的IoC,必须要在Spring的核心配置文件添加包扫描
创建对象的注解:

@Component:可以创建任意对象,创建对象的名称默认是对象的驼峰命名,也可以指定对象的名称@Component("指定名称")

@Controller:专门用来创建控制器的对象(Servlet),这种对象可以接收用户的请求,可以返回处理结果给客户端。

@Service:专门用来创建业务逻辑层的对象,负责向下访问数据层,向上将处理完毕的结果返回给界面层

@Repository:专门用来创建数据层的对象,负责数据库中的增删改查所有操作

创建对象的注解:

值类型的注入:

@Value:专门给简单类型注入值

引用类型的注入:

@Autowired:使用类型注入值,从整个Bean工厂中搜索同源类型的对象进行注入

@Autowired @Qualifier:使用名称注入值,从整个Bean工厂中搜索相同的名称的对象进行注入

什么是同源类型:

a.被注入的类型(Student中的school)与注入的类型是完全相同的类型

b.被注入的类型(Student中的school)与注入的类型子类,父子类

b.被注入的类型(Student中的school)与注入的类型是继承关系
#### 什么是AOP
AOP面向切面编程

切面:公共的,通用的,重复的功能称为切面,面向切面编程就是将切面提取出来,单独开发,在需要调用的方法中通过动态代理的方式进行植入


#### 什么是AspectJ框架
AspectJ是一个优秀的面向切面的框架,它扩展了java语言,提供了强大的切面实现。因为它是基于java语言开发,所以无缝扩展

AspectJ常用的通知类型

前置通知@Before

后置通知@AfterReturning

环绕通知@Around

最终通知@After

定义切入点@Pointcut

AspectJ的切入点表达式:

规范的公式

execution(访问权限 方法返回值 方法声明(参数) 异常类型)

简化后的公式

execution( 方法返回值 方法声明(参数))
例:
execution(public * *(..)):任意的公共方法

execution(* set*(..)):任意一个以“set”开始的方法

execution(* com.jun.service.impl.*.*(..)):任意的返回值类型,在com.jun.service.impl包下的任意类的任意方法的任意参数

execution(* com.jun.service..*.*(..)):任意的返回值类型,在com.jun.service包下的任意类的任意方法的任意参数

execution(* ..service.*.*(..)):service之前可以有任意的子包

execution(* *.service.*.*(..)):service之前只有一个子包
#### Spring的两种事务处理方式
(1)注解式的事务

使用@Transactional注解完成事务控制,此注解可添加到类上,对类中所有方法执行事务的设定,此注解可以添加到方法上,只对方法执行事务的处理

(2)声明式事务(必须掌握),在配置文件中添加一次,整个项目遵循事务的设定

要求项目中的方法命名有规范

完成增加操作包含:add ,save ,insert ,set

更新操作包含:update ,change,modify

删除操作包含:delete ,drop,remove ,clear

查询操作包含:select ,find,search ,get

Spring中事务的五大隔离级别

1.未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

2.提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

3.可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读

4.串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

5.数据库默认的隔离级别isolation = Isolation.DEFAULT;oracle默认的隔离级别是读已提交