当前位置: 首页 > news >正文

庆阳网站网站建设平面设计师磨刀石

庆阳网站网站建设,平面设计师磨刀石,企业咨询属于什么行业,网站开发工程师工资hangq#x1f384;欢迎来到边境矢梦的csdn博文#x1f384; #x1f384;本文主要梳理手动实现Spring底层机制-问题的引出 #x1f384; #x1f308;我是边境矢梦#xff0c;一个正在为秋招和算法竞赛做准备的学生#x1f308; #x1f386;喜欢的朋友可以关注一下#x1… 欢迎来到边境矢梦°的csdn博文 本文主要梳理手动实现Spring底层机制-问题的引出  我是边境矢梦°一个正在为秋招和算法竞赛做准备的学生 喜欢的朋友可以关注一下下次更新不迷路 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)    目录 底层难点问题的引出 问题的概念解释 BeanDefinition 类加载器和类路径classPath 底层难点问题的引出 1. 底层如何实现依赖 2. 底层如何实现singleton (单例池) 3. 底层如何实现prototype (多例) 4. 底层如何实现IOC容器创建和初始化(之前用反射实现过, 较浅, 继续深入) 5. 底层如何实现getBean() 6. 底层如何实现BeanPostProcessor 7. Spring底层如何实现Bean后置处理器机制 8. 原生Spring底层如何实现AOP 问题的概念解释 spring底层实现依赖注入Dependency InjectionDI的主要机制是通过反射和配置元数据来实现的。依赖注入是Spring框架的核心功能之一它允许开发者将一个Bean所依赖的其他Bean依赖项动态地注入到该Bean中而不需要硬编码这些依赖项。以下是Spring底层如何实现依赖注入的关键步骤 Bean Definition 注册在Spring容器初始化的过程中所有的Bean定义Bean的类名、属性、依赖等信息都会被注册到容器的BeanFactory中。这些Bean定义可以通过XML配置文件、Java注解或Java配置类来定义。 依赖关系定义在Bean定义中可以使用不同的方式来定义Bean之间的依赖关系。最常见的方式是使用构造函数注入Constructor Injection或Setter方法注入Setter Injection。依赖关系可以通过依赖注入的标签或注解来表示。 依赖解析和注入当容器需要创建一个Bean实例时它会检查该Bean的定义以确定它所依赖的其他Bean。容器会自动解析这些依赖关系并尝试实例化或获取依赖的Bean。 依赖注入容器会将依赖项注入到目标Bean中。这可以通过调用目标Bean的构造函数、Setter方法、字段注入等方式来实现具体取决于依赖关系的定义方式。 依赖的生命周期管理Spring容器负责管理依赖项的生命周期。通常依赖项的生命周期与目标Bean的生命周期相匹配。如果依赖项是Singleton作用域的Bean那么它只会被创建一次并在容器启动时初始化如果是Prototype作用域的Bean每次注入都会创建一个新的实例。 可选的AOP代理可选如果Bean被配置为使用AOP面向切面编程容器可能会为该Bean创建一个代理对象并将代理对象注入到依赖中以便在方法调用时应用切面逻辑。 Spring框架实现Singleton模式的核心机制是通过控制Bean的创建和管理来确保在容器中只有一个实例的存在。Spring框架使用了一个叫做BeanFactory的容器来管理对象其中包括了Singleton对象。下面是Spring如何实现Singleton模式的简要说明 容器的生命周期管理Spring容器本身也是一个Singleton对象它负责管理所有的Bean实例。容器的生命周期通常与应用程序的生命周期相匹配。 同步管理Spring通过使用同步机制来确保在多线程环境下Singleton对象的安全创建和访问。这样可以避免并发问题。 懒加载虽然Spring默认在容器启动时就创建Singleton对象但你也可以将Bean的懒加载标志设置为true以延迟对象的创建直到第一次请求。这样可以节省资源只有在需要时才会创建Singleton对象。 Bean的缓存Spring使用一个叫做BeanFactory的容器来管理Bean的实例。在BeanFactory内部Singleton对象会被缓存起来以确保每次请求同一个Bean时都会返回相同的实例。 Bean的创建和初始化Spring容器会根据Bean定义创建实例对象。对于Singleton作用域的Bean容器只会创建一个实例并在容器启动时进行初始化。这个实例会被缓存起来以供后续使用 Bean Definition在Spring配置文件如XML文件或者Java配置类中你需要定义Bean。这个Bean定义包括了Bean的类名、属性、依赖等信息。当Spring容器初始化时它会解析这些Bean定义。 Spring框架底层实现Prototype作用域的Bean时采用了一种不同的机制与Singleton不同。在Prototype作用域下Spring容器不会维护一个单独的缓存每次请求Prototype类型的Bean都会创建一个新的实例。下面是Spring如何实现Prototype模式的简要说明 Bean Definition与Singleton作用域一样你需要在Spring配置文件或Java配置类中定义Bean。Bean定义包括了Bean的类名、属性、依赖等信息。 Bean的创建和初始化当请求一个Prototype作用域的Bean时Spring容器会根据Bean定义创建一个新的实例对象并在需要的情况下进行初始化。每次请求都会触发新的对象创建。 不进行缓存与Singleton不同Spring容器不会维护Prototype对象的缓存。每次请求Prototype Bean时都会创建一个全新的实例。 不进行生命周期管理Spring容器不会管理Prototype对象的生命周期。因此容器不会在Bean的销毁阶段执行任何清理操作。对象的销毁由客户端代码负责。 底层实现IOC容器的创建和初始化通常包括以下几个步骤 创建容器对象实例化一个容器对象可以是自定义的容器类或者使用现有的容器框扫描组件容器会扫描指定的包或者目录查找符合条件的组件类。 注册组件将扫描到的组件注册到容器中可以使用反射机制创建实例。解析依赖对于需要注入的依赖容器会解析其依赖关系并在需要时注入对应的实例。初始化组件对于注册到容器中的组件容器会调用其相应的初始化方法可以是在注解上指定的初始化方法或者实现了特定接口的回调方法。提供访问接口容器提供相应的接口如getBean()方法来获取容器中的组件实例。 Spring框架中的getBean()方法是用来从Spring容器中获取Bean实例的主要方法之一。下面是Spring框架底层如何实现getBean()方法的简要说明 Bean Definition的注册在Spring容器启动过程中所有的Bean定义包括Bean的名称、类名、属性等信息都会被注册到容器的BeanFactory中。这个注册是在容器初始化阶段进行的通常是通过XML配置文件或Java配置类来完成的。 Bean实例化当调用getBean()方法时容器首先会根据传入的Bean名称或类型信息查找相应的Bean定义。 Bean的创建和初始化如果找到了相应的Bean定义容器会根据定义中的信息创建Bean的实例。这通常涉及到Java反射机制它会调用Bean的构造函数来创建一个新的对象。然后容器会应用依赖注入和初始化方法等来配置和初始化这个Bean实例。 Bean的缓存Spring容器通常会维护一个Bean实例的缓存以确保同一个Bean不会被多次创建。这样如果之前已经创建了一个Bean实例下次调用getBean()方法时容器会直接返回缓存中的实例而不会再次创建。 返回Bean实例最终getBean()方法会返回创建或从缓存中获取的Bean实例供调用者使用。 AOP代理可选如果该Bean被配置为使用AOP面向切面编程容器可能会为该Bean创建一个代理对象以便在方法调用时应用切面逻辑。 BeanPostProcessor是Spring框架提供的一个扩展点它允许开发者在Bean初始化的不同阶段插入自定义的逻辑。Spring底层通过一系列的回调方法来实现BeanPostProcessor接口以便在Bean的初始化前后执行额外的处理。以下是Spring底层如何实现BeanPostProcessor的简要说明 接口定义BeanPostProcessor是一个接口其中定义了两个回调方法 postProcessBeforeInitialization(Object bean, String beanName): 在Bean的初始化前执行。在这个方法中可以对Bean进行修改或者执行一些额外的初始化逻辑。 postProcessAfterInitialization(Object bean, String beanName): 在Bean的初始化后执行。在这个方法中同样可以对Bean进行修改或者执行其他的操作。 注册BeanPostProcessor开发者可以自定义一个或多个实现了BeanPostProcessor接口的类然后将它们注册到Spring容器中。这可以通过XML配置文件、Java配置类或者注解方式来完成。一旦注册这些BeanPostProcessor将会被Spring容器调用。 回调方法执行当Spring容器创建和初始化Bean时它会在适当的时机调用已注册的BeanPostProcessor的回调方法。具体的调用时机如下 在Bean的实例化后但在初始化方法调用之前会调用postProcessBeforeInitialization方法。 在Bean的初始化方法调用后会调用postProcessAfterInitialization方法 自定义逻辑开发者可以在这两个回调方法中编写自己的逻辑例如可以在postProcessBeforeInitialization方法中进行属性设置或校验也可以在postProcessAfterInitialization方法中执行一些清理工作。 在Java中回调方法Callback Methods是一种常见的编程模式它允许一个对象通常是一个类将某个方法的引用传递给另一个对象以便在特定事件发生时调用该方法。回调方法通常用于事件处理、异步编程和自定义扩展点等情况。 ​Spring底层实现Bean后置处理器BeanPostProcessor机制主要依赖于接口和容器生命周期回调方法。Bean后置处理器允许在容器实例化、配置和初始化Bean之前和之后执行自定义逻辑例如修改Bean的属性执行代理等操作。以下是Spring底层如何实现Bean后置处理器机制的简要说明 接口定义BeanPostProcessor是Spring框架提供的接口其中包含了两个回调方法 postProcessBeforeInitialization(Object bean, String beanName): 在Bean的初始化之前调用。开发者可以在此方法中修改Bean实例的属性或执行自定义初始化逻辑。 postProcessAfterInitialization(Object bean, String beanName): 在Bean的初始化之后调用。开发者可以在此方法中进行清理工作或者对Bean进行后处理。 注册BeanPostProcessor开发者可以创建自定义的实现了BeanPostProcessor接口的类并将这些后置处理器注册到Spring容器中。这通常可以通过XML配置文件、Java配置类或注解方式来完成。 容器生命周期回调方法Spring容器在不同的生命周期阶段会自动调用已注册的Bean后置处理器的回调方法。以下是典型的生命周期回调方法执行顺序 创建Bean实例。 在调用Bean的构造函数之后但在初始化方法如果有的话之前调用postProcessBeforeInitialization方法。 在调用Bean的初始化方法之后调用postProcessAfterInitialization方法。 自定义逻辑开发者可以在postProcessBeforeInitialization和postProcessAfterInitialization方法中编写自己的逻辑以根据需要修改、增强或清理Bean。 AOP代理可选在postProcessBeforeInitialization方法中开发者可以选择创建AOP代理以包装Bean。这可以用于实现AOP切面。 原生Spring底层实现AOP面向切面编程主要依赖于动态代理和反射机制。Spring使用AOP实现了横切关注点cross-cutting concerns的模块化允许在不改变业务逻辑的情况下将横切关注点如日志、事务、安全性检查等应用于应用程序的各个部分。以下是Spring底层如何实现AOP的简要说明 AOP核心概念 切面Aspect切面是包含横切关注点的模块。它定义了何时以及在何地应用横切关注点。 连接点Join Point连接点是在应用程序中可能被拦截的点例如方法调用、异常抛出等。 通知Advice通知是在连接点上执行的动作包括前置通知、后置通知、环绕通知、抛出异常通知和最终通知。 切点Pointcut切点是一组连接点的集合它定义了哪些连接点应该被拦截。 AOP代理生成Spring底层使用JDK动态代理和CGLIB两种方式生成AOP代理。具体的代理方式取决于目标Bean是否实现了接口。如果目标Bean实现了接口Spring将使用JDK动态代理否则将使用CGLIB代理。代理对象负责调用切面的通知方法。 通知执行当目标方法被调用时AOP代理会根据切面定义的通知类型在连接点上执行相应的通知。例如前置通知会在方法执行前执行后置通知会在方法执行后执行。 切点匹配Spring使用切点表达式Pointcut Expressions来确定哪些连接点应该被拦截。切点表达式可以根据方法名、包名、类名等条件来匹配连接点。 通知执行顺序通知可以按照特定的顺序来执行这个顺序可以在切面配置中定义。通常情况下通知的执行顺序包括前置通知、环绕通知、后置通知、抛出异常通知和最终通知。 XML配置或注解Spring提供了两种方式配置AOP一种是通过XML配置文件定义切面、切点和通知另一种是使用注解来标注切面、切点和通知。 BeanDefinition 在Spring框架中BeanDefinition是Spring容器中的一个抽象概念当Spring容器初始化时它会解析配置文件或者注解并生成相应的BeanDefinition对象。BeanDefinition是用于描述和定义一个Bean的元数据(数据的数据, 类属性的属性)信息的对象。它包含了一个Bean的类名、作用域、属性值、构造函数参数、初始化方法、销毁方法等相关信息。它的主要作用是为容器提供创建和管理Bean实例的必要信息。 通过BeanDefinitionSpring容器了解了如何实例化、配置和管理一个Bean对象。它允许我们对Bean进行灵活的配置和定制化可以设置不同的作用域如单例、原型等设置属性值指定构造函数参数等。 BeanDefinition可以通过不同的方式进行定义包括XML配置文件、注解和Java代码等。无论使用哪种方式最终都会被解析为BeanDefinition对象然后由容器根据该对象来创建和管理相应的Bean实例。 Spring的BeanDefinition提供了一个统一的模型来管理和控制Bean的生命周期和行为。它使得Spring容器能够根据配置信息动态地创建和管理Bean对象同时也提供了强大的扩展和定制化能力。 类加载器和类路径classPath java的类加载器3种 Bootstrap类加载器--—----—--—---对应路径jre/libExt类加载器---------—----------对应路径jre/lib/extApp类加载器--—-------------—--对应路径classpath App类加载器常用, classpath 类路径就是 java.exe 执行时指定的路径比如 C:\Program Files\Java\jdk1.8.0_181\bin\java.exe -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.2\lib\idea_rt.jar55328:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.2\bin -Dfile.encodingUTF-8 -classpath C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;D:\NewExecllction\exicesecode\lxb-spring\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.3.8\spring-context-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.3.8\spring-aop-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.3.8\spring-beans-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.3.8\spring-core-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.3.8\spring-jcl-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.3.8\spring-expression-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.3.8\spring-aspects-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar com.lxb.spring.AppMain ClassLoader的getResource方法
http://www.zqtcl.cn/news/323408/

相关文章:

  • 烟台做网站需要多少钱制作ppt的软件是什么
  • 泉州模板开发建站wordpress显示一个类目
  • 河南造价信息网官网为什么要做网站优化
  • 网站做个seo要多少钱做公司网站开发的公司
  • 企业网站html模板下载安装的字体wordpress
  • 庙行镇seo推广网站朋友圈的广告推广怎么弄
  • 网站打不开怎么办html怎么做网站背景
  • 厦门网站排名网络服务类型有哪些
  • 如何选择制作网站公司心雨在线高端网站建设专业
  • 山西做网站如何选择2万元最简单装修
  • 广丰区建设局网站友情链接发布网
  • 沧州做网站的专业公司python做网站视频
  • 管理外贸网站模板下载大数据营销优势
  • 做网站的小图标硬盘做网站空间
  • 微信网站界面设计宁波网站优化公司推荐
  • 深圳商城网站开发七冶建设集团网站
  • 广州旅游网站建设设计公司wordpress长文章分页代码
  • 手机营销网站网站的字体
  • 设计网站大全软件互动营销用在哪些推广上面
  • 建设银行网站怎样查询贷款信息吗台州网站制作 外贸
  • 建设网站的步骤知乎app开发定制公司
  • 怎样自己做刷赞网站专业网站设计服务
  • 云主机建站如何让自己做的博客网站上线
  • 目前我们的网站正在建设中做网站违反广告法
  • 有没有做美食的规模网站怎么做国外的网站吗
  • 竭诚网络网站建设开发杭州百度推广
  • 怎样购买起名软件自己做网站小程序制作收费
  • 制作企业网站欢迎界面素材cuntlove wordpress
  • 适合建设网站的国外服务器人工智能培训机构
  • 怎么套网站潜江资讯网招聘信息