spring底层原理初探

简介: spring底层原理初探

一,spring原理初探

1,bean的创建生命周期

userService.class --> 推断构造方法 --> 实例化对象 --> 依赖注入(属性填充) --> 初始化前(@PostConstruct) --> 初始化 (Initializingbean) --> 初始化后(AOP,bean的后置处理器) --> 代理对象 --> 存入到这个单例池Map里面 -->bean


1.1,获取上下文的方式

//通过注解的方式获取这个上下文,在这个类上面需要添加一个@ComponentScan("")
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//通过xml的方式获取这个上下文
ClassPathXMlConfigApplicationContext xc = new ClassPathXMlConfigApplicationContext(spring.xml);

从spring容器里面获取对象。

//单例对象需要存放在单例池里面,多例的话不需要
 //一级缓存里面获取,以及缓存Map<"userService",UserService>
UserService us = (UserService)ac.getBean("userService");
UserService newUs = new UserService();
UserService us1 = (UserService)ac.getBean("userService");
UserService us2 = (UserService)ac.getBean("userService");

从容器中获取对象和这个new 对象的区别如下:

从容器中获取的对象结果了依赖注入,里面的属性有值,这个new的对象没有

1.2,推断构造方法:

1,如果类里面只有一个构造方法,那么只用那一个


2,如果有多个构造方法,那么就会用默认的无参构造方法


3,如果需要指定用哪一个构造方法,可以在指定的方法上面加一个@Autowared注解。


1.3,实例化Bean

1,通过type类型寻找,遍历以及缓存里面的全部value,判断是不是UserService这个对象实例


2,通过name名字寻找,一级缓存里面寻找,key/value


1.4,属性填充

给里面的属性上面加了注解的变量进行一个属性填充,如@Autowared。就是判断方法里面有没有哪个属性上面有这个注解,如果有,就进行一个属性填充。


f63a27a2ade641c2acacf39603ad0f41.png

1.5,初始化前

会去判断一下这个方法里面,有没有属性加了一个@PostConstruct这个注解。这个方法可以在spring容器初始化的时候就可以进行加载,主要是适用于加载一些需要依赖注入的对象。其调用顺序如下 Constructor ----> @Autowired ----> @PostConstruct

4f165729173241f7839aa047e2f19f35.png


1.6,初始化

会判断对象是否实现这个InitializingBean类


1.7,初始化后

可以通过这个bean的后置处理器,实现这个aop操作。


二,AOP

主要用来加日志,监控,权限等等


2.1,aop的实现原理

spring的aop主要是在bean初始化之后,调用bean的后置处理器来实现。aop主要是通过这个cglib的动态代理实现,就是会通过一个子类去继承这个目标类,然后重写目标类里面的需要代理的方法,最后通过一个target对象,来获取这个之前的目标对象,最后通过这个就行了依赖注入的对象,去调用需要代理的方法


2.2,aop的加载流程

aop依赖与ioc,在生产bean并进行实例化之前,先通过bean的第一个后置处理器找到所有在类上面加@AspectJ这个注解的所有类,并在这个类的里面找到所有的befeore,after等注解的方法,每一个before,after等都会生成一个对应的advisor,每个advisor包括advise和pointcut,advise主要是用来作为一个增强器的使用,pointcut是为了进行匹配,匹配成功才进行最终的动态代理的生成。最后获取到所有的advisors,由于可能有大量的advisor,因此在bean的最后一个后置处理器才对这些所有的advisor进行处理,即在bean进行初始化之后才进行处理。最后会去循环遍历这些advisors,通过advisors里面封装的pointcut和生成的advisor进行比较,如果匹配成功,则说明bean需要创建动态代理。主要是通过责任链的方式实现。


三,spring事务

3.1,事务使用

1,开启事务


//开启事务

//开启事务
@EnableTransactionManagement
//开启动态代理暴露,将动态代理暴露在当前线程
@EnableAspectJAutoProxy//(exposeProxy = true) 
@ComponentScan(basePackages = {"com.zhenghuisheng"}) 

2,配置数据库连接,指定的具体的dataSource,这里可以指定一个jdbcTemplate

@Bean 
public JdbcTemplate jdbcTemplate(DataSource dataSource) { 
    return new JdbcTemplate(dataSource); 
}

3,接下来模拟一个扣减库存的实例

@Autowired
private AccountInfoDao accountInfoDao;
@Autowired
private ProductInfoDao productInfoDao;
public void pay(String accountId, double money) {
  //查询余额
  double blance = accountInfoDao.qryBlanceByUserId(accountId);
  //余额不足正常逻辑
  if(new BigDecimal(blance).compareTo(new BigDecimal(money))<0) {
    throw new RuntimeException("余额不足");
  }
  //更新余额
  int retVal = accountInfoDao.updateAccountBlance(accountId,money);
  //库存-1
  //updateProductStore(1);
  ((PayService)AopContext.currentProxy()).updateProductStore(1);
          System.out.println(1/0);
}
@Transactional(propagation = Propagation.NESTED)
public void updateProductStore(Integer productId) {
  try{
    productInfoDao.updateProductInfo(productId);
  }catch (Exception e) {
        throw new RuntimeException("内部异常");
    }
}

4,采用动态代理的方式实现

通过AutoProxyRegistrar来注册一个bean的后置处理器,来解析切面等信息。


5,aop和事务都需要开启,都会通过bean的后置处理器注册成一个bean定义,最后会判断aop的后置处理器的优先级的大小,最后谁优先级高则会进行覆盖。处理aop的优先级会比事务的优先级高,因此事务会被覆盖

3.2,事务的加载流程

1,@EnableTransactionManagement 注解里面,有一个 @Import(TransactionManagementConfigurationSelector.class),基于importSelector的bean定义


2,import里面会导入完整的类名数组,分别是AutoProxyRegistar.class.getName()和ProxyTransactionManagementConfiguration.class.getName()两个


3,AutoProxyRegistar是基于一个注册bean的import的一个组件,由于处理aop的优先级会比处理事务的优先级高,所以最终处理aop的会将处理事务的覆盖,因此这个也是用于处理事务的一个aop的一个bean的后置处理器


4,ProxyTransactionManagementConfiguration是一个配置类,里面配置了advisor,直接通过配置类直接注册成一个内置的advisor,advisor里面包含一个通知advise和一个切入点pointcut,advise就是用来增强代码的,比如说处理事务,开启事务,回滚事务,提交事务,都在这个advise里面,pointcut负责匹配是否符合创建动态代理,判断方法上面是否有@Transactional,如果有则创建动态代理


5,调用createBean进行实例化,再调用doCreateBean进行属性赋值,再初始化。


6,获取所有的advisors,通过BeanFactoryTransactionAttributeSourceAdvisor来解析事务,根据当前bean的所有方法,找类里面的方法上找有没有Transaction的这个注解,没有的话会往父类或者接口找。如果是接口的话,会调用jdk动态代理,也可以强制加注解使用CGLIB代理


7,对advisors进行匹配,通过调用 ClassFilter 方法进行筛选,进行初筛。


8,精筛,会调用事务的属性源来进行判断,主要判断方法上面有没有 @Transaction 注解


9,可能也会根据接口或者父类来判断是否存在 @Transaction


dvisors进行匹配,通过调用 ClassFilter 方法进行筛选,进行初筛。


8,精筛,会调用事务的属性源来进行判断,主要判断方法上面有没有 @Transaction 注解


9,可能也会根据接口或者父类来判断是否存在 @Transaction

相关文章
|
10天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
22 0
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
3月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
120 0
|
4月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
1月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
130 9
|
1月前
|
XML 前端开发 Java
拼多多1面:聊聊Spring MVC的工作原理!
本文详细剖析了Spring MVC的工作原理,涵盖其架构、工作流程及核心组件。Spring MVC采用MVC设计模式,通过DispatcherServlet、HandlerMapping、Controller和ViewResolver等组件高效处理Web请求。文章还探讨了DispatcherServlet的初始化和请求处理流程,以及HandlerMapping和Controller的角色。通过理解这些核心概念,开发者能更好地构建可维护、可扩展的Web应用。适合面试准备和技术深挖
43 0
|
1月前
|
负载均衡 Java API
Spring Cloud原理详解
Spring Cloud原理详解
73 0
|
1月前
|
负载均衡 Java 网络架构
Spring Cloud原理详解
介绍了Spring Cloud的原理和核心组件,包括服务注册与发现、配置管理、负载均衡、断路器、智能路由、分布式消息传递、分布式追踪和服务熔断等,旨在帮助开发人员快速构建和管理微服务架构中的分布式系统。
58 0
下一篇
无影云桌面