0
点赞
收藏
分享

微信扫一扫

Spring理解及源码框架


1、容器与Bean

容器理解

Spring理解及源码框架_java


从这张图能看到

重要容器有BeanFactory

ConfigurableApplicationContext

它们的关系是ConfigurableApplicationContext间接继承了ApplicationContext
然后间接继承了BeanFactory

BeanFactory从侧面看到Spring有在用工厂模式。
除此之外spring还用了单例模式、动态代理模式(aop)等等

那么

什么是BeanFactory

他是ApplicationContext父接口,也就是ApplicationContext是BeanFactory的孙子
它是核心容器,ApplicationContext是实现功能

ConfigurableApplicationContext.getBean(“sdffds”)
这个方法实际在用BeanFactory方法

BeanFactory主要包括哪些方法
常用的其实是getBean containsBean isSingleton

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

主要看它的实现类
包括实现了控制反转、基本注解注入、直至Bean的生命周期

Bean的生命周期

实例化 Instantiation

属性赋值 Populate

初始化 Initialization

销毁 Destruction

Spring理解及源码框架_ide_02

Spring:简单、高效、成熟框架
微服务:独立运行生产级别
反应性:异步、解耦,通常用mq中间件。
云服务:所有平台,都支持连接和扩展服务
网络应用:快速、安全和响应式Web应用
无服务器:灵活
事件驱动:与企业集成,实时处理流数据
自动化任务:一次离线处理数据

特征
核心技术:依赖注入、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP。

测试:模拟对象、TestContext 框架、Spring MVC 测试、WebTestClient.

数据访问:事务、DAO 支持、JDBC、ORM、编组 XML。

Spring MVC和 Spring WebFlux Web 框架。

集成:远程处理、JMS、JCA、JMX、电子邮件、任务、调度、缓存。

语言:Kotlin、Groovy、动态语言。

2、AOP

主要实现了动态代理的功能,是面向切面编程的思路升级。

在OOP中我们以类为基本单位,而在aop中基本单元是Aspect

使用@Aspect注解的类就是切面。

有哪些类型的通知
@Before
@After Returning
@After Throwing
@After
@Around

aop有哪些实现方式?
静态代理
使用aop框架提供的命令进行编译,从而在编译的时候生成aop代理类
1、编译时编织
2、类加载时编织
动态代理
在运行时内存中临时生成aop动态代理类,也称为运行时增强
1、jdk动态代理
代理对象和目标对象是兄弟关系,都实现了Foo接口,代理对象类型不能强转成目标对象类型;
目标类定义的时候可以加final修饰。
2、CGLIB

1 MethodInterceptor的intercept()方法的第2个参数是method,可以通过反射对目标方法进行调用

Object result = method.invoke(target, args); // 用方法反射调用目标

2 第4个参数proxy,可以不用反射就能对目标方法进行调用;

Object result = proxy.invoke(target, args); // 需要传目标类 (spring用的是这种)
// 或者
Object result = proxy.invokeSuper(obj, args); // 不需要目标类,需要代理自己

3 代理类不需要实现接口;
4 代理对象和目标对象是父子关系,代理类继承于目标类;

5 目标类定义的时候不能加final修饰,否则代理类就无法继承目标类了,会报java.lang.IllegalArgumentException: Cannot subclass final class top.jacktgq.proxy.cglib.Target异常;

6 目标类方法定义的时候不能加final修饰,否则代理类继承目标类以后就不能重写目标类的方法了。

3、总结:spring

执行流程

spring的执行流程:

前提:做容器刷新准备工作

1、设置容器的启动时间

2、设置活跃状态为true

3、设置关闭状态为false

4、获取environment对象,并加载当前系统属性值到environement

对象中

5、准备监听器和事件的集合对象,默认为空集合

Spring理解及源码框架_学习_03


举报

相关推荐

0 条评论