IoC(Inversion of control): 控制反转

IoC:

概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系

核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean

AOP(Aspect-Oriented Programming): 面向方面编程 。

代理的两种方式:

静态代理:

针对每个具体类分别编写代理类。

针对一个接口编写一个代理类。

动态代理:

针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类 。

AOP的主要原理:动态代理 。

Spring工作原理

Spring 已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,

动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射 ,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置 文件来动态的创建对象,和调用对象里的方法的 。

Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过 配置类达到的。

Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明 管理的(Spring根据这些配置 内部通过反射去动态的组装对象)

要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。

Spring里用的最经典的一个设计模式就是:模板方法模式

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

需要的朋友帮忙转发+关注然后私信“Spring”获得完整spring核心原理知识文档的领取方式

目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

Spring 原理

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。

Spring 特点

 

Spring 核心组件

 

Spring 常用模块

 

Spring 主要包

 

Spring 常用注解

bean 注入与装配的的方式有很多种,可以通过 xml,get set 方式,构造函数或者注解等。简单易用的方式就是使用 Spring 的注解了,Spring 提供了大量的注解方式。

 

Spring 第三方结合

 

Spring IOC 原理

Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

Spring 容器高层视图

Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现

 

IOC 容器实现

BeanFactory-框架基础设施

BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用

Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层

的 BeanFactory。

 

Spring APO 原理

横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统 中的各种关注点,将核心关注点和横切关注点分离开来。

AOP 主要应用场景有:

1. Authentication 权限

2. Caching 缓存

3. Context passing 内容传递

4. Error handling 错误处理

5. Lazy loading 懒加载

6. Debugging 调试

7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准

8. Performance optimization 性能优化

9. Persistence 持久化

10. Resource pooling 资源池

11. Synchronization 同步

12. Transactions 事务

OP 核心概念

切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象

横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。

连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

切入点(pointcut):对连接点进行拦截的定义

通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。

目标对象:代理的目标对象

织入(weave):将切面应用到目标对象并导致代理对象创建的过程

引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法

或字段。

参考:https://segmentfault.com/a/1190000007469968

 

AOP 两种代理方式

Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由

AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。

JDK 动态接口代理

1. JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。

InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类

的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建

一个符合某一接口的实例,生成目标类的代理对象。

CGLib 动态代理

2. :CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新的 class。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。

实现原理

@Aspect

public class TransactionDemo {

@Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")

public void point(){

}

@Before(value="point()")

public void before(){

System.out.println("transaction begin");

}

@AfterReturning(value = "point()")

public void after(){

System.out.println("transaction commit");

}

@Around("point()")

public void around(ProceedingJoinPoint joinPoint) throws Throwable{

System.out.println("transaction begin");

joinPoint.proceed();

System.out.println("transaction commit");

}

}

Spring MVC 原理

Spring 的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的,这个 Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。

MVC 流程

 

Spring Boot 原理

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid applicationdevelopment)成为领导者。其特点如下:

1. 创建独立的 Spring 应用程序

2. 嵌入的 Tomcat,无需部署 WAR 文件

3. 简化 Maven 配置

4. 自动配置 Spring

5. 提供生产就绪型功能,如指标,健康检查和外部配置

6. 绝对没有代码生成和对 XML 没有要求配置 [1]

JPA 原理

事务

事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性

( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。

本地事务

紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内。此种事务处理方式不存在对应用服务器的依赖,因而部署灵活却无法支持多数据源的分布式事务。在数据库连接中使用本地事务示例如下:

public void transferAccount() {

Connection conn = null;

Statement stmt = null;

try{

conn = getDataSource().getConnection();

// 将自动提交设置为 false,若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交

conn.setAutoCommit(false);

stmt = conn.createStatement();

// 将 A 账户中的金额减少 500

stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");

// 将 B 账户中的金额增加 500

stmt.execute("update t_account set amount = amount + 500 where account_id = 'B'");

// 提交事务

conn.commit();

// 事务提交:转账的两步操作同时成功

} catch(SQLException sqle){

// 发生异常,回滚在本事务中的操做

conn.rollback();

// 事务回滚:转账的两步操作完全撤销

stmt.close();

conn.close();

}

}

Mybatis 缓存

Mybatis 中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条 SQL。二级缓存是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于 mapper 级别的缓存不同的sqlsession 是可以共享的。

 

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

 

 

以下为25题spring 常见面试问题:

由于细节内容实在太多,所以有些细节没介绍到,需要的朋友帮忙关注然后私信“Spring”获得完整的spring核心原理知识文档的领取方式

什么是 Spring 框架?Spring 框架有哪些主要模块

使用 Spring 框架能带来哪些好处

什么是控制反转(IOC)?什么是依赖注入

请解释下 Spring 框架中的 IoC

BeanFactory 和 ApplicationContext 有什么区别

Spring 有几种配置方式

如何用基于 XML 配置的方式配置 Spring

如何用基于 Java 配置的方式配置 Spring

怎样用注解的方式配置 Spring

请解释 Spring Bean 的生命周期

Spring Bean 的作用域之间有什么区别

什么是 Spring inner beans

Spring 框架中的单例 Beans 是线程安全的么

请举例说明如何在 Spring 中注入一个 Java Collection

如何向 Spring Bean 中注入一个 Java.util.Properties

请解释 Spring Bean 的自动装配

请解释自动装配模式的区别

如何开启基于注解的自动装配

请举例解释@Required 注解

请举例解释@Autowired 注解

请举例说明@Qualifier 注解

构造方法注入和设值注入有什么区别

Spring 框架中有哪些不同类型的事件

FileSystemResource 和 ClassPathResource 有何区别

Spring 框架中都用到了哪些设计模式