【Spring】Bean

BeanDefinition:表示Bean定义

Spring根据BeanDefinition来创建Bean对象,BeanDefinition有很多属性用来描述Bean,是spring中非常核心的概念
BeanDefinition的属性
beanClass:标识bean的类型
scope:表示类的作用域
scope等于singleton表示该bean是一个单例bean
scope等于prototype标识该bean是一个原形bean
isLazy:表示一个bean是不是需要懒加载,原形bean的isLazy属性不起作用,
懒加载的单例bean会在第一次getBean的时候生成该bean
非懒加载的单例bean,会在Spring启动过程中直接生成好

dependsOn:表示一个bean在创建之前依赖的其它bean
在一个bean创建之前,它所依赖的这些bean需要先全部创建好
primary
initMethodName

@Component、@Bean、(bean标签):这些都会被解析成BeanDefinition对象

BeanFactory

BeanFactory是一种Spring容器,可以用来创建Bean、获取Bean,是Spring中非常核心的组件

BeanFactory、BeanDefinition和Bean对象之间的关系
BeanFactory利用BeanDefinition生成Bean对象,BeanDefinition相当于BeanFactory的原材料,Bean对象相当于BeanFactory生产出来的产品

BeanFactory的核心子接口和实现类
ListableBeanFactory
ConfigurableBeanFactory
AutowiireCapableBeanFActory
AbstractBeanFactory
DefaultListableBeanFactory(最重要的):支持单例Bean、支持Bean别名、支持父子BeanFactory、支持Bean类型自动化、支持Bean后置处理、支持FactoryBean、支持自动装配等

Bean生命周期

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

Bean声明周期的核心步骤

1、BeanDefinition Bean定义
2、构造方法推断 -选出一个构造方法
3、实例化 - 构造方法反射得到对象
4、属性填充 - 给属性进行自动填充
5、初始化 - 对其他属性赋值、校验
6、初始化后 - AOP生成代理对象

@AutoWired注解

表示某个属性是否需要进行依赖注入,可以卸载属性和方法上。注解中的required默认为true,表示如果没有对象可以注入给属性则抛出异常
@Autowired加在对象的属性上
如果一个对象的属性加了@Autowired注解,Spring进行Bean的声明周期过程中的属性填充这一步骤,
会基于实例化出来的对象对该对象中加了@Autowired的属性自动赋值

@Autowired加在方法上

Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器找到对象当做方法入参,自动反射调用该方法

@Autowired加在构造方法上

@Autowired加在构造方法上,Spring会在推断构造方法阶段,选择该构造方法来进行实例化,在反射调用构造方法之前,会先根据构造方法参数类型、 参数名从Spring容器中找到Bean对象,当做构造方法入参

@Resource注解

@Resource注解与@Autowired类型,也是用来依赖注入的,@Resource是java层面提供的注解,@Autowired是Spring所提供的注解,它们依赖注入的底层实现逻辑不同。
@Resource注解的name属性
针对@Resource注解中name属性是否有值,@Resource的依赖注入底层流程也不同
@Resource注解中name属性有值
Spring会直接根据所指定的name值去Spring容器找Bean对象,找到则成功,没有找到则报错。
@Resource注解中name属性没有值
1、先判断该属性名字在Spring容器中是否存在Bean对象
2、存在,成功找到Bean对象进行注入
3、不存在,根据属性类型去Spring容器找Bean对象,找到一个则进行注入
@Value注解
@Value注解也是对属性进行依赖注入的,是用来从Properties文件中获取值的,也可以解析SpEL(Spring表达式)
@Value注解的三种用法
@Value(“liu”):直接将字符串“liu”赋值给属性,如果属性不是String类型,无法进行类型转换,则报错
@Value(" l i u " ) : 会 把 {liu}"):会把 liu"){}中的字符串当做key去配置文件中找出对应的value 复制给属性,如果没有找到会把“${liu}”当做普通字符串注入给属性
@Value("#{liu}"):会将#{}中的字符串当做Spring表达式进行解析,Spring会把“liu”当做beanName,并从Spring容器中找到对象Bean,如果找到则进行属性注入,没找到则报错

FactoryBean

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

FactoryBean接口中的方法

Object getObject(): 返回的是Bean对象
boolean isSingleton() : 返回是否是单例对象
Class getObjectType() :返回Bean对象的类型

FactoryBean和BeanFactory的区别

区别:
FactoryBean对象本身也是一个Bean,同时它相当于一个小型工厂,可以生产出另外的Bean
BeanFactory是一个Spring容器,是一个大型工厂,可以生产出各种各样的Bean
应用:
FactoryBean机制被广泛的应用在Spring内部和Spring与第三方框架或组件的整合过程中

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继承了这个接口就拥有了国际化功能
ApplicationEventPublisher
ApplicationContext继承了这个接口就拥有了事件发布功能,可以发布事件,是ApplicationContext相对于BeanFactory比较突出常用的功能
ResourcePatternResolver
ApplicationContext继承了这个接口就拥有了加载并获取资源的功能,这里的资源可以是文件、图片等
BeanPostProcessor
BeanPostProcessor是Spring所提供的一种扩展机制,可以利用该机制对Bean进行定制化加工,在Spring底层源码实现中,广泛用到了该机制,BeanPostProcessor通常也叫做Bean后置处理器

AOP

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

AOP核心概念

Advice:可以理解为通知、建议,在Spring中通过定Advice来定义代理逻辑
Pointcut:切点,标识Advice对应的代理逻辑应用在哪个类、那个方法上
Advisor:等于Advice+Pointcut,表示代理逻辑和切点的一个整体,程序员可以通过定义或封装一个Advisor,来定义切点和代理逻辑
WeAVing:织入,将Advice代理逻辑在源代码级别嵌入到切点的过程就叫做织入。
Target:目标对象,即被代理对象,在AOP生成的代理对象汇总会持有目标对象
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对象

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值