首页 > 编程语言 >Spring理解及源码框架

Spring理解及源码框架

时间:2023-04-28 14:06:28浏览次数:31  
标签:var1 String 框架 Spring Object 代理 Class 源码 throws


1、容器与Bean

容器理解

Spring理解及源码框架_学习


从这张图能看到

重要容器有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理解及源码框架_代理类_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理解及源码框架_spring_03


标签:var1,String,框架,Spring,Object,代理,Class,源码,throws
From: https://blog.51cto.com/u_14604401/6233996

相关文章

  • Unknown run configuration type SpringBootApplicationConfigurationType;Servlet Ser
    UnknownrunconfigurationtypeSpringBootApplicationConfigurationType社区版的idea自己安装插件,去配置大家可分享关于Java微服务相关知识,包括但不限于Java微服务开发经验、架构组成、技术交流、中间件等内容,我们鼓励springcloud架构为基础发散出击,从而达到技术积累的目的,快来沉......
  • Mybatis总体框架设计
    Mybatis架构概览Mybatis架构整体设计如下:接口层和数据库交互的方式Mybatis和数据库的交互方式有两种使用传统的MyBatis提供的API;使用Mapper接口使用传统的MyBatis提供的API这是传统的传递StatementId和查询参数给SqlSession对象,使用SqlSession对象完成和数据库的交......
  • graalvm spring 打包成exe
    graalvmjdk下载https://www.graalvm.org/downloads/把graalvm加入环境变量和就是JAVA_HOME安装native-imagegu.cmdinstallnative-image问题:Error:Defaultnative-compilerexecutable'cl.exe'notfoundviaenvironmentvariablePATHError:Topreventnative-too......
  • 详解八大排序(附动图和源码)
    目录......
  • 如何实现Spring中服务关闭时对象销毁执行代码
    spring提供了两种方式用于实现对象销毁时去执行操作1.实现DisposableBean接口的destroy2.在bean类的方法上增加@PreDestroy方法,那么这个方法会在DisposableBean.destory方法前触发3.实现SmartLifecycle接口的stop方法packagecom.wyf.service;importorg.springframework.be......
  • java jar 没有主清单属性_Spring Boot jar中没有主清单属性的解决方法「建议收藏」
    javajar没有主清单属性_SpringBootjar中没有主清单属性的解决方法「建议收藏」原文链接:https://cloud.tencent.com/developer/article/2133065大家好,又见面了,我是你们的朋友全栈君。使用SpringBoot微服务搭建框架,在eclipse和Idea下能正常运行,但是在打成jar包部署或者直接......
  • Spring 3.x MVC 入门1 -- 图解MVC整体流程
    Springmvc的生命周期开始使用springmvc之前,我们必须需要了解下SPRINGMVC的流程,如下图: 在看下图之前的一些说明:(下面介绍的HandlerMapping,HandlerAdapter,HandlerExceptionResovler,ViewResolver都有个order属性,因为这些接口每一个都可以注册多个实现,order代表他们的执行顺序......
  • solrj integration with Spring
    ThefirstoneisEmbeddedSolrServer,soIdonotneedtostartmystandalonesolrserver,Icanrunthejunittests.Thepom.xmlareasfollow:<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</arti......
  • 【Visual Leak Detector】核心源码剖析(VLD 1.0)
    说明使用VLD内存泄漏检测工具辅助开发时整理的学习笔记。本篇对VLD1.0源码做内存泄漏检测的思路进行剖析。同系列文章目录可见《内存泄漏检测工具》目录目录说明1.源码获取2.源码文件概览3.源码剖析3.1注册自定义AllocHook函数3.2存储调用堆栈信息3.3生成泄漏检测......
  • Semaphore源码分析
    1、Semaphore介绍计数信号量-Semaphore,常用来限制访问资源的线程数量。优点类似限流中的令牌桶算法,只有拿到信号量的线程才能执行,与令牌桶算法未拿到令牌不处理请求不同的是,在Semaphore中未拿到信号量的线程会阻塞等待,直到有某个线程释放了持有的信号量。2、Semaphore使用......