什么是spring框架?
Spring框架是一个容器,它是整合其他框架的框架,核心是aop(面向切面)和ioc(控制反转)
面向接口编程:类中的成员变量设计为接口,方法中的参数设计为接口,方法的返回值设计为接口,调用的时候接口指向实现类。使用接口,就是面向灵活,项目的可扩展性,维护性极高,借口不关心实现类的类型,切换实现类就切换了整个功能
Ioc:指将传统上直接由程序代码操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是将对象的控制权转移,由程序代码转移到了外部容器,由容器实现对象的创建,赋值和依赖的管理。【是一个概念,是一种思想,由spring容器进行对对象的创建和依赖注入,程序员在使用的时候可以直接取出来使用。】
目前ioc比较流行的实现方式的依赖注入 DI(Dependency Injection),依赖注入指的是程序运行过程中,如果需要用到另外一个对象时,外部容器会创建好并传递给程序。
正转和反转:
Spring根据代码的功能特点,使用ioc降低业务对象之间的耦合度,使用aop让系统服务得到最大的复用
将公共的重复的通用的代码提取出来单独开发,需要的时候反织回去,就是面向切面编程,底层原理是动态代理。切面集中开发,谁用切面谁拿过去
上下文:对你当前做的事提供的支持都是上下文。
Spring容器是一个超级大工厂,负责创建管理所有的java对象,这些java对象又称为bean。Spring容器管理着容器中bean之间的依赖关系,通过依赖注入方式。
Spring项目创建:创建一个空项目然后修改pom文件,修改文件目录
Spring创建对象:
赋值:【
】
附:
基于xml的IOC:
- 创建对象:<bean id = “sss” class=”com.example.pojo.Student”></bean>
- 给创建的对象赋值:
- 使用setter注入、
注入分为简单型注入和引用型注入(上面)
简单型注入使用value属性
引用型注入使用ref属性
使用setter注入必须提供提供无参构造方法和setXXX()方法。
- 使用构造方法注入(下面)
- 使用构造方法的参数名称进行注入值
(上面的实体类中没有get和set方法,里面只有一个全参的构造方法和一个toString方法)
(name1是构造方法中的值(构造方法中参数的名称),而不是成员变量中的值)
- 使用构造方法参数的下标注入值
- 使用构造方法默认的参数顺序注入值
Spring会接管三层架构中哪些对象的创建?
非spring接管下的三层架构项目的构建:
Spring框架接管后的项目:
从下往上进行修改项目,数据访问层->业务逻辑层->界面层
每次对象创建完之后都去看有没有要被注入的属性,点进那个实现类里面,看有没有成员变量,有就注入,没有就不用。
基于注解的IOC: 也称为DI(Dependency Injection),它是IOC的具体实现的技术。
基于注解的IOC,必须要在Spring的核心配置文件中添加包扫描
药:创建对象并依赖注入
汤: xml ----> 注解(annotation)
- 创建对象的注解
@Component:可以创建任意对象,创建的对象的名称默认是类名的驼峰命名法,也可以指定@Component(“名字”)
@Controller:专门用来创建控制器的对象(三层架构中的servlet),用来接收用户的请求,返回处理结果给客户端
@Service:专门用来创建业务逻辑层的对象,负责向下访问 数据访问层,返回处理毕的结果给界面层
@Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查所有操作
- 依赖注入的注解
- 简单类型的注入(8种基本类型+String):
@Value:用来给简单类型注入值
- 引用类型的注入
@Autowired:使用类型注入值,从整个Bean工厂中搜索同源类型的对象进行注入(只有同源类型才可以注入)
什么是同源类型:
- 被注入的类型(Student中的school)与注入的类型是完全相同的类型【第28集】
- 被注入的类型(Student中的school 父)与注入的类型(子)是父子类【第29集】
- 被注入的类型(Student中的schoo 接口l)与注入的类型(实现类)是接口和实现类的类型
注意:在有父子类的情况下,使用按类型注入,就意味着有多个可注入的对象,此时按照名称进行二次筛选,选中与被注入对象相同名称的对象进行注入。
@Autowired + @Qualifier(“名称”):使用名称注入值,从整个Bean工厂中搜索相同名称的对象进行注入(第30集,31集)
注意:如果有父子类的情况下,直接按名称进行注入值。
添加包扫描的方式:
Spring配置文件的拆分:按层拆分;按功能拆分….
Spring配置文件的整合:
- 基于xml的:
- 基于注解的
基于xml的引用类型的自动注入(第38集)
面向切面编程AOP(第39集开始):
静态代理
多切面的测试
Jdk1.8中default 默认实现,不强制实现
动态代理:
Spring支持的AOP的编程,常用的有以下几种:
Spring原生AOP代码实现案例:
AspectJ框架:
事务:
然后在业务逻辑层添加注解:
发生算数异常不回滚:
Spring的两种事务处理方式:
- 注解式的事务:
使用@Transactional注解,可以在类上,也可以在方法上
- 声明式事务:
在配置文件中添加一次,整个项目遵循事务的设定
第五个:使用数据库默认的隔离级别 isolation = Isolation.DEFAULT
为什么要添加事务管理器:
事务的传播特性:存在多个事务之间的