JAVA二阶段思维导图
2026-09-03 16:47:37 0 举报仅支持查看
java智能体开发,二阶段脑图
java
模板推荐
作者其他创作
大纲/内容
web基础
网络编程
<span style="font-size:inherit;">IP地址</span>
实现网络中不同计算机之间的通信,每台计算器都必须有一个唯一的标识,那就是IP地址(公网IP),这就相当于每个人的手机号码一样
Port端口
端口port用来区分不同的应用程序,端口号范围为0~65535,其中0~1023被系统所保留,如果自定义端口号,建议为1023以后的
TCP
TCP协议是Transmission Control Protocol传输控制协议,TCP是一种面向长连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。当客户和服务器彼此传递数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据
UDP
UDP(User Datagram Protocol)是一种无连接、不可靠、基于数据报的用户数据报协议。
Http协议
http协议介绍
Http协议是基于TCP之上,当浏览器须要从server获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到server的连接通道。
Http报文
请求报文
<br>
响应报文
<br>
状态码
(1) 100~199 -- 信息性状态码<br>(2) 200~299 -- 成功状态码<br>(3) 300~399 -- 重定向状态码<br>(4) 400~499 -- 客户端错误状态码<br>(5) 500~599 -- 服务器错误状态码
Tomcat
1. Tomcat是一个开源免费的Web服务器,它是Apache软件基金会的一个顶级项目,由Apache,Sun和其他一些公司及个人共同开发而成。<br>2. Tomcat8支持最新的Servlet 3.1和JSP2.3规范。Tomcat用java语言开发,Tomcat是一个符合J2EE(Servlet规范)标准的WEB服务器。<br>3. 如果我要在电脑上运行Tomcat,必需要有java的运行环境。我们后面的JavaWeb学习都是基于Tomcat服务器的。<br>4. 官方地址:[http://tomcat.apache.org]
Tomcat安装流程
从官方下载好对应的tomcat 只需要解压就可以使用
项目创建
<br>
<br>
<br>
Servlet
什么是Servlet
tomcat 是servlet的容器<br><br>1. 这是一个接口,一个规范(sun公司并没有去实现它),它的实现就是由各大服务器厂商(Tomcat)去实现。<br>2. Tomcat是一个javaweb服务器,也是一个Servlet容器。<br>3. Servlet容器是管理所有Servlet对象的创建,运行,销毁的容器。而Servlet对象也只有在Servlet容器中才能使用。所以如果我们写了一个Servlet,那么一定要记住,把这个Servlet交给Tomcat去管理。
如何开发一个Servlet
1. 创建一个web项目<br>2. 导入Servlet的jar包(servlet-api.jar),可以去Tomcat目录的lib目录中复制<br>3. 新建一个类去实现Servlet接口或者去继承HttpServlet类(建议),并实现或重写service业务方法
Servlet执行流程
1. 用户在浏览器端输入地址,例如:[http://localhost:80/servlet/hello](http://localhost/servlet/hello)<br>2. 这个请求访问的是本地(localhost)端口号为80的程序,即Tomcat<br>3. Tomcat会到webapps中去找到servlet这个程序或者到server.xml中根据上下文路径找到对应的项目<br>4. 然后Tomcat会去找到该项目的配置文件web.xml,然后查看有没有hello这个请求<br>5. 请求:[http://localhost:80/servlet/hello](http://localhost/servlet/hello) → 找到`/hello`,找到Servlet名字:hello<br>6. Tomcat会根据请求hello去匹配web.xml中的`<url-pattern>`中的值:<br> - 如果没有匹配上就去找这个项目默认web路径下有没有hello这个页面(html或jsp)<br> - 如果匹配上了会根据`<Servlet-name>`标签找到相应的Servlet类<br>7. 找到相应的类之后,到缓存区里面去看这个类有没有相应的实例:<br> - 如果没有,通过反射创建一个实例,并将这个实例放到缓存区<br> - 执行构造方法<br> - 执行初始化方法<br> - 如果有,直接拿到这个实例<br>8. 调用实例的service方法执行业务逻辑处理<br>9. 如果正常关闭的话,会执行destroy方法
Servlet生命周期
生命周期顺序:构造方法 → init方法 → service【每次请求都会执行】 → destroy【正常关闭才执行】
ServletConfig
1. ServletConfig这个对象是由Tomcat为我们创建好的,我们可以在init中可以拿到它。它是Servlet的配置对象。<br>2. 常用API:<br> - config.getServletContext():拿到的上下文对象<br> - config.getServletName():拿到Servlet的名字<br> - config.getInitParameter(String name):根据名称拿到初始化参数
HttpServletRequest对象
HttpServletRequest对象是Servlet的请求对象,可以获取请求数据包/报文中的所有信息。<br>
HttpServletResponse对象
1. HttpServletResponse对象是Servlet的响应对象,可以设置响应的文件格式和编码格式,还可以获取输出流。<br>2. 常用方法:<br> - 获取流:<br> - OutputStream getOutputStream():获取字节输出流(上传下载用)<br> - resp.getWriter():获取字符输出流<br> - 响应页面的文件格式和编码格式: resp.setContentType("text/html;charset=UTF-8")`
Spring
spring基础
1 Spring 是一个开源的 Java 应用框架,主要用于构建企业级应用程序<br>2 spring框架作用:简化开发、框架整合<br>3 两大核心技术:IOC(控制反转)/DI(依赖注入)、AOP(面相切面编程)
IOC(控制反转)/DI(依赖注入)
面向接口编程原则<br>解耦合:通过接口定义契约,实现类具体实现,降低模块间的耦合度<br>可替换性:可以轻松替换不同的实现类,而不需要修改调用方代码
DI注入案例
<br>
DI之自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配<br><br>自动装配方式:按类型(最常用)、按名称、按构造方法
总结:
1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作<br>2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用<br>3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用<br>4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
Bean
bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象<br>bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高<br> * bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象<br> * bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高<br> * bean在容器中是单例的,会不会产生线程安全问题?<br> * 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,<br> * 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。<br> * 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,<br> * 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
注解
放入容器的注解
@Component: 通用组件,标注一个类会被Spring容器自动扫描并注册为Bean。<br>@Service: 业务层组件,语义化标注Service层,功能同@Component。<br>@Repository: 数据访问层组件,同时提供数据库异常转换(需配置PersistenceExceptionTranslationPostProcessor或配合JPA/MyBatis时有效)。<br>@Controller: Web层组件,虽用于Spring MVC,但仅spring-context也能识别,只是没有Web功能。
从容器里面取对象的注解
@Autowired: 按类型自动装配,可用于构造器、setter 方法、字段、甚至任意方法参数。<br>@Qualifier: 按名称装配(配合 @Autowired),解决多个同类型 Bean 的歧义。<br>@Value: 注入外部属性值,支持 SpEL 表达式(如 @Value("${jdbc.url}")),需配合 PropertySourcesPlaceholderConfigurer。<br>@Resource: 按名称装配,JSR-250 注解,Spring 也支持,优先按名称查找。<br>@Inject: 按类型装配,JSR-330 注解,需额外引入 javax.inject 包,但 Spring 也能处理。
Java 配置类(代替 XML)
@Configuration: 声明一个类为配置类,内部可包含 @Bean 方法。<br>@Bean: 在配置类中声明一个 Bean,方法返回值对象会被注册到容器。<br>@ComponentScan: 指定包扫描路径,等同于 XML 中的 <context:component-scan>。<br>@PropertySource: 加载 properties 配置文件,配合 @Value 或 Environment 使用。<br>@Import: 导入其他配置类,用于模块化配置。<br>@ImportResource: 导入 XML 配置文件,混合配置时使用。
面向切面编程模块
Spring AOP基础架构
AOP(Aspect Oriented Programming)面向切面编程,是一种编程思想<br>作用:在不改原有代码的前提下对其进行增强<br>具体:Spring的AOP是对一个类的方法在不进行任何修改的前提下实现增强
AOP术语(切面、连接点、通知、切入点)
基于代理的AOP实现机制(JDK动态代理与CGLIB)
通知类型(前置、后置、环绕、异常、最终)
AspectJ注解驱动与XML配置方式
AspectJ集成与高级切面功能
AspectJ切点表达式语言详解
引入(Introduction)与混入(Mixin)功能
基于AspectJ的注解切面声明
AOP代理工厂与自动代理配置
事务管理抽象与声明式事务
声明式事务管理
在service实现类中某个方法上写@Transactional ,则该方法会自动用到事务<br>在service实现类上写@Transactional ,则该类下所有方法都会自动用到事务
编程式事务管理
通过TransactionTemplate在代码中手动管理事务----细粒度更精确,但比声明式麻烦
事务面试题
事务的传播机制
事务失效的场景
spring整合mybatis
以前是自己通过流加载mybatis核心配置文件,通过new出来的sqlSessionFactory获得sqlSession,然后通过sqlSession拿到动态代理的mapper对象,继而执行接口方法,最终执行对应的sql语句返回结果集。<br><br>现在是将SqlSessionFactory交给Spring管理,Mapper代理对象是在Spring容器启动时,MapperScannerConfigurer会扫描指定包下的所有Mapper接口,并为每个接口创建代理对象
SpringMVC
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
<br>
三层架构
将后端服务器Servlet拆分成三层,分别是web、service和dao<br><br>* web层主要由servlet来处理,负责页面请求和数据的收集以及响应结果给前端<br>* service层主要负责业务逻辑的处理<br>* dao层主要负责数据的增删改查操作
后端采用了MVC设计模式,将其设计为controller、view和Model<br><br>* controller负责请求和数据的接收,接收后将其转发给service进行业务处理<br>* service根据需要会调用dao对数据进行增删改查<br>* dao把数据处理完后将结果交给service,service再交给controller<br>* controller根据需求组装成Model和View,Model和View组合起来生成页面转发给前端浏览器
执行流程
1. 浏览器发出请求,直接打到DispatcherServlet<br>2. HandlerMapping根据URL查找对应的Handler(Controller)<br>3. HandlerAdapter按照既定规则执行Handler<br>4. Handler执行完返回ModelAndView:Model装数据、View装逻辑名<br>5. ViewResolver把逻辑视图名翻译成真实路径<br>6. DispatcherServlet把Model数据传入View,完成渲染<br>7. 最终视图返回给浏览器<br>8. 若过程中抛出异常,由HandlerExceptionResolver统一处理
常用注解
@RequestParam 用于接收url地址传参<br>@EnableWebMvc 开启json数据类型自动转换<br>@ResponseBody json数据类型自动转换<br>@RequestMapping<br>@GetMapping<br>@PostMapping
SSM
统一结果封装
将返回结果的数据进行统一,大体的思路为:<br><br>* data ---- 返回结果<br>* code --- 状态码 <br>* msg --- 消息
@RestController
标记为controller层的bean + 所有方法都将把对象转为json
统一异常处理
新建业务异常类
ServiceException(自定义)
全局异常处理类
GlobalExceptionHandler
核心注解说明<br>
@RestControllerAdvice
1 异常捕获发生在整个请求处理流程中<br>2 从Controller → Service → DAO的调用链中抛出的异常都会向上传播<br>3 @RestControllerAdvice 会捕获整个调用链中未处理的异常(如果自己try-catch了则不会捕获)
@ExceptionHandler
1 Spring会识别该注解并将相应异常路由到标记的方法中<br>2 进入到指定异常方法后,springmvc会直接响应该方法的返回结果
异常处理类需要被包扫描到
捕获异常的方法
Spring 事务自动提交机制
PlatformTransactionManager
spring中管理事务的核心组件:PlatformTransactionManager:Spring事务管理的核心接口,负责管理事务的生命周期,包括开启、提交和回滚事务等操作。
开启事务管理
通过@EnableTransactionManagement + 把PlatformTransactionManager放入IOC来实现
事务分类
1 声明式事务<br>
在service实现类中某个方法上写@Transactional ,则该方法会自动用到事务<br>在service实现类上写@Transactional ,则该类下所有方法都会自动用到事务
2 编程式事务<br>
通过TransactionTemplate在代码中手动管理事务----细粒度更精确,但比声明式麻烦
slf4j+logback日志
依赖
resources下添加logback.xml
mapper
xml
mybatis分页插件-pageHelper
原理
通过 MyBatis 插件机制拦截 SQL,动态改写 SQL 实现分页<br>
具体的有两步:<br>1 拦截目标sql,追加limit命令<br>2 生成count查询总条数的sql
添加依赖
<dependency><br> <groupId>com.github.pagehelper</groupId><br> <artifactId>pagehelper</artifactId><br> <version>5.3.2</version><br></dependency>
MybatisConfig配置
userDto
controller
service
启用分页插件-->查询结果集--->加载到pageInfo
拦截器 Filter
介绍
<br>
1 浏览器发送一个请求会先到Tomcat的web服务器<br>2 Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源<br>3 如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问<br>4 如果是动态资源,就需要交给项目的后台代码进行处理<br>5 在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行<br>6 然后进入到到中央处理器(SpringMVC中的内容),SpringMVC会根据配置的规则进行拦截<br>7 如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果<br>8 如果不满足规则,则不进行处理
拦截器作用
* 在指定的controller方法调用前后执行预先设定的代码(功能增强)<br>* 阻止原始方法的执行
拦截器和过滤器区别
归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术<br>拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强<br>先后顺序不同:先进入Filter,再进入Interceptor
<br>
实现自定义拦截器
让类实现HandlerInterceptor接口,重写接口中的三个方法。<br>MyInterceptor
注意:<br>1 顺序:访问请求接口--->拦截器的preHandle--->目标controller的return之前--->拦截器的postHandle--->拦截器的afterCompletion<br>2 拦截器类要被SpringMVC容器扫描到。
SpringmvcConfig扫描拦截器包
注册自定义拦截器,使之生效
拦截器使用场景
1 数据预处理(跨域)<br>2 用户登录状态认证<br>3 多租户环境下的租户识别<br>。。。。
跨域-基于拦截器
跨域(Cross-Origin Resource Sharing,简称 CORS)是一种安全策略,用于限制一个域的网页如何与另一个域的资源进行交互。这是浏览器实现的同源策略(Same-Origin Policy)的一部分,旨在防止恶意网站通过一个域的网页访问另一个域的敏感数据。
跨域设置 SpringmvcConfig:
springMVC-文件上传
DispatcherServletInitConfig配置
UploadController
Spring boot
SpringBoot 基础
Springboot介绍
springboot是什么
Spring Boot是Spring提供的一个子项目,用于快速构建Spring应用程序
传统方式构建spring应用
导入依赖麻烦:<br>1. 一个一个引入<br>2. jar包冲突或者版本冲突
Springboot特性
本质就是maven坐标,整合完成了功能所需要的全部坐标
自动配置
遵循约定大于配置的原则,在springboot程序启动后,一些bean对象会自动注入到ioc容器中,不需要手动声明——简化开发
其他特性
内嵌tomcat、jetty(意味着无需部署war包)
以前的项目需要打成war包,然后部署到tomcat或jetty中,springboot内嵌了服务器,比如tomcat,当springboot应用启动时,tomcat也会跟着启动,并且把当前项目的资源自动部署好,由于是内嵌的tomcat,我们以后只需要把springboot应用打成jar包,部署到线上后直接运行jar包即可开服
外部配置
以前项目如果更改了配置文件后需要重新编译打包部署,而springboot项目只需要修改项目外面的配置文件,直接重启就行(不需编译打包部署)
不需要xml配置
以前项目有大量的xml配置文件,<br>springboot项目只需要少量的配置
Springboot快速应用
创建maven工程
导入spring-boot-starter-web起步依赖
<dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-web</artifactId><br> <version>3.5.14</version><br></dependency>
编写启动类
编写controller
springboot的统一版本管理
方式1:导入spring-boot-starter-parent 父工程 这样下面和springboot相关的依赖就不用在写 version版本号
方式2:使用dependencyManagement 来管理springboot的版本 这样下面和springboot相关的依赖就不用在写 version版本号
编译和打包相关的插件配置
springboot的配置
作用
1.便于管理,避免代码写死(硬编码)<br>
2.支持外部配置,更改后不用重新打包,只需要重启服务即可
配置文件
properties
在resources下新建application.properties文件
#服务端口<br>server.port=8888<br>#服务路径<br>server.servlet.context-path=/admin
yml/yaml
在resources下新建application.yml或者application.yaml文件
server:<br> port: 8080<br> servlet:<br> context-path: /api
自定义配置读/写
读取配置文件的第一种方式 推荐
读取配置文件的第二种方式
配置文件的优先级
如果三个文件在同一个目录下,Spring Boot 会先加载 `application.properties`。如果它没有定义某个配置项,则会去 `application.yml` 里寻找,最后才会使用 `application.yaml`。<br>但如果所有文件都定义了 `server.port`,那么最终生效的将是 `.properties` 文件中的端口号
多环境配置
springboot多环境配置
为了方便指定生产、开发、测试环境(不用每次更换环境都要手动改配置),springboot可以通过配置来快速切换环境:
dev 开发 test 测试 prod 生产
application.yml #基础配置<br>application-dev.yml #开发环境<br>application-test.yml #测试环境<br>application-prod.yml #生产环境
mysql -- 开发 本机 IP地址<br>mysql -- 测试 服务器公司买的 IP地址<br>mysql -- 生成 服务器公司买的 IP地址
本质就是根据参数来指定读取哪一个配置文件
在application.yml中配置环境切换
spring:<br> profiles:<br> active: prod #这里指定多环境yml中的-后面的名字
多环境配置和spring.config.import配置区别
import目的是为了模块化配置。import配置的内容在基础yml是不会配置的;<br>多环境配置是为了在不同环境下配置不同的内容,比如服务ip、端口等,因此多个配置文件会配相似的内容
import无法支持参数启动,多环境可以支持参数启动<br>参数启动:基础yml可以不配置spring. profiles. active(就算配置了,优先级也<启动参数配置)
Springboot数据库连接
Springboot集成Mybatis
导包:mysql驱动和mybatis依赖
mysql-connector-j
mysql驱动包不写版本因为 Spring Boot 已经通过 spring-boot-starter-parent 帮你管理了常见的依赖版本。
mybatis-spring-boot-starter<br>需要写版本
mybatis要写版本是因为 MyBatis 并不属于 Spring Boot 官方模块
配置
配置内容
配置解释
xml
xml正常情况是放在src/main/resources下的,如果需要放在src/main/java下 需要添加如下配置
搭建三层
如果不想每个mapper接口都写@Mapper注解,可以直接在启动类配置@MapperScan
连接池
druid连接池
Druid 是阿里巴巴开源的一个高性能的数据库连接池组件,它不仅提供了连接池的基本功能,还内置了强大的监控和扩展能力。Druid 是目前 Java 生态中最常用的连接池之一,尤其在 Spring Boot 项目中被广泛使用。
Druid 在连接池中的作用:
1. 管理数据库连接的创建、复用、释放。<br>2. 避免频繁创建和销毁连接带来的性能损耗。<br>3. 提供连接池状态监控、SQL 监控、防火墙等附加功能。
依赖
druid-spring-boot-starter
配置
springboot默认的连接池是HikariCP
yml中需要配置 spring.datasource.type指定某个连接池
SpringbootTest
依赖
spring-boot-starter-test
测试
@SpringBootTest
分页插件
依赖
mybatis分页插件pagehelper<br>pagehelper-spring-boot-starter
pagehelper依赖字符串工具类commons-lang3<br>commons-lang3
配置
springboot自定义start
bean的管理
在springboot中既没有用到<context:component-scan><br>也没用到@ComponentScan 的原因是@SpringBootApplication是一个组合注解,里面已经有了@CompnentScan
bean注册
方式一:通过@Bean
准备一个自定义的bean
方式二:通过@Import
写法一:直接导入目标类的字节码(不推荐,不好管理)
写法二:导入配置类,依然把目标类通过@Bean写在配置类中
写法三:导入ImportSelector接口实现类
写法四:在写法3上利用自定义组合注解更优雅的开启
bean注册条件
@ConditionalOnProperty
@ConditionalOnMissingBean
注意:@Bean 的代码顺序会影响@ConditionalOnMissingBean
@ConditionalOnClass
@ConditionalOnClass和@ConditionalOnMissingBean 区别
@ConditionalOnMissingBean<br>关心的是spring容器有没有bean(依赖了并且要被spring注册了才存在)<br><br>@ConditionalOnClass<br>关心的是指定的全限定名类是否存在当前环境(依赖了就存在)
属性类+配置类的组合场景
1 从属性类中读取yaml配置<br>2 配置类中注入属性类<br>3 在@Bean中从注入的属性类身上拿到想要的属性充当bean的属性
用法1:属性类@Component
用法2:属性类无@Component+配置类EnableConfigurationProperties
自动配置原理
引入starter-web依赖后会自动装配DispatcherServlet到IOC容器
自定义start
规则 springboot把场景启动器分为两部分:
1 启动器模块(starter):是一个空的jar文件,,仅提供依赖管理(pom.xml),需要依赖自动装配模块----负责"提供什么"
2 自动配置模块(XxxAutoConfiguration), 包含自动配置的代码逻辑,是功能实现层,负责"怎么做"
分离成两个模块原因:
1 职责分离,清晰明确<br>2 便于依赖管理和版本控制<br>3 灵活
命名:
官方命名:spring-boot-starter-* :<br> -- 比如spring-boot-starter-*web<br>自定义命名:*-spring-boot-starter<br> -- 比如 myxx-spring-boot-starter
定义一个starter,通过配置可以获取信息
1.新建mybean-spring-boot-autoconfigure模块
2.导包
3.创建一个UserProperties类
4.创建一个UserAutoConfig类
5.在resource目录下面创建 配置上自己的类
6.通过maven打包安装到本地 install
7.创建一个mybean-spring-boot-starter
8.最后在将mybean-spring-boot-starter安装到本地 install
9.最后目标项目就可以直接引入mybean-spring-boot-starter依赖进行使用
SpingBoot日志
日志门面和日志的实现
日志门面
什么是日志门面
类比:JDBC(Java Database Connectivity)<br>日志门面就像 JDBC,它只是一个接口(Interface),定义了一组日志操作的方法(如 info、debug、error 等),但不负责具体实现。<br>它的作用是屏蔽底层日志实现的差异,让开发者面向接口编程,而不是具体的实现。
有哪些日志门面
1 JCL(**Jakarta Commons Logging** / **Apache Commons Logging**):Spring Framework 早期版本(如 Spring 3.x、4.x)默认使用<br>2 SLF4j(Simple Logging Facade for Java): 目前springboot默认使用<br>3 jboss-logging :hibernate在使用
日志的实现
什么是日志的实现
类比:MySQL、Oracle、SQL Server 等数据库驱动<br>日志实现就是真正执行日志记录功能的组件,它实现了日志门面定义的接口。<br>它负责将日志信息输出到控制台、文件、网络等目标。
有哪些日志实现
1 Logback:Spring Boot 默认使用的日志实现,性能好、功能强大<br>2 Log4j(已不推荐): Apache 的老牌日志框架<br>3 Log4j2 :Log4j 的升级版,性能更好,支持异步日志<br>4 JUL(JDK Logging-java.util.logging)Java 自带的日志实现,功能较弱
为什么需要门面 + 实现的结构
1. 解耦合<br>项目代码只依赖日志门面(如 SLF4J),不需要关心底层使用的是 Logback 还是 Log4j2。后期如果想更换日志实现,只需替换依赖,无需修改代码。<br>2. 避免日志冲突<br>项目中可能引入多个第三方库,它们可能使用不同的日志实现(比如有的用 Logback,有的用 Log4j)。<br>使用日志门面可以统一日志输出方式,避免多个日志框架共存带来的冲突问题。
springboot的日志门面+实现组合
springboot选用SLF4J(门面)和logback(实现)
日志级别
<br>1 TRACE 最详细的日志信息,通常用于调试<br>2 DEBUG 调试信息,用于开发阶段<br>3 INFO 普通信息,用于运行时状态输出 ---用于生产阶段 <br>4 WARN 警告信息,可能存在问题但不影响运行<br>5 ERROR 错误信息,发生异常或错误操作<br>日志级别为1~5,只会输出>=指定级别的日志:<br>比如设置级别为INFO,则会输出>=INFO级别的日志,也就是info、warn、error
springboot 过滤器和拦截器
vue3
vue3基础
环境安装
node.js
Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎任何类型项目的流行工具!
Node.js 在浏览器之外运行 V8 JavaScript 引擎,它是 Google Chrome 的核心。这使得 Node.js 非常高效.
npm
npm(node package manager - node包管理器/工具)
nodejs安装
nodejs 里面包含 npm
vue介绍
什么是vue
Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。
vue的特点
- 轻量:Vue.js库的体积非常小的,并且不依赖其他基础库<br>- 数据绑定:对于一些交互、状态机类似的前端UI界面,数据绑定非常简单、方便<br>- 指令:内置指令统一为(v—*),也可以自定义指令,通过对应表达值的变化就可以修改对应的DOM<br>- 插件化:Vue.js核心不包含Router、axios【Promise - ajax】、表单验证等功能,但是可以非常方便地根据需要加载对应插件<br>- 组件化,他支持自定义标签:组件可以扩展 HTML 元素,封装可重用的代码。允许我们使用小型、自包含和通常可复用的组件构建大型应用
渐进式框架
Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的,不同的开发者在 Web 上构建的东西可能在形式和规模上会有很大的不同。考虑到这一点,Vue 的设计非常注重灵活性和“可以被逐步集成”这个特点。根据你的需求场景,你可以用不同的方式使用 Vue
- 无需构建步骤,渐进式增强静态的 HTML<br>- 在任何页面中作为 Web Components 嵌入<br>- 单页应用 (SPA)<br>- 全栈 / 服务端渲染 (SSR)<br>- Jamstack / 静态站点生成 (SSG)<br>- 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面
vue入门
MVVM模式(面试题)
Vue 引入了MVVM (Model-View-ViewModel)模式。<br>- M :即Model,模型,包括数据和一些基本操作【js代码】<br>- V :即View,视图,页面渲染结果【页面】<br>- VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)
在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:
总结:MVVM的思想就是数据模型和视图的双向绑定,只要数据变化,视图会跟着变化,只要视图被修改,数据也会跟者变化。要依赖于v-model指令进行绑定
VUE表达式
表达式语法
- VueJS表达式写在双大括号内:{{ expression }}<br>- VueJS表达式把数据绑定到 HTML<br>- VueJS将在表达式书写的位置"输出"数据<br>- VueJS表达式 很像 JavaScript 表达式:它们可以包含文字、运算符和变量
三目运算符
{{ show1?"真":"假"}}
字符串操作
{{"这是字面值"}}<br/><br>{{"这是字面值".length}}<br/><br>{{message.length}}<br/><br>{{message.substring(1,5)}}<br/><br>{{message.substring(2,6).toUpperCase()}}<br/>
对象操作
数组操作
VUE指令
什么是指令
指令是一个带有v-前缀的特殊标签属性,指令属性的值预期是单个JavaScript表达式。
- 当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM<br>- 一个标签元素上可以出现多个指令属性<br>- 指令只能够出现在Vue对象所挂载的标签范围内的标签中
常见的指令
- v-text="表达式":设置标签中的纯文本,主要是指双标签。与vue表达式效果一样{{}}<br>- v-html="表达式":设置标签中的html文本,主要是指双标签<br>- v-bind="表达式:绑定属性值 - 简写:src=""<br>- v-show="":是否显示<br>- v-on="表达式":注册事件 - 简写@click=""<br> v-if(else else if)="表达式":条件判断 <br>- v-for="表达式":循环<br>- v-model="表达式":数据双向绑定
computed计算属性
计算属性本质就是方法,但是一定要返回数据。然后页面渲染时,可以把这个方法当成一个变量来使用
watch监听器
watch的作用是用来监听某个值的变化从而出发watch回调。watch可以:
- 监听单体数据<br>- 监听对象<br>- 监听对象的某个属性<br>- 监听多个数据
生命周期
生命周期概述
Vue3的生命周期是指组件从创建到销毁的整个过程,期间会触发一系列钩子函数,允许我们在特定阶段执行代码。理解生命周期有助于更好地控制组件行为。
两种API风格的生命周期:
选项式API(Options API):与Vue2类似的生命周期钩子
选项式API生命周期执行顺序
beforeCreate:组件实例初始化前调用,此时无法访问data和methods<br>created:组件实例创建完成,可访问data和methods,但DOM尚未生成<br>beforeMount:模板编译完成,准备挂载到DOM<br>mounted:组件挂载到DOM后调用,可进行DOM操作<br>beforeUpdate:响应式数据更新时触发,DOM尚未更新<br>updated:DOM更新完成后触发<br>beforeUnmount:组件卸载前触发,可进行清理工作<br>unmounted:组件卸载后触发,所有资源已释放
组合式API(Composition API):通过导入函数使用的生命周期钩子
组合式API生命周期执行顺序
setup() : 开始创建组件之前,在 beforeCreate 和 created 之前执行,创建的是 data 和 method<br>onBeforeMount() : 组件挂载到节点上之前执行的函数<br>onMounted() : 组件挂载完成后执行的函数<br>onBeforeUpdate(): 组件更新之前执行的函数<br>onUpdated(): 组件更新完成之后执行的函数<br>onBeforeUnmount(): 组件卸载之前执行的函数<br>onUnmounted(): 组件卸载完成后执行的函数<br>onActivated(): 被包含在 <keep-alive> 中的组件,会多出两个生命周期钩子函数,被激活时执行<br>onDeactivated(): 比如从 A 组件,切换到 B 组件,A 组件消失时执行<br>onErrorCaptured(): 当捕获一个来自子孙组件的异常时激活钩子函数
vue3的生命周期图
<br>
父子组件(重点)
父传参数给子
父组件
子组件
子传参数给父
子组件<br>- const $emits = defineEmits(["data2parent","事件2","事件3"]); 自定义了三个事件<br>- $emits('data2parent',"传给父组件的数据"); 调用自定义的事件
父组件
子传父 子暴露
子组件
父组件
注意:因为在父组件的setup函数中,声明周期很早,此时子组件还没加载,所以需要在onMounted去调用子暴露的数据和方法才可以拿到结果。
Hooks函数
第一步:定义一个src/hooks/user.js文件
<br>
第二步:组件中调用,先引入再调用,需要参数就传递,有返回值就去接收
<br>
vue3进阶
路由
安装路由依赖
首先,在项目根目录下打开终端,执行以下命令安装 vue-router<br>npm install vue-router@4
注意:Vue 3 必须对应 vue-router 的 4.x 版本
创建并配置路由文件
在 src目录下新建一个 router 文件夹,并在其中创建 index.js 文件(如果用TypeScript,可以是 index.ts)
<br>
在Vue应用中挂载路由
在根组件中使用路由app.vue
页面跳转
路由守卫
路由守卫就像**网站大门的安保系统**。当用户点击链接或输入网址试图跳转页面时,守卫会在“到达目标页面之前”拦住请求,检查“你是谁”、“你有没有权限”、“要不要先去别的地方”,通过检查才会放行。
<br>
使用守卫 拦截未登录的用户
<br>
在守卫里面进 拦截逻辑
<br>
路由添加拦截标记
<br>
localStorage和sessionStorage区别
localStorage
永久存储。除非用户手动清除浏览器缓存或调用代码删除,否则数据永远不会过期。
同源共享。
sessionStorage
临时存储。仅在当前会话(Session)中有效,关闭浏览器标签页(Tab)或窗口后,数据立刻被清除。
标签页隔离。仅限当前标签页(或当前窗口)
axios
安装axios
npm install axios --save<br># 或者使用 pnpm<br>pnpm add axios
封装axios
在src下面创建一个utils文件夹里面创建request.js
<br>
接口管理
在src项目创建api文件夹里面创建login.js
请求和响应拦截器
请求拦截器
<br>
扩展 在请求拦截器里面 防止重复提交
响应拦截器
<br>
vite配置
自定义指令
定义指令组件在src/command/permission.js
vue的配置文件
.env | **通用环境变量**,所有情况下都会加载。 | 是 <br>.env.local | **本地环境变量**,会覆盖 `.env` 中同名变量,用于本地个性化配置。 | **否** (应被忽略) |<br>.env.[mode] | **特定模式的环境变量**,只在指定的 `mode` 下加载,如 `.env.development`、`.env.production`。 | 是 |<br>.env.[mode].local | **特定模式下的本地环境变量**,优先级最高,且不应提交。 | **否** (应被忽略) |
收藏
立即使用
评论
0 条评论
下一页