Spring 简介
Spring 的核⼼结构
Spring是⼀个分层⾮常清晰并且依赖关系、职责定位⾮常明确的轻量级框架,主要包括⼏个⼤模块:数据处理模块、Web模块、AOP(Aspect Oriented Programming)/Aspects模块、Core Container模块 和 Test 模块。
Spring核⼼容器(Core Container) 容器是Spring框架最核⼼的部分,它管理着Spring应⽤中 bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。 基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核⼼ 容器之上。
⾯向切⾯编程(AOP)/Aspects Spring对⾯向切⾯编程提供了丰富的⽀持。这个模块是Spring应 ⽤系统中开发切⾯的基础,与DI⼀样,AOP可以帮助应⽤对象解耦。
数据访问与集成(Data Access/Integration) Spring的JDBC和DAO模块封装了⼤量样板代码,这样可以使得数据库代码变得简洁,也可以更专 注于我们的业务,还可以避免数据库资源释放失败⽽引起的问题。 另外,Spring AOP为数据访问 提供了事务管理服务,同时Spring还对ORM进⾏了集成,如Hibernate、MyBatis等。该模块由 JDBC、Transactions、ORM、OXM 和 JMS 等模块组成。
核⼼思想
什么是AOP?
AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程(AOP是OOP的延续)
OOP三⼤特征:封装、继承和多态(特点:垂直纵向集成体),缺点:比如说日志的打印的话那么每个方法中都会有冗余代码的出现而且会跟业务逻辑没有解耦。
AOP在解决什么问题
在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
AOP 术语
Spring 实现AOP思想使⽤的是动态代理技术
默认情况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还是CGLIB。当被代理对象没有实现任何接⼝时,Spring会选择CGLIB。当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术。(设置 proxyTargetClass=true强制使⽤Cglib 代理)
Spring的事务传播机制
事务传播机制实际上是使用简单的ThreadLocal实现的
BeanFactory与ApplicationContext区别
BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽ ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能 的。(FactoryBean可以⽣成 某⼀个类型的Bean实例)
spring作用域
单例模式:singleton(单例模式的bean对象⽣命周期与容器相同)
多例模式:prototype(多例模式的bean对象,spring框架只负责创建,不负责销毁,对象长时间不使用会被gc回收)
request:(每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境)
session:(该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例,也就是一次会话)
global-session:(该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例)
DI 依赖注⼊的注解实现⽅式
方式:构造注入,set注入,接口注入(注解的方式)
@Autowired(推荐使⽤spring的)(byType按照类型注入) 也可以配合使用@Qualififier制定名称
@Resource(ByName ⾃动注⼊JDK的)
Spring注解有哪些?
@Controller @RestController @Service @RequestMapping @RequestParam @Cacheable @CacheEvict @Repository @Component @Scope @Lazy
Spring bean 容器生命周期: 创建对象 属性注入 初始化对象 销毁对象
Spring 容器根据配置中的 bean 定义中实例化 bean。
Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
处理Aware接口
如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
如果存在与bean关联的任何BeanPostProcessors,则调用preProcessBeforeInitialization() 方法。
如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调 用它。最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。
如果 bean 实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将 调用它。
spring三级缓存
用来解决spring的循环依赖问题(构造器注入和多例的循环依赖情况下是无法解决的)
一级缓存singletonObjects(ConCurrentHashMap):用于存放完全初始化好的bean直接从该缓存中取出使用
二级缓存earlySingletonObjects(HashMap):提前曝光的单例对象,未填充属性存放在该缓存中,用于解决循环依赖的问题
三级缓存singletonFactories(HashMap):单例对象工厂的缓存,存放bean工厂对象。
spring框架的bean对象是否是线程安全的?
首先单例对象在无状态下是安全的,在有状态下需要通过编码的方式去控制,在原型模式下是线程安全的
什么是springbeans?
Springbeans是那些形成Spring应用的主干的java对象。它们被SpringIOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。
补充:会持续完善,欢迎评论跟指点...