一,日志架构历史

1.1log4j
很多年前,一个叫 Ceki Gülcü 的大佬在一个项目中开发跟踪 API,这套跟踪 API 逐步演变成 log4j, 大概1999年,log4j 成为 Apache 的一员。

很多年前,一个叫 Ceki Gülcü 的大佬在一个项目中开发跟踪 API,这套跟踪 API 逐步演变成 log4j, 大概1999年,log4j 成为 Apache 的一员。
第一步:导入对应的jar:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
github下载地址:https://github.com/Molunerfinn/PicGo/releases
天翼网盘安装地址:https://cloud.189.cn/web/share?code=QjeQnqymQVra(访问码:g3ze)
git的下载方式:

双击运行安装包:

自定义安装的目录,直接下一步:

点击安装即可完成安装PicGo:

mybatis的简单使用案例
public class App {
public static void main(String[] args) {
String resource = "mybatis‐config.xml";
Reader reader;
try {
//将XML配置文件构建为Configuration配置类
reader = Resources.getResourceAsReader(resource);
// 通过加载配置文件流构建一个SqlSessionFactory DefaultSqlSessionFactory
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
// 数据源 执行器 DefaultSqlSession
SqlSession session = sqlMapper.openSession();
try {
// 执行查询 底层执行jdbc
//User user = (User)session.selectOne("com.tuling.mapper.selectById", 1);
UserMapper mapper = session.getMapper(UserMapper.class);
System.out.println(mapper.getClass());
User user = mapper.selectById(1L);
System.out.println(user.getUserName());
} catch (Exception e) {
e.printStackTrace();
}finally {
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
假设两个人A、B两个情报员,需要通过书信交流情报。AB双方想要真正交流情报,首先需要建立交流渠道、需要确保自己能发(SYN)且别人能收(ACK):
二次握手:
A:“你能收到我写的信吗?”(A:SYN)
B:“我能收到你写的信!你能收到我写的信吗?”(B:ACK-B:SYN)
三次握手:
A:“你能收到我写的信吗?”(A:SYN)
B:“我能收到你写的信!你能收到我写的信吗?”(B:ACK-B:SYN)
A:“我也能收到!”(A:ACK)
四次握手:
A:“你能收到我写的信吗?”(A:SYN)
B:“我能收到你写的信!”(B:ACK)
B:“你能收到我写的信吗?”(B:SYN)
A:“我也能收到!”(A:ACK)
好的,我们现在解释一下常见的问题。
问题1:为什么TCP二次握手不可以?
根据二次握手中A和B的交流、可以发现A可以确定自己能发(SYN)、B能收(ACK),但是B只能确定自己能发(SYN),A能不能收(ACK)到这就不确定了。试想一下你和你朋友写信,一直没收到朋友的回信,你还会继续写下去吗,你会怀疑自己是不是发的地址不对,或者朋友没有收到信,再说写下去也是白写,平白浪费时间。
问题2:为什么不是四次握手?
根据四次握手中A和B的交流、可以发现A可以确定自己能发(SYN)、B能收(ACK),B也能确定自己能发(SYN),A能收(ACK)到。那为什么不采用四次握手?因为B家没钱,为了节省钱,就写了一封信做了两件事,回答朋友的问题并问出自己的问题。
引入jar:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
下载sentinel的jar:
Java -jar sentinel-dashboard-1.8.8.jar
IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:BIO,NIO,AIO
代码示例:
public class BIO {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
while (true){
System.out.println("----->1,等待客户端连接<-------");
Socket clientSocket = serverSocket.accept(); // 建立连接
System.out.println("----->2,客户端连接完成<-------");
byte[] bytes = new byte[1024];
System.out.println("----->3,等待客服端发送数据<-------");
int read = clientSocket.getInputStream().read(bytes);
System.out.println("----->4,读取客服端发送数据完成<-------");
if(read != -1){
System.out.println("----->5,接收到客户端的数据:" + new String(bytes, 0, read));
}
}
}
}
mybatis作为一个应用广泛的优秀的ORM开源框架,这个框架具有强大的灵活性,在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插件扩展机制。Mybatis对持久层的操作就是借助于四大核心对象。MyBatis支持用插件对四大核心对象进行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象,插件是通过代理的方式增强,缓存是通过装饰的方式增强。
①,直接赋值字符串
String s = "zyh"; // s指向常量池中的引用