Java核心知识点整理大全13-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客

Java核心知识点整理大全4-笔记-CSDN博客

Java核心知识点整理大全5-笔记-CSDN博客

Java核心知识点整理大全6-笔记-CSDN博客

Java核心知识点整理大全7-笔记-CSDN博客

Java核心知识点整理大全8-笔记-CSDN博客

Java核心知识点整理大全9-笔记-CSDN博客

Java核心知识点整理大全10-笔记-CSDN博客

Java核心知识点整理大全11-笔记-CSDN博客

Java核心知识点整理大全12-笔记-CSDN博客

往期快速传送门👆:

目录

6.1.7.5. Spring Bean 生命周期

实例化

IOC 依赖注入

setBeanName 实现

BeanFactoryAware 实现

ApplicationContextAware 实现

postProcessBeforeInitialization 接口实现-初始化预处理

init-method

postProcessAfterInitialization

Destroy 过期自动清理阶段

6.1.7.6. Spring 依赖注入四种方式 构造器注

构造器注入

setter 方法注入

静态工厂注入

实例工厂

6.1.7.7. 5 种不同方式的自动装配

6.1.8. Spring APO 原理

6.1.8.1. 概念

AOP 主要应用场景有:

6.1.8.2. AOP 核心概念

6.1.8.1. AOP 两种代理方式

JDK 动态接口代理

CGLib 动态代理

6.1.8.2. 实现原理:

6.1.9. Spring MVC 原理

6.1.10. Spring Boot 原理

1. 创建独立的 Spring 应用程序

2. 嵌入的 Tomcat,无需部署 WAR 文件

3. 简化 Maven 配置

4. 自动配置 Spring

5. 提供生产就绪型功能,如指标,健康检查和外部配置

6. 绝对没有代码生成和对 XML 没有要求配置 [1]


6.1.7.5. Spring Bean 生命周期

实例化

1. 实例化一个 Bean,也就是我们常说的 new。

IOC 依赖注入

2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。

setBeanName 实现

3. 如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String) 方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值

BeanFactoryAware 实现

4. 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory, setBeanFactory(BeanFactory)传递的是 Spring 工厂自身(可以用这个方式来获取其它 Bean, 只需在 Spring 配置文件中配置一个普通的 Bean 就可以)。

ApplicationContextAware 实现

5. 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用 setApplicationContext(ApplicationContext)方法,传入 Spring 上下文(同样这个方式也 可以实现步骤 4 的内容,但比 4 更好,因为 ApplicationContext 是 BeanFactory 的子接 口,有更多的实现方法)

postProcessBeforeInitialization 接口实现-初始化预处理

6. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用 作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应 用于内存或缓存技术。

init-method

7. 如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。

postProcessAfterInitialization

8. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s)方法。 注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,所以一 般情况下我们调用同一个 id 的 Bean 会是在内容地址相同的实例,当然在 Spring 配置文件中 也可以配置非 Singleton。

Destroy 过期自动清理阶段

9. 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调 用那个其实现的 destroy()方法; destroy-method 自配置清理

10. 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的 销毁方法

11. bean 标签有两个重要的属性(init-method 和 destroy-method)。用它们你可以自己定制 初始化和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。

6.1.7.6. Spring 依赖注入四种方式 构造器注

构造器注入

/*带参数,方便利用构造器进行注入*/public CatDaoImpl(String message){this. message = message;}
<bean id="CatDaoImpl" class="com.CatDaoImpl">
<constructor-arg value=" message "></constructor-arg>
</bean>

setter 方法注入

public class Id {private int id;public int getId() { return id; }public void setId(int id) { this.id = id; }
}
<bean id="id" class="com.id "> <property name="id" value="123"></property> </bean>

静态工厂注入

静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让 spring 管理所 有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过 spring 注入的形式获 取:

public class DaoFactory { //静态工厂public static final FactoryDao getStaticFactoryDaoImpl(){return new StaticFacotryDaoImpl();}
}
public class SpringAction {private FactoryDao staticFactoryDao; //注入对象//注入对象的 set 方法public void setStaticFactoryDao(FactoryDao staticFactoryDao) {this.staticFactoryDao = staticFactoryDao;}
}
//factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法<bean name="springAction" class=" SpringAction" ><!--使用静态工厂的方法注入对象,对应下面的配置文件--><property name="staticFactoryDao" ref="staticFactoryDao"></property></bean><!--此处获取对象的方式是从工厂类中获取静态方法-->
<bean name="staticFactoryDao" class="DaoFactory"
factory-method="getStaticFactoryDaoImpl"></bean>

实例工厂

实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 new 工厂类,再调用普通的 实例方法:

 public class DaoFactory { //实例工厂public FactoryDao getFactoryDaoImpl(){return new FactoryDaoImpl();
}
}
public class SpringAction {private FactoryDao factoryDao; //注入对象public void setFactoryDao(FactoryDao factoryDao) {this.factoryDao = factoryDao;}
}<bean name="springAction" class="SpringAction"><!--使用实例工厂的方法注入对象,对应下面的配置文件--><property name="factoryDao" ref="factoryDao"></property></bean><!--此处获取对象的方式是从工厂类中获取实例方法-->
<bean name="daoFactory" class="com.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory"
factory-method="getFactoryDaoImpl"></bean> 

6.1.7.7. 5 种不同方式的自动装配

Spring 装配包括手动装配和自动装配,手动装配是有基于 xml 装配、构造方法、setter 方法等 自动装配有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。 1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。 2. byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设 置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。 3. byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被 设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多 个 bean 符合条件,则抛出错误。 4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数 的构造器参数类型,将会抛出异常。 5. autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。

6.1.8. Spring APO 原理

6.1.8.1. 概念

"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块, 并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共 同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未 来的可操作性和可维护性。 使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流 程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生 在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统 中的各种关注点,将核心关注点和横切关注点分离开来。

AOP 主要应用场景有:

1. Authentication 权限

2. Caching 缓存

3. Context passing 内容传递

4. Error handling 错误处理

5. Lazy loading 懒加载

6. Debugging 调试

7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准

8. Performance optimization 性能优化

9. Persistence 持久化

10. Resource pooling 资源池

11. Synchronization 同步

12. Transactions 事务

6.1.8.2. AOP 核心概念

1、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象

2、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。

3、连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

4、切入点(pointcut):对连接点进行拦截的定义

5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、 异常、最终、环绕通知五类。

6、目标对象:代理的目标对象

7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法 或字段。

6.1.8.1. AOP 两种代理方式

Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口, 则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。

JDK 动态接口代理

1. JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类 的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建 一个符合某一接口的实例,生成目标类的代理对象。

CGLib 动态代理

2. :CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库, 可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新 的 class。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例, 而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。

6.1.8.2. 实现原理:

@Aspect
public class TransactionDemo {@Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")public void point(){}@Before(value="point()")public void before(){System.out.println("transaction begin");}@AfterReturning(value = "point()")public void after(){System.out.println("transaction commit");}@Around("point()")public void around(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("transaction begin");joinPoint.proceed();System.out.println("transaction commit");}
}

 

6.1.9. Spring MVC 原理

Spring 的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的,这个 Servlet 会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染 等,甚至还能支持文件上传。

Http 请求到 DispatcherServlet

(1) 客户端请求提交到 DispatcherServlet。

HandlerMapping 寻找处理器

(2) 由 DispatcherServlet 控制器查询一个或多个 HandlerMapping,找到处理请求的 Controller。

调用处理器 Controller

(3) DispatcherServlet 将请求提交到 Controller。

Controller 调用业务逻辑处理后,返回 ModelAndView

(4)(5)调用业务处理和返回结果:Controller 调用业务逻辑处理后,返回 ModelAndView。

DispatcherServlet 查询 ModelAndView

(6)(7)处理视图映射并返回模型: DispatcherServlet 查询一个或多个 ViewResoler 视图解析器, 找到 ModelAndView 指定的视图。

ModelAndView 反馈浏览器 HTTP

(8) Http 响应:视图负责将结果显示到客户端


6.1.10. Spring Boot 原理

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭 建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 配置。通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。其特点如下:

1. 创建独立的 Spring 应用程序

2. 嵌入的 Tomcat,无需部署 WAR 文件

3. 简化 Maven 配置

4. 自动配置 Spring

5. 提供生产就绪型功能,如指标,健康检查和外部配置

6. 绝对没有代码生成和对 XML 没有要求配置 [1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

激光雷达报告:单月上车提前突破5万台关口!车企真实搭载「去伪存真」

高工智能汽车研究院监测数据显示&#xff0c;截至2023年9月&#xff0c;激光雷达已经连续2个月交付破5万台关口。 这也意味着&#xff0c;这一交付关口早于预期被突破。回溯来看&#xff0c;2023年6月&#xff0c;高工智能汽车研究院在第十四届智驾开发者大会上释放预测&#…

战地5无限序章(无法保存)的解决办法

启动游戏后&#xff0c;目录就会自动变成这样了&#xff0c;也不会无限循环了&#xff01;

C++类与对象(5)—流运算符重载、const、取地址

目录 一、流输出 1、实现单个输出 2、实现连续输出 二、流输入 总结&#xff1a; 三、const修饰 四、取地址 .取地址及const取地址操作符重载 五、[ ]运算符重载 一、流输出 1、实现单个输出 创建一个日期类。 class Date { public:Date(int year 1, int month 1,…

践行“互联网+中药服务”理念,华润煎配中心打造智能代煎新模式

移动互联网时代&#xff0c;“互联网&#xff0b;”浪潮迭起&#xff0c;中药企业开始探索“互联网&#xff0b;中药服务”模式。 华润湖南医药有限公司&#xff08;以下简称“华润湖南医药”&#xff09;作为华润集团旗下华润湖南医药商业集团全资控股的大型医药企业&#xff…

你听过斯大林病毒吗?

相信不少小伙伴看过这种红眼特效&#xff0c;那么你知道这个特效最早出自哪里吗&#xff1f; 其实这个红眼病毒最早出于俄罗斯的电脑病毒斯大林&#xff0c;一旦电脑感染这个病毒&#xff0c;屏幕上就会出现自带一个红眼特效的斯大林人像&#xff0c;同时不断播放苏联国歌。 …

基于侏儒猫鼬算法优化概率神经网络PNN的分类预测 - 附代码

基于侏儒猫鼬算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于侏儒猫鼬算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于侏儒猫鼬优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

关于提示SLF4J: Class path contains multiple SLF4J bindings的问题解决

今天搭建hbase的时候启动hbase的时候shell面板输入了一大堆日志&#xff0c;如下&#xff1a; stopping hbase.....................SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/opt/software/hadoop-3.1.3/share/hadoop/common/l…

hdlbits系列verilog解答(exams/m2014_q4f)-47

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (input in1,input in2,output out);assign out in1 & (~in2);endmodule三、仿真结果 转载请注明出处&#xff01;

实验题【网关设置+VRRP+静态路由+OSPF】(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求和考核目标3. 当前配置3.1 PC1、PC2、PC3、PC4和PC5配置3.2 SW配置3.2.1 SW2配置3.2.2 SW3配置3.2.3 SW4配置3.2.4 SW1配置 3.2. R配置3.2.1 R1配置3.2.2 R2配置 ⭐ H3C模拟器资源链接 H3C网络…

篮桥云课-摆玩具

思维好题 一开始掉进了二分的陷阱&#xff0c;发现看看逐个位置的差&#xff0c;我们要分成k段就是要取消k-1个最大的逐差 然后将剩余的加起来就可以了 因为本体保证是从小到大给出的 这一点保证了答案的正确性&#xff0c;自己没想出来 还是太菜了 #include<bits/stdc.h&…

Apache Superset数据分析平台如何实现公网实时远程访问数据【内网穿透】

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

从零开始学优惠券样式代码编写,让你的网站焕然一新!

样式1&#xff1a; 代码实例&#xff1a; <div class"box"><div class"itemBox"><div class"leftBox">全额抵扣</div><div class"rightBotton"><button>立即使用</button></div><…

[BJDCTF 2020]easy_md5

md5(string,raw) 所以首先我们要找到一个字符串&#xff0c;这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。 我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的&#xff0c;接着就是要看关键的数字部分了&#xff0c;在276f72…

Error running Tomcat8: Address localhost:1099 is already in use 错误解决

摘要: 有时候运行web项目的时候会遇到 Error running Tomcat8: Address localhost:1099 is already in use 的错误&#xff0c;导致web项目无法运行。这篇 blog 介绍了解决办法。 有时候运行web项目的时候会遇到 Error running Tomcat8: Address localhost:1099 is already in …

【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?

在数字时代中&#xff0c;传统的展览方式正在被全新的技术和工具所颠覆。其中&#xff0c;最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用&#xff0c;正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…

Altium Designer学习笔记13

0603电容封装的画法&#xff1a; 再画下三极管SOT-23的三极管的封装图&#xff1a; 画出三极管的封装图&#xff1a; 在画图的过程中&#xff0c;遇到了一个问题&#xff0c;画闭环线路的时候&#xff0c;就会被自动删除&#xff0c;查出是这个地方的配置需要进行修改。 那这个…

电源控制系统架构(PCSA)之电源状态层级

目录 5.2 电源状态层级 5.2.1 Core电源状态 5.2.2 Cluster的电源状态 5.2.3 设备电源状态 5.2.4 SOC电源状态 5.2 电源状态层级 电源状态可以组织为电源状态表的层次结构。每个电源状态表描述在其层次结构级别上可用的电源状态。 从系统级电源控制的角度来看&#xff0c…

吴恩达《机器学习》10-1-10-3:决定下一步做什么、评估一个假设、模型选择和交叉验证集

一、决定下一步做什么 在机器学习的学习过程中&#xff0c;我们已经接触了许多不同的学习算法&#xff0c;逐渐深入了解了先进的机器学习技术。然而&#xff0c;即使在了解了这些算法的情况下&#xff0c;仍然存在一些差距&#xff0c;有些人能够高效而有力地运用这些算法&…

RevCol实战:使用RevCol实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 可逆柱状结构&#xff08;RevCol&#xff09;是一种网络结构&#xff0c;它受到GLOM&#xff08;Global Columnar Memory&#xff09;的启发。RevCol由N个子网络&#xff08;或称为…

[SWPUCTF 2021 新生赛]no_wakeup

直接赋值即可 $a ->admin admin; $a ->passwd wllm; 发现没有绕过&#xff0c;改成大于2的绕过__wakeup 这是因为PHP在反序列化时会检查序列化字符串的长度&#xff0c;如果长度小于等于2&#xff0c;则不会调用__wakeup()方法。