文章目录

  • 前言
    • BeanDefinition
      • 什么是BeanDefinition
      • BeanDefinition中重要的属性
    • BeanFactory
      • 什么是BeanFactory
      • BeanDefinition、BeanFactory、Bean对象之间的关系
      • BeanFactory的核心子接口和实现类
        • DefaultListableBeanFactory的功能
    • Bean的生命周期
      • 什么是Bean生命周期
      • Bean周期中的核心步骤
    • @Autowired
      • @Autowired是什么
      • @Autowired的工作流程
        • @Autowired加在某个属性上
        • @Autowired加在某个方法上
        • @Autowired加在构造方法方法上
    • @Resource
      • @Resource是什么
      • @Resource的工作流程
    • @Value
      • @Value是什么
      • @Value的工作流程
    • FactoryBean
      • FactoryBean是什么
      • FactoryBean接口中的方法
      • FactoryBean的特殊点
    • FactoryBean与BeanFactory的区别
      • FactoryBean
      • BeanFactory
    • ApplicationContext
      • ApplicationContext是什么
      • ApplicationContext所继承的接口
    • BeanPostProcessor
      • BeanPostProcessor是什么
      • BeanPostProcessor中的方法
      • InstantiationAwareBeanPostProcessor
    • AOP
      • AOP是什么
      • AOP中的核心概念
      • AOP的工作原理
  • 总结

前言

深入学习Spring。


提示:以下是本篇文章正文内容。

BeanDefinition

什么是BeanDefinition

  1. BeanDefinition表示Bean定义
  2. Spring根据BeanDefinition来创建Bean对象
  3. BeanDefinition有很多的属性用来描述Bean
  4. BeanDefinition是Spring中非常核心的概念

BeanDefinition中重要的属性

  1. beanclass

    表示一个bean的类型,比如:UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象
    
  2. scope

    表示一个bean的作用域,比如:
    如果scope等于singleton,那么该bean就是一个单例Bean;
    如果scope等于prototype,那么该bean就是一个原型Bean。
    
  3. isLazy

    表示一个bean是否需要懒加载,原型bean的isLazy属性不起作用,懒加载的单例bean,会在第一次getBean的时候生成该bean,非懒加载的单例bean,则会在Spring启动过程中直接生成
    
  4. dependsOn

    表示一个bean在创建之前所依赖的其他bean,在一个bean创建之前,它所依赖的这些bean得先全部创建好
    
  5. primary

    表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入的时候,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性
    
  6. initMethodName

    表示一个bean的初始化方法,一个bean的生命周期过程中有一个步骤叫做初始化,Spring会在这个步骤中去调用bean的初始化方法,初始化逻辑由程序员自己控制,表示程序员可以自定义逻辑对bean进行加工
    

BeanFactory

什么是BeanFactory

BeanFactory是一种"Spring容器",
BeanFactory翻译过来就是Bean工厂,
顾名思义,它是可以用来创建Bean、获取Bean,
BeanFactory是Spring中非常核心的组件。

BeanDefinition、BeanFactory、Bean对象之间的关系

  1. BeanFactory将利用BeanDefinition来生成Bean对象
  2. BeanDefinition相当于BeanFactory的原材料
  3. Bean对象就相当于BeanFactory所生产出来的产品

BeanFactory的核心子接口和实现类

  1. ListableBeanFactory
  2. ConfigurationBeanFactory
  3. AutoWireCapableBeanFactory
  4. AbstractBeanFactory
  5. DefaultListableBeanFactory

DefaultListableBeanFactory的功能

  • 支持单例Bean
  • 支持Bean别名
  • 支持父子BeanFactory
  • 支持Bean类型转化
  • 支持Bean后置
  • 支持FactoryBean
  • 支持自动装配
  • 等等

Bean的生命周期

什么是Bean生命周期

Bean生命周期描述的是Spring中一个Bean创建过程和销毁过程中所经历的步骤,其中Bean创建过程是重点。
程序员可以利用Bean生命周期机制对Bean进行自定义加工

Bean周期中的核心步骤

  1. BeanDefinition对象创建

    BeanDefinition表示Bean定义,它定义了某个Bean的类型,Spring就是利用BeanDefinition来创建Bean的,比如需要利用BeanDefinition中BeanClass属性确定Bean类型,从而实例化出来对象。
    
  2. 构造方法推断

    一个Bean中可以有多个构造方法,此时就需要Spring来判断到底使用哪个构造方法,如果一个类只有一个构造方法,那没的选择,只能用这个构造方法,如果一个类有多个构造方法,首先会判断是否有@Autowired指定构造方法,再看是否有无参构造方法。如果都没有就会报错 No default constructor found。通过构造方法推断之后确定一个构造方法后,就可以利用构造方法实例化得到一个对象了。
    
  3. 实例化

    通过构造方法反射得到一个实例化对象,在Spring中,可以通过BeanPostProcessor机制对实例化进行干预
    
  4. 属性填充

    实例化所得到的对象,是“不完整”的对象,“不完整”的意思是该对象中的某些属性还没有进行属性填充,也就是Spring还没有自动给某些属性赋值,属性填充也就是我们通常所说的自动注入,依赖注入。
    
  5. 初始化

    在一个对象的属性填充之后,Spring提供了初始化机制,程序员可以利用初始化机制对的Bean进行自定义加工,比如可以利用InitialzingBean接口来对Bean中的其他属性进行赋值,或对Bean中的某些属性进行校验
    
  6. 初始化后

    初始化后是Bean创建生命周期中最后一个步骤,我们常说的AOP机制,就是在这个步骤中通过BeanPostProcessor机制实现的,初始化之后得到的对象才是真正的Bean对象。
    

@Autowired

@Autowired是什么

@Autowired表示某个属性是否需要进行依赖注入,可以写在属性和方法上。注解中的required属性默认为true,表示如果没有对象可以注入给属性则抛出异常。

@Autowired的工作流程

完整的底层筛选逻辑步骤是更多的,不仅仅只有这两步

@Autowired加在某个属性上

@Service
public class OrderService{@Autowiredprivate UserService userService;
}
@Autowired加在某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了@Autowired的属性自动给属性赋值。
Spring会根据属性的类型去Spring容器中找出该类型所有的Bean对象,如果找出来多个,则再根据属性的名字从多个中再确定一个。如果required属性为true,并且根据属性信息找不到对象,则直接抛出异常

@Autowired加在某个方法上

@Service
public class OrderService{private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
}
当@Autowired注解写在某个方法上时,Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名称从Spring容器找到对象当做方法入参,自动反射调用该方法。

@Autowired加在构造方法方法上

@Service
public class OrderService{private UserService userService;@Autowiredpublic OrderService(UserService userService) {this.userService = userService;}public OrderService(UserService userService, UserService userService) {this.userService = userService;}
}
@Autowired加在构造方法上时,Spring会在推断构造方法阶段,选择该构造方法进行实例化,在反射调用构造方法之前,会先根据构造方法参数类型,参数名从Spring容器中找到Bean对象,当做构造方法入参。

@Resource

@Resource是什么

@Resource注解与@Autowired类似,也是用来用来进行依赖注入的,@Resource是Java层面所提供的注解,@Autowired是Spring所提供的注解,它们依赖注入的底层实现逻辑也不同。

@Resource的工作流程

@Resource注解中有一个name属性,针对name属性是否有值,@Resource的依赖注入底层流程是不同的

@Resource如果name属性有值,那么Spring会直接根据所指定的name值去Spring容器找Bean对象,如果找到了则成功,如果没有找到,则报错

@Resource如果name属性没有值

  1. 先判断该属性名字在Spring容器中是否存在Bean对象。
  2. 如果存在,则成功找到Bean对象进行注入。
  3. 如果不存在,则根据属性类型去Spring容器找Bean对象,找到一个则进行注入。

@Value

@Value是什么

@Value注解和@Resource、@Autowired类似,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中来获取值的,并且@Value可以解析SpEl(Spring表达式)。

@Value的工作流程

@Value(“cq”)

直接将字符串"cq"赋值给属性,如果属性类型不是String,或无法进行类型转化,则报错。

@Value("${cq}")

将会把${}中的字符串当做key,从Properties文件中找出对应的value赋值给属性,如果没找到,则会把"${cq}"当做普通字符串注入给属性

@Value("#{cq}")

会将#{}中的字符串当做Spring表达式进行解析,Spring会把"cq"当做beanName,并从Spring容器中找对应bean,如果找到则进行属性注入,没找到则报错。

FactoryBean

FactoryBean是什么

FactoryBean是Spring所提供的一种较灵活的创建Bean的方式,可以通过实现FactoryBean接口中的getObject()方法来返回一个对象,这个对象就是最终的Bean对象。

FactoryBean接口中的方法

  1. Object getObject():返回的是Bean对象

  2. boolean isSingleton():判断返回的是否为单例Bean对象

  3. Class getObjectType():返回的是Bean对象的类型

FactoryBean的特殊点

@Component("cq")
public class CqFactoryBean implements FactoryBean{@Override// Bean对象public Object getObject() throws Exception {return new User();}@Override// Bean对象的类型public Class<?> getObjectType() {return User.class;}@Override// 所定义的Bean是单例还是原型public boolean isSingleton() {return true;}
}

上述代码,实际上对应了两个Bean对象:

  1. beanName为"cq",bean对象为getObject方法所返回的User对象。
  2. beanName为"&cq",bean对象为CqFactoryBean类实例对象。

FactoryBean与BeanFactory的区别

FactoryBean

FactoryBean对象本身也是一个Bean,同时它相当于一个小型工厂,可以生产出另外的Bean。

BeanFactory

BeanFactory是一个Spring容器,是一个大型工厂,它可以生产出各种各样的Bean。

ApplicationContext

ApplicationContext是什么

ApplicationContext是比BeanFactory更加强大的Spring容器,它既可以创建bean、获取bean,还支持国际化、事件广播、获取资源等BeanFactory不具备的功能。

ApplicationContext所继承的接口

  • EnvironmentCapable

    ApplicationContext继承了这个接口,表示拥有了获取环境变量的功能,可以通过ApplicationContext获取操作系统环境变量和JVM环境变量。
    
  • ListableBeanFactory

    ApplicationContext继承了这个接口,就拥有了获取所有beanNames、判断某个beanName是否存在beanDefinition对象、统计BeanDefinition个数、获取某个类型对应的所有beanNames等功能。
    
  • HierarchicalBeanFactory

    ApplicationContext继承了这个接口,就拥有了获取父BeanFactory、判断某个name是否存在bean对象的功能。
    
  • MessageSource

    ApplicationContext继承了这个接口,就拥有了国际化功能,比如可以直接利用MessageSource对象获取某个国际化资源(比如不同国家语言所对应的字符)
    
  • ApplicationEventPublisher

    ApplicationContext继承了这个接口,就拥有了事件发布功能,可以发布事件,这是ApplicationContext相对于BeanFactory比较突出、常用的功能。
    
  • ResourcePatternResolver

    ApplicationContext继承了这个接口,就拥有了加载并获取资源的功能,这里的资源可以是文件,图片等某个URL资源都可以。
    

BeanPostProcessor

BeanPostProcessor是什么

BeanPostProcessor是Spring所提供的一种扩展机制,可以利用该机制对Bean进行定制化加工,在Spring底层源码实现中,也广泛的用到了该机制,BeanPostProcessor通常也叫做Bean后置处理器。

BeanPostProcessor在Spring中是- -个接口,我们定义- -个后置处理器,就是提供- -个类实现该接口,在Spring中还存在一些接口继承了BeanPostProcessor,这些子接口是在BeanPostProcessor的基础.上增加了一些其他的功能。

BeanPostProcessor中的方法

  1. postProcessBeforelnitialization():初始化前方法,表示可以利用这个方法来对Bean在初始化前进行自定义加工。
  2. postProcessAfterlnitialization():初始化后方法,表示可以利用这个方法来对Bean在初始化后进行自定义加工。

InstantiationAwareBeanPostProcessor

BeanPostProcessor的一个子接口

  • postProcessBeforeInstantiation():实例化前
  • postProcessAfterInstantiation():实例化后
  • postProcessProperties():属性注入后

AOP

AOP是什么

AOP就是面向切面编程,是一种非常适合在无需修改业务代码的前提下,对某个或某些业务增加统一的功能,比如日志记录、权限控制、事务管理等,能很好的使得代码解耦,提高开发效率。

AOP中的核心概念

  1. Advice

    Advice可以理解为通知、建议,在Spring中通过定义Advice来定义代理逻辑。

  2. Pointcut

​ Pointcut是切点,表示Advice对应的代理逻辑应用在哪个类、哪个方法上。

  1. Advisor

    Advisor等于Advice+Pointcut,表示代理逻辑和切点的一个整体,程序员可以通过定义或封装个Advisor, 来定义切点和代理逻辑。

  2. Weaving

    Weaving表示织入,将Advice代理逻辑在源代码级别嵌入到切点的过程,就叫做织入。

  3. Target

    Target表示目标对象,也就是被代理对象,在AOP生成的代理对象中会持有目标对象。

  4. Join Point

    Join Point表示连接点,在Spring AOP中,就是方法的执行点。

AOP的工作原理

AOP是发生在Bean的生命周期过程中的

  1. Spring生成bean对象时,先实例化出来个对象,也就是target对象
  2. 再对target对象进行属性填充
  3. 在初始化后步骤中,会判断target对象有没有对应的切面
  4. 如果有切面,就表示当前target对象需要进行AOP
  5. 通过Cglib或JDK动态代理机制生成-个代理对象,作为最终的bean对象
  6. 代理对象中有一-个target属性指向了target对象

总结

提示:这里对文章进行总结:
对Spring的Bean还有一些注解进行了一些理解和说明

深入学习Spring(理论知识部分)相关推荐

  1. 【SQL】以mysql为例系统学习DQL理论知识

    [SQL]以mysql为例系统学习DQL理论知识 1.思维导图-知识体系 2.数据库相关操作-查询 2.1.单一select简单查询 2.2.复杂数据库查询(重点) 2.3.单一select的SQL语 ...

  2. 机器人专业需要学习那些理论知识

    专业与产业 我认为,机器人是一门应用性比较强的专业,如果脱离应用背景,那么就不容易理解和把握机器人的发展.所以我开篇先不谈"专业"而要谈"产业","专 ...

  3. 机器人专业需要学习什么理论知识

    专业与产业 我开篇先不谈"专业"而要谈"产业","专业"和"产业"一字之差,它们有什么关系呢? 社会上一旦有技术上的需求 ...

  4. 学习AlphaGo理论知识-----part two

    Mastering the game of Go without human knowledge 郑重声明:原文参见标题,文章来源转载,如有侵权,请联系CSDN发布者smartgridequation ...

  5. 【强化学习】理论知识整理汇总

    前言 本篇旨在总结强化学习相关术语,主要参考了邹伟等人所著的<强化学习>(清华大学出版社)这本书. 策略 在状态s下执行动作a的概率. π(a∣s)=P(At=a∣St=s)\pi(a \ ...

  6. 强化学习1--基础知识(个人笔记)

    目录 Deep Reinforcement Learning, 深度强化学习的理论知识 什么是强化学习 为什么使用强化学习 强化学习的基本要素 On-policy和Off-policy Online和 ...

  7. 开咖啡店最重要的是什么?这些理论知识你需要掌握

    开咖啡店最重要的是什么? 随着创业热潮的掀起,开咖啡店成为目前备受关注的投资行业,许多有商业眼光的投资者都认为咖啡店是一个拥有广阔发展空间的致富行业.而如何成功的投资一家咖啡店,也是目前许多创业者所关 ...

  8. 实用的it知识学习_怎样能更快更好的学习好书法?分享一些比较实用的理论知识...

    如何能更快更高效的学习书法?首先了解一些书法理论知识是很有必要的!它能让你在学习书法的过程中不至于迷茫 !能助你更快学好书法! 一.书论在实践中产生 我们大部分人都觉得学习书法可以没有理论,但不可无技 ...

  9. FFmpeg学习(音视频理论知识)

    文章目录 1. 音视频理论知识 1.1 基本概念 1.1.1 音视频必备的基本概念 常用的视频封装格式 常用的视频编码器 常用的音频编程器: 视频流 裸数据YUV 1.1.2 音视频常见处理 采集 处 ...

最新文章

  1. 内含福利 | 世界人工智能大会:对话大咖,深挖机器学习的商业应用
  2. ASP.NET MVC 2 模型验证
  3. 7.5 TableLayout布局详解
  4. 在线html转ipa,iphone在线安装 ipa 应用:利用 itms-services 协议实现 iOS 应用程序在线安装功能...
  5. Android动态加载插件APK
  6. MULE ESB中custom,flows,connectors等的使用方法
  7. nodejs和ionic小助手
  8. Scanner类+Random
  9. 牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊
  10. 【渝粤题库】陕西师范大学400013 组织行为学 作业(专升本)
  11. LeetCode 1656. 设计有序流(数组)
  12. 大数据之-Hadoop之HDFS_HDFS产生背景以及定义---大数据之hadoop工作笔记0048
  13. python矩阵行秩函数_矩阵的秩的性质以及矩阵运算和矩阵的秩的关系
  14. ArcMap通过空间校正工具转换BJ-54坐标系到WGS-84坐标系
  15. 微信小程序tabBar图标大小64 * 64
  16. 真无线蓝牙耳机哪款好?国内真无线蓝牙耳机排行榜10强!
  17. 360木马查杀后mysql数据不能启动
  18. ubuntu开机桌面不显示
  19. 目标检测各类数据集格式互转以及处理方法(VOC, COCO, txt)
  20. 我想不通,MySQL 为什么使用 B+ 树来作索引?

热门文章

  1. 跨碧岭观赏龙潭瀑布群
  2. 使用余弦相似度计算文本相似度
  3. rss技术为blog带来什么?
  4. html中 readonly和disabled的区别
  5. 【全网最细PAT题解】【PAT乙】1044 火星数字(测试点2,测试点4详细解释)
  6. 机器学习——科学数据包(九)注释、文字、Tex公式、工具栏、区域填充、形状、样式、极坐标
  7. 猴群选猴王(约瑟夫问题)详解
  8. 全国一等奖!华师车神是他们!
  9. mycat mysql 性能测试_mycat读写分离性能测试
  10. 深度学习基础--不同网络种类--反馈深度网络(feed-back deep networks, FBDN)