-------------------------
IDEA是热保存,能一直crtl+z撤销的,除非已经代码入库了,入库也能看到git上该文件历史记录/本地历史记录(看以前自己改了什么)
--------------------------
引用bean时候最好写明一下名字,防止以后有多个了,忘记引用哪个了
--------------------------------------------------
StringBuffer线程安全,怕就无脑用得了
---------------------------------------------------
代码复用:就会引用jar包
比如,你在开发一个电商网站,想要处理用户信息。可以使用Apache Commons Lang库,它的JAR包提供了许多实用的工具类。只需在项目中引用这个JAR包,然后你可以使用StringUtils类中的方法,例如StringUtils.isEmpty(userInput)来检查用户输入是否为空,这样可以避免重复编写相似的代码。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 请根据需要选择版本 -->
</dependency>
import org.apache.commons.lang3.StringUtils;
public class UserInputChecker {
public static void main(String[] args) {
String userInput = ""; // 假设这是用户输入的内容
if (StringUtils.isEmpty(userInput)) {
System.out.println("用户输入不能为空!");
} else {
System.out.println("用户输入为: " + userInput);
}
}
}
-------------------------------------------------------------------------------------------------------------------
Ideal中点击Crtl只是看到哪里调用,点接口的"实现"才是跳到实现类
双击就可以选中单词,再点击就会选中一整行,然后shift shift就可以查了(意思是不用crtl c+crtl v),debug时候也一样,查看值的时候,有时候需要走到最底层的地方拿出那一行赋值的地方来查看值
没有过滤条件的sql语句不要写,就是需要有where
-------------------------------------------------------------------------------------
一个maven项目需要clean再install成功之后(没报错)才能成功跑流水线,否则跑流水线会失败
----------------------------------------------------------------------------------
DeveOps制品、介质概念:
在DevOps中,制品指的是软件交付过程中的可交付成果,如代码、构建产物和文档等,可以是你开发的应用程序或更新的代码包,比如一个新的手机应用。介质则是指支持协作和自动化的工具和流程,比如CI/CD管道、版本控制系统和监控工具 ,是你用来发布这些应用的工具,比如Git(用于代码管理)和Jenkins(用于自动化构建和部署)。
IBMjdk与Openjdk:
IBMjdk: 由IBM开发和维护,通常与IBM的其他软件和硬件解决方案紧密集成 提供商业支持和长期维护,特别适合在企业环境中使用。
Openjdk: 一个开源的Java开发工具包,由Java社区和Oracle主导开发,作为Java SE的参考实现。虽然是开源的,支持主要依赖于社区,更新频率较高,但缺乏官方的商业支持。
很重要:
JRE、JDK、JVM、JavaEE,JavaSE,JavaME区别_jdk1.8是j2ee还是javaee-CSDN博客
JVM->JRRE->JDK
在安装JRE或者JDK的时候,需要根据操作系统来下载不同的版本,而JDK和JRE里面已经包括了JVM
包括JAVA虚拟机和JAVA程序所需的核心类库,如果想要运行一个开发好的JAVA程序,计算机中只要安装JRE即可
JDK是提供给JAVA开发人员使用的,其中包含了JAVA的开发工具,也包括了JRE
--------------------------------
java SE(Java Platform,Standard Edition),应该先说这个,因为这个是标准版本。
Java EE (Java Platform,Enterprise Edition),java 的企业版本
Java ME(Java Platform,Micro Edition),java的微型版本。
JavaSE 可以开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。是EE,和ME的基础。一般就是指JDK。就是Java的基础语法(变量、方法、类之间的调用、关系,继承、接口、线程之类的),工具包(java.util.* ),或者其他的一些封装,是学习其他的基础。
JavaEE,其实是一套规范,就是用java语言做企业开发(目前看来就是开发一些动态网站,或者对外提供调用服务的网站,或者其他没接触过的)中的一整套规范,比如类怎么封装,网页的请求要用什么方法处理,语言编码一类的处理,拦截器啊什么的定义,请求返回得有什么信息(具体看servlet的接口就知道了)
比如:tomcat就是按照这套规范开发的容器软件,还有什么weblogic,JBoss、Resin等等
正因为我们开发网站(使用JSP,Servelet或者封装了这些的框架:SSH)可以放在tomcat,也可以放在JBoss,因为都是按照一个规范开发的东西,实际使用的还是JavaSE的那些东西,多出来的就是EE的一些规范类的封装代码。
JavaME 是微型版本,顾名思义,使用在手机啊,小设备上面的Java版本,特点就是小,相比JavaSE精简了很大一部分东西,(增加了一些小设备上的专有API,这个不是很确定)。
安卓中既然用的是Java,那么Java的语法应该都是适用的。所以SE是核心基础。其他的都是使用方法方式不同。
-------------------------------------------------------------
javaSE:
Java SE(Java Platform, Standard Edition)是Java编程语言的标准版本,提供了开发和运行Java应用程序所需的基本功能。它包括以下主要组件:(以下看不懂无所谓,不是人话,就是一种语言结构,平时正常用即可,我理解是比如导入一些包应该就是相当于使用了它)
-
核心库:
- 提供基本的数据结构、算法和输入输出功能,比如
java.util
和java.io
包。
- 提供基本的数据结构、算法和输入输出功能,比如
-
Java虚拟机(JVM):
- 负责执行Java字节码,提供跨平台运行的能力。
-
Java开发工具:
- 包括编译器(javac)、文档生成工具(javadoc)等,帮助开发者编写和管理Java代码。
-
图形用户界面(GUI)支持:
- 提供Swing和JavaFX等库,支持创建桌面应用程序的图形界面。
-
网络编程:
- 提供Socket编程、HTTP请求处理等功能,方便进行网络应用开发。
-
多线程:
- 提供支持多线程编程的API,使得开发并发应用变得更简单。
---------------------------------------------------------------------------------------
kubernetes(k8s)与docker:
虚拟机->容器->docker(越来越轻便)
一文了解docker与k8s-CSDN博客
以下是该链接核心内容(我认为):
容器化解决了什么问题?
用一段话描述:
测试人员:你这个功能有问题。
开发人员:我本地是好的呀!
开发人员编写代码,在自己本地环境测试完成后,将代码部署到测试或生产环境中经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug,原因有很多:不同的操作系统、不同的依赖库等。
总结一句话:因为本地环境和远程环境不一致。
容器化技术正好解决了这一关键问题,它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中,镜像中详细列出了所依赖的环境,在不同的容器中运行标准化的镜像,从根本上解决了环境不一致的问题。
注:容器的概念已经出现不短的时间。但直到 2013 年开源项目 Docker 的出现才极大推广了容器这项技术,并推动了软件开发中容器化和微服务的趋势,这种趋势后来被称为云原生开发。
Docker如何使用
其实大多数人谈论 Docker 时说的是 Docker Engine,这只是一个构建和运行的容器。
在运行容器前需要编写 Docker File,通过 dockerFile 生成镜像,然后才能运行 Docker 容器。
Docker File 定义了运行镜像(image)所需的所有内容,包括操作系统和软件安装位置。一般情况下都不需要从头开始编写 Docker File,在 Docker Hub 中有来自世界各地的工程师编写好的镜像,你可以基于此修改。
入门级容器技术解析:Docker和K8s的区别与关系-CSDN博客
- Docker与Kubernetes的协作:Kubernetes通常使用Docker作为其容器运行时。你可以使用Docker来构建和打包应用的容器,然后使用Kubernetes来管理和编排这些容器。(详情见小白debug公众号)
- 使用场景:
- Docker:适合开发和测试环境,快速构建和运行容器化应用。
- Kubernetes:适合生产环境,特别是在需要管理多个容器和微服务架构时。
--------------------------
------------------------------------------------------------------------------------
处理器架构:
os架构有:x86 aarch64(ARM)
不同架构所需要的(算法)驱动文件不一样,需要注意,一般找厂商拿的
- x86:Intel和AMD的架构,广泛用于个人计算机和服务器。
- x86_64:x86的64位扩展,支持更大的内存和更高的性能。
- ARM:用于移动设备和嵌入式系统,具有低功耗特性。
- AArch64(又叫ARM64):ARM架构的64位版本,适用于服务器和高性能计算。
- RISC-V:开放的指令集架构,正在逐渐获得关注,适用于各种应用。
- --------------------------------------------------------------------------------
------------------------------------------------------------------------
软负载与硬负载:
软负载均衡通常指基于软件实现的负载均衡,它通过应用程序或软件层进行流量分配。实现方式:通常通过反向代理服务器(如Nginx、HAProxy等)或应用层负载均衡器实现
- 适用于流量波动较大或需要快速调整的环境。
- 常用于Web服务器、API服务等。
硬负载均衡是指通过专用的硬件设备来实现负载均衡。这些设备通常被称为负载均衡器,专门设计用于流量分配。
硬件设备通常具有较高的可靠性和稳定性,适合高负载场景:
- 适用于需要处理大量流量的企业级应用、在线交易平台等。
- 常见于数据中心和大规模云计算环境。
-------------------------------------------------------------------------------------------------------------------
跨域(可以看那个黑马视频):
----------------------------------------------------------
通俗说ngnix:(有时间/用到之后再仔细学)
Nginx(发音为“engine-x”)是一个高性能的开源Web服务器和反向代理服务器,主要用于处理HTTP和HTTPS请求。
反向代理是一种服务器配置,它接收客户端的请求,并将这些请求转发给一个或多个后端服务器进行处理。客户端并不知道具体的后端服务器,而是只与反向代理服务器进行交互。反向代理可以将用户请求均匀分配到多台后端服务器,从而避免单个服务器的过载,提高系统的整体性能和可靠性。
假设你有一个在线商店,使用Nginx可以这样配置:
- 当用户访问网站时,Nginx接收请求。
- Nginx将请求转发到多个应用服务器,这些服务器处理订单、用户登录等操作。
- Nginx将响应结果(如订单确认)返回给用户。
总之,Nginx是一款功能强大的服务器软件,适合用于各种规模的网站,尤其是需要处理大量请求的场景。
-------------------------------------------------------------------------------------------
通俗说netty:(有时间/用到之后再仔细学)
Nginx五个作用和应用举例_nginx的作用-CSDN博客
Netty 是一个高性能的网络应用框架,主要用于快速开发网络应用,比如服务器和客户端。可以将其通俗理解为一个“工具箱”,帮助开发者更轻松地处理网络通信。
TCP服务器:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.SimpleChannelInboundHandler;
public class NettyServer {
public static void main(String[] args) throws Exception {
// 创建事件循环组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 创建服务器引导程序
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println("接收到消息: " + msg);
ctx.writeAndFlush("你好, 客户端!\n");
}
});
}
});
// 绑定端口并启动服务器
ChannelFuture future = bootstrap.bind(8080).sync();
System.out.println("服务器已启动,监听端口 8080");
future.channel().closeFuture().sync();
} finally {
// 优雅关闭
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
}
客户端:
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.channel.SimpleChannelInboundHandler;
public class NettyClient {
public static void main(String[] args) throws Exception {
// 创建事件循环组
EventLoopGroup group = new NioEventLoopGroup();
try {
// 创建客户端引导程序
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println("接收到服务器消息: " + msg);
}
});
}
});
// 连接到服务器
ChannelFuture future = bootstrap.connect("127.0.0.1", 8080).sync();
future.channel().writeAndFlush("你好, 服务器!\n");
future.channel().closeFuture().sync();
} finally {
// 优雅关闭
group.shutdownGracefully();
}
}
}
代码说明:
- NettyServer:创建一个TCP服务器,监听8080端口。当接收到消息时,它会打印消息并回复客户端。
- NettyClient:创建一个TCP客户端,连接到服务器,发送一条消息,并接收服务器的响应。
运行步骤:
- 首先运行
NettyServer
类,启动服务器。 - 然后运行
NettyClient
类,客户端将连接到服务器并发送消息。
-------------------------------------------------
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
--------------------------------------------------
nos:NOS通常指的是“网络操作系统”(Network Operating System)?存储在nos节点?
-------------------------------------
Cocoa
----------------------------------
学习解决git合并冲突
手撕rpc框架/http框架,做个demo
如何用udp实现tcp
------------------------------------------------------------
重要:
@configuration注解:
@Configuration
在Spring 3.0之前,配置都是通过XML完成的。Spring 3.0引入了一个新特性: 基于Java的配置,这就是@Configuration注释的来源。
@Configuration注解用于定义配置类,这些类是使用基于 Java 的应用程序配置来代替或者与XML结合的一种方法。配置类可以是包级别的,也可以是嵌套的。它们允许你使用@Bean注解定义方法。这些方法会创建由Spring容器管理的对象。
细节性东西:
@Configuration和@Bean注解的关系以及使用细节_java的configuration注解和bean注解的关系-CSDN博客
@Configuration 和 @Component 到底有啥区别?_configuration和component的区别-CSDN博客
从底层看@Configuration
注解本质上还是 @Component
@Component 注解也会当做配置类
Spring 注解中 @Configuration 和 @Component 的区别总结为一句话就是:
@Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。
-------------------------------------------------------------------
具体使用:
@Configuration注解使用详解【记录】-CSDN博客
@Configuration
public class MyConfig {
@Bean("user")
public User getUser(){
System.out.println("User对象进行创建!");
return new User("用户", 22, getDog());
}
@Bean("dog")
public Dog getDog(){
System.out.println("Dog对象进行创建!");
return new Dog("金毛", 3);
}
}
常常一起搭配使用的注解有@Bean 配置类里面使用@Bean
标注在方法上给容器注册组件,默认是单实例的。
@Scope
:用于声明该bean的作用域,作用域有singleton(单例)、prototype(多例)、request、session。
-
其底层代码就两个属性,一个用于声明配置类的名称,一个用于声明是否是代理对象方法(重点)。
-
由于底层有@Component注解的加持,那么被声明的配置类本身也是一个组件!