Spring入门概括

1.BeanDefinition

Beandefinition表示Bean定义;Spring根据Beandefinition来创建Bean;BeanDefinition有很多属性用来描述Bean;BeanDefinition是Spring中非常核心的感念;

BeanDefinition中的重要属性:
beanClass:表示一个bean的类型,比如UserService.class.spring在创建备案的过程中会根据此属性来实例化得到对象;
scope:表示一个bean的作用域,singleton表示该bean为一个单列bean,prototype表示该bean是一个原型bean;
isLazy:表示该bean是一个懒加载,原型bean的isLazy属性不起作用,懒加载的单利bean,会在第一次getBean的时候生成该bean,非懒加载的单列bean,会在spring启动过程中直接生成好;
dependsOn:表示一个bean在创建之前,它所依赖的bean得先全部创建好;
primary:表示一个bean是主bean,在spring中一个bean可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在则直接将bean注入属性;
initMethodName:表示一个bean的初始化方法,一个bean的生命周期中有一个步骤叫初始化,spring会在这个步骤中去调用bean的初始化方法,初始化逻辑可以自定加工;

平时用到的@Compponent,@Bean,标签,都会解析为BeanDefinition对象;

2.BeanFactory

BeanFactory是一种"Spring容器",是Bean的工厂,它可以用来创建Bean,获取Bean,BeanFactory是Spring中非常核心的主件;

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

BeanFactory的核心子接口和实现类:
1.ListableBeanFactory
2.ConfigurableBeanFactory
3.AutowireCapableBeanFactory
4.AbstractBeanFactory
5.(最重要)DefaultListableBeanFactory:支持单列bean,支持bean别名,支持父子BeanFactory,支持bean类型转换,支持bean后置处理,支持FactoryBean,支持自动装配等等;

3.Bean的生命周期

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

Bean的生命周期:
1.定义Bean:DeanDefinition表示Bean定义,它定义了某个bean类型,spring就是利用BeanDefinition来创建Bean,比如需要利用BeanDefinition中beanClass属性确定bean的类型,从而实例化出来对象;
2.构造方法推断:一个bean可以有多个构造方法,此时就需要spring来判断到底使用哪个构造方法.通过构造方法推断之后确定一个构造方法,就可以利用构造方法实例化得到一个对象;
3.实例化:通过构造方法反射得到一个实例化对象,在spring中,可以通过BeanPostProcessor机制对实例化进行干预;
4.属性填充:实例化得到的对象并不是完成的对象,不完整的意思是对象中某些属性还没有进行属性填充,属性填充就是自动注入,依赖注入;
5.初始化:在一个对象的属性填充后,spring提供了初始化机制,我们可以利用初始化机制对bean进行自定义加工,比如可以利用InitializingBean接口来对bean中的其他属性进行赋值,或对bean中的某些属性进行填充;
6.生产代理对象:初始化后是bean创建生命周期中最后的一个步骤,我们常说的AOP机制就是在这个步骤中通过BeanPostProcessor机制实现的,初始化后得到的对象才是真正的bean对象;

4.@Autowired

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

@Autowired加载某个属性上,spring在进行bean的生命周期过程中,在属性填充这一步骤,会基于实例化出来的对象,对该对象中加了@Autowired的属性自动赋值;
Spring会现根据属性的类型去Spring容器中找出该类型的所有bean对象,如果有多高,再根据名字从中找出对应名字的bean;

@Autowired注解写在方法上时,spring在bean的属性填充阶段,会根据方法的参数类型,参数名字从spring容器中找到对象当中方法入参,自动反射调用该方法;

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

5.@Resource

@Resource注解与@Autowired类似,用来进行依赖注入的,@Resource是java层面所提供的注解,@Autowired是spring所提供的注解,它们依赖注入的底层逻辑也不同;

@Resource有name属性,如果name属性有值,那么spring会直接根据所指定的那么值去spring容器中找该名字的bean对象进行注入,如果没找到则报错;
如果name属性没有值,和@Autowired一样先根据类型去spring容器找bean,没找到再根据类型去找;

6.@Value

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

@Value(“aaa”):直接将字符串"aaa"赋值给属性,如果属性类型不是String,或无法进行类型转换则报错;
@Value(" ( a a a ) " ) : 将 会 把 (aaa)"):将会把 (aaa)"):{}中的字符串当中key,从Properties文件中找出对应的value赋值给属性,如果没找到,会把"aaa"当做普通字符串注入给属性;
@Value("#{aaa}"):会将#{}中的字符串当中spring表达式进行解析,spring会把"aaa"当中beanName,并从spring容器中找对应bean,如果找到则进行属性注入,如果没找到则报错;

7.FactoryBean

FactoryBean是spring所提供的一种比较灵活的床bean的方式,可以通过实现FactoryBean接口中的getObject方法来返回一个对象,这个对象就是最终的bean对象;

FactoryBean接口中的方法:
1.Object getObject():返回的是bean对象
2.boolean isSingleton():返回的是否是单列bean对象
3.Class getObjectType():返回的是bean对象的类型

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

8.ApplicationContext

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

ApplicationContext所继承的接口:
1.EnvironmentCapable:继承该接口表示用于了获取环境变量的功能,可以通过ApplicationContext获取操作系统环境变量和jvm环境变量;
2.ListableBeanFactory:继承该接口就拥有了获取beanNames,判断某个beanName是否存在beanDefinition对象,统计BeanDefinition个数,获取某个类型对应的所有beanNames等功能;
3.HierarchicalBeanFactory:继承了该接口就拥有了获取父BeanFactory,判断某个name是否存在bean对象的功能;
4.MessageSource:继承了该接口就拥有了国际化功能,比如可以直接利用MessageSource对象获取某个国际化资源(不同国家语言所对应的字符);
5.ApplicationEventPublisher:继承了该接口,就拥有了事件发表功能,这是ApplicationContext相较于BeanFactory比较突出的,常用的功能;
6.ResourcePatternResolver:继承了该接口,就拥有了加载资源的功能,可以是文件,图片等某个URL资源;

9. BeanPostProcessor

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

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

BeanPostProcessor中的方法:
1.postProcessorBeforeInitialization():初始化方法前,表示可以利用该方法来对Bean在初始化前进行自定义加工;
2.postProcessorAfterInitialization():初始化后方法,表示可以利用这个方法来对Bean初始化后进行自定加工;

InstantiationAwareBeanPostProcessor是BeanPostProcessor的一个子接口,方法有
1.:postProcessorBeforeInstantiation():实例化前
2.postProcessorAfterInstantiation():实例化后
3.postProcessorProperties():属性注入后

10.AOP

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

AOP中的核心概念:
1.Advice:可以理解为通知,建议,在spring中通过定义Advice来定义代理逻辑;
2.Pointcut:表示Advice对应的代理逻辑应用在哪个类,哪个方法上;
3.Advisor:等于Advice+Pointcat,表示代理逻辑和切点的一个整体,我们可以通过定义或封装一个Advisor来定义切点和代理逻辑;
4.Weaving:表示织入,将Advice代理逻辑在源代码级别嵌入到切点的过程就叫织入;
5.Target:表示目标对象,也就是被代理对象,在AOP生成的代理对象中会只有目标对象;
6.JoinPoint:表示连接点,在spring AOP中就是表示方法的执行点;

AOP工作原理:
AOP是发生在Bean生命周期过程中
1.spring生成bean对象时,先实例化出来一个对象,也就是target对象;
2.再对target对象进行属性填充;
3.在初始化后步骤中,会判断对应的对象有没有切面;
4.如果有切面,就表示该target对象需要进行AOP;
5.通过cglib或者jdk动态代理机制生成一个代理对象,作为最终的bean对象
6.代理对象中有个target属性指向了target对象;

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值