java基础知识记录-持续更新篇

文章目录

0. 交换机与路由器

博客链接
在这里插入图片描述

  1. 路由器:寻址,转发(依靠 IP 地址)
    交换机:过滤,转发(依靠 MAC 地址
  2. 路由器内有一份路由表,里面有它的寻址信息(就像是一张地图),它收到网络层的数据报后,会根据路由表和选路算法将数据报转发 到下一站(可能是路由器、交换机、目的主机)
    交换机内有一张MAC表,里面存放着和它相连的所有设备的MAC地址,它会根据收到的数据帧的首部信息内的目的MAC地址在自己的表中查找,如果有就转发,如果没有就放弃
  3. 通过拓扑图我们应该知道:
    每一个路由器与其之下连接的设备,其实构成一个局域网
    交换机工作在路由器之下,就是也就是交换机工作在局域网内
    交换机用于局域网内网的数据转发
    路由器用于连接局域网和外网
    在这里插入图片描述

1. java元数据(元注解)

  1. 概念:元数据就是数据的数据,信息的信息,比如你在编辑器上写了一篇作文,那么这篇作文的编码格式、占磁盘大小、文件修改时间这些就是元数据。在java中元数据有通过annotation体现,称为元注解(java四种类型:类、枚举、接口、注解(@Interface类型))。
    另外像方法的栈深度就是方法的元数据,属于方法的stack属性。
  2. 常见元注解(java.lang.annotation包下有6个元注解,其中五个是用来修饰注解的,下面介绍其中四个)
    1. @Retention:修饰注解,指定注解可以保留到什么阶段
      1. RetentionPolicy.SOURCE:保留在源码中,将被编译器丢弃
      2. RetentionPolicy.CLASS:保留在class文件中可用,但会被jvm丢弃
      3. RetentionPolicy.RUNTIME:jvm运行时仍然存在,因此可以通过反射机制读取注解的信息。
    2. @Target:修饰注解,指定注解可以用在什么地方
      1. ElemenetType.CONSTRUCTOR-----------------------------构造器声明
      2. ElemenetType.FIELD ----------------------------------域声明(包括 enum 实例)
      3. ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明
      4. ElemenetType.METHOD ---------------------------------方法声明
      5. ElemenetType.PACKAGE --------------------------------包声明
      6. ElemenetType.PARAMETER ------------------------------参数声明
      7. ElemenetType.TYPE----------------------------------- 类,接口(包括注解类型)或enum声明
    3. @Documented 修饰注解,被此注解修饰的注解将包含在 javadoc 中。
    4. @Inherited 修饰注解,别它修饰的注解将有继承性。

2 循环依赖

  • bean的声明周期:
    定义-实例化-属性赋值-初始化-生存期-销毁

  • 情况:

    1. a依赖a
    2. a依赖b,b依赖a
    3. a依赖b,b依赖c,c依赖a
  • 前置条件:

    1. bean是单例的
    2. a注入b的方式为setter,b注入a的方式为setter和构造器
  • 3个缓存就是3个map,都是单例池

    1. 一级缓存:singletonObjects,存放经过完整生命周期的bean
    2. 二级缓存:earlySingleObjects,存放未经过完整生命周期的bean,未完成属性赋值、初始化
    3. 三级缓存:singleFactories,工厂,二级缓存中存储的就是从这个缓存中获取到的对象
      aop:原始对象(目标对象) 代理对象
      在这里插入图片描述

3. bean使用

  1. @Autowired 根据类型
  2. @Resource 根据名称
  3. @Qualifier 根据名称->根据类型
  4. @Inject 根据类型,常与@Named一起使用,属于JSR330

4. swagger简单注解

@Api(“用户管理服务”):放在接口上
@ApiOperation(value=“通过客户名称,查询合规的客户”):放在方法上,描述接口的作用
@ApiImplicitParams({@ApiImpliciParam(),…}):放在方法上,一些参数是否必填

5. 日期计算:前推offsetHours小时

String offsetHours = "3";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR, Integer.parseInt(offsetHours));
Date date = calendar.getTime();
String dateStr = dateFormat.format(date);
System.out.println(dateStr);SimpleDate

在这里插入图片描述

6. 定时任务crontab

0 0 6 * * ? *
秒 分 时 日 月 周 年
每天六点执行

7. Long(包装类)-128-127会缓存,大于127会new Long,这样就不相等了,应该转化为基本类型再比较

8. 反射需要从jvm方法区中去找Entity对象的类型信息,再找到字段对象的地址进行赋值,而set、get方式在方法栈中通过字段对象的引用句柄能直接找到地址进行赋值。

9. 用不到的集合即时clear()

10. put是幂等的,用来修改资源;post是非幂等的,用来新增资源

11. Arrays.asList()之后执行add()操作会报错

Arrays.asList()之后执行add()操作会报UnSupportedOprationException,因为Arrays.asList()实现中的new ArrayList,这个ArrayList不是util包下的类,而是Arrays类下的内部类,这个内部类没有实现add方法,而它的add方式是继承AbstractList,这个抽象类的add方法会直接报不可操作异常。
解决办法:用com.google.common.collect.Lists.newArrayList();

12. 入参参数名是属性:role.roleName = ?

入参是role.roleName = xiaohua,可以用userVO.getRole.getRoleName接收,
入参是第二层属性可以加“.”实现

13. String可以接收任何mysql类型

14. s1+=1,+=不会进行隐式自动类型转换,java编译器会对它进行特殊处理,可以正确编译

而 short s1 = 1;
s1 = s1 + 1; 1是int类型,这里需要进行强制类型转换

15. url中/{code},若值为空,则会报404,所以值可能为空就写成map形式:?code=

16. 行锁并不是锁这行记录,而是锁索引,一条sql用到了主键索引,就锁主键索引,一条sql用到了非主键索引,就会先锁非主键索引,再锁主键索引,没有索到索引就没有用到行锁,就会锁表

17. excel请求参数

name Text 文件名
file File 挑选文件

18. URI RUL

url(同一资源定义符)是uri(统一资源标识符)的一种实现方式

19. aop

切入点:@PointCut(@annotation());
类:@Aspect;
方法:@AfterReturning

20. aop基于代理实现分为两种

jdk动态代理基于接口;
cglib动态代理基于类;
动态代理底层用到了反射机制

21. post请求入参出参可以不用任何注解,但是只能有一个类型的入参

22. 领域模型 数据模型

领域模型:引用值对象;
数据模型:将值对象的属性分散开;

23. options 预检请求

get:查询信息;
post:非幂等性,新增信息;
put:幂等性,修改信息;
delete:删除信息

24. jakarta.ws.rs-api

<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>

注解:@POST @GET @PATH @Inject @PathParam @QueryParam @HeaderParam

25. 查询ip信息

windows:ipconfig /all
linux:ifconfig

26. sh是bash的一种模式

27. LocalDateTime会丢失秒,时间传参用字符串表示

28. bean生命周期

定义-实例化-属性赋值-初始化-生存期-销毁

29. 返回码 204 服务器成功处理了请求,只是无返回内容

30. 拦截器

war包:

  1. 在web.xml中配置拦截点所在文件
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>
  1. applicationContext.xml中配置拦截器拦截点
<beans>
	<bean id="haha" class="com.xin.HahaInceptor"/>
	<aop:config>
		<aop:point id="HahaPointCut" expression="execution(* com.xin.*Service.*(..))"/>
	</aop:config>
</beans>
  1. 定义拦截器
public class HahaInterCeptor implements MethodInterceptor {
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable{
		sout
	}
}

31. 直接使用aop,一个类搞定,不用配置

31.1 切面类(给自定义注解加切面拦截)

package com.xin.demo.aopdemo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import javax.inject.Named;

@Aspect
@Named
public class HahaAspect {
    
    // @Pointcut(value = "execution(* com.xin..*Service.*(..))")
    @Pointcut("@annotation(com.xin.demo.aopdemo.Haha)")
    public void pointCut() {}

    @AfterReturning(value = "pointCut()", returning = "value")
    public void injectName(JoinPoint joinPoint, Object value) {
        System.out.println("haha");
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Haha haha = signature.getMethod().getAnnotation(Haha.class);
        Haha.Field[] fields = haha.fields();
    }
}

31.2 自定义注解

package com.xin.demo.aopdemo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
public @interface Haha {
    Field[] fields() default {};

    public @interface Field {
        String prefix() default "";
        Extend[] extendParam() default {};
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Extend {
        String key() default "";
        String value() default "";
    }

}

31.3 自定义注解使用

package com.xin.demo.aopdemo;

public class HahaService {
    @Haha(fields = {
            @Haha.Field(prefix = "result"),
            @Haha.Field(prefix = "result1")})
    public String hahaha() {
        return "hh";
    }
}

32. url中传参是string类型

url中传参String类型不需要用引号括起来,不然内容会包含引号,但在请求体中String类型需要用引号括起来

33. get请求url中的参数不能为list

例:
用openFeign调用外部接口,用接口类型是get,入参vo中的属性若有list,解析不了

34. 在url中都是String类型

在url中都是String类型,像haha1 = 3&haha2=4,在controller层用String和Integer接收皆可,会自动解析成相关类型,若controller入参是list类型也是可以接收的,但只会认为url中的那个参数值是集合中的一项。
传集合可以在url中将集合中的项用逗号隔开组成String类型,在java中做拆分。

35. url中长度限制,各个浏览器不同,chrome浏览器限制是八千多个字符

36. jvm调优

  • jps -m 查看进程信息
  • jps -v 查看jvm的一些设置参数
  • jstat -gc pid 查看进程的gc信息
  • jvisualvm 查看jvm的一些使用情况
  • arthas dashboard 查看堆gc情况
  • springcloud的admin 查看jvm情况
  • 设置:
    • java -Xms 初始堆大小,默认值为物理内存的1/64
      java -Xmx 最大堆大小,默认值为物理内存的1/4,将这两个值设置为一样,可以防止扩缩容
    • java -XX:NewRatio=2 old区:young区=2:1
      java -XX:SurvivorRatio=8 eden:survivor=8:1
  • 现在默认使用的垃圾回收器是ParallelOldGC

37. 函数式接口

Predicate 返回布尔值
Consumer 有入参,无返回值
Supplier 无入参,有返回值
Function 有入参,有返回值

38. @SpringBootApplication

  • @ComponentScan:@Component @Repository @Service @Controller
  • @EnableAutoConfiguration
  • @SpringBootConfiguration
  • @Target({ElementType.TYPE}) Field Method
  • @Retention(RetentionPolicy.RUNTIME)
  • @Documented
  • @Inherited

39 spring自动装配&依赖注入方式

39.1 spring自动装配

从spring上下文中找到对应的依赖自动装配bean的属性,装配类型分为xml配置bean和注解,一般都是使用注解
常用自动装配的注解(找到属性是哪个bean,基本分为byname,bytype):
@Rource 根据名称
@Qualifier 根据名称->根据类型
@Autowired 根据类型 JSR 250
@Inject 类型类型 加@Named 根据名称 JSR 330

39.2 spring可以从上下文中拿到bean来装配自己的bean的属性,那它是怎么把依赖中的类放入ioc容器中成为bean的呢

@CompomentScan注解只能扫描本项目内的bean到ioc容器中,还需要@EnableAutoConfiguration注解来将pom文件中依赖的bean注入进来,而各个依赖下的META-INF文件夹下的spring.factories文件就是用来记录自动配置类的,再将这些配置类加加载类到ioc容器中成为bean,配置类会有@Configuration和@ComponentScan注解,@ComponentScan注解的value属性可以指定扫描路径,启动类的这个注解没有设置value属性,默认是启动类所在的包及其自动,也可以自己在配置类的这个@ComponentScan注解上配置

39.3 依赖注入方式

给具体属性赋值,这个属性已经不是bean,而是bean下面的最底层的类型属性,比如string类型,integer类型的属性,然后给他们赋值,方式分为:

  1. setter方法设值注入
  2. 构造器注入
  3. 接口注入,实现特定方法进行注入

40. springboot启动类main方法参数args

@SpringBootApplication
@EnableEurekaServer // 开启eureka的注册中心的功能
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

设置program arguments,这个就是args参数:
在这里插入图片描述
启动并查看:
在这里插入图片描述

41. springboot的starter

使用过springboot的同学都知道,相比于spring在配置pom文件时候的各种复杂依赖关系,springboot整合了很多的第三方依赖使用起来相当的方便。
在使用的过程中,我们经常能在pom文件中看到很多springboot的starter依赖,starter中简单来讲就是引入了一些相关依赖和一些初始化的配置,比如配置就是找META-INF下的spring.factories文件中的配置的配置类

42. SpringBoot启动流程

springboot是jar,内嵌tomcat,可以独立启动,有自动配置,减少了很多配置
在这里插入图片描述
大致总结:

  1. 生成SpringApplication实例
  2. 运行main方法->run方法
  3. 构造一个StopWatch计时器,用来记录SpringBoot的启动时间 。
  4. 初始化监听器,获取SpringApplicationRunListeners并启动监听,用于监听run方法的执行。
  5. 创建并初始化ApplicationArguments,获取run方法传递的args参数。
  6. 打印banner和版本。
  7. 启动servlet容器,比如tomcat、jetty
在refreshContext(context);
方法中会一直调到ServletWebServerApplicationContext类的onRefresh()方法中,其中createWebServer();
就会开始创建tomcat容器,在该方法中会先找到容器中有哪一种的ServletWebServerFactory,
再通过factory.getWebServer(getSelfInitializer())来创建容器
————————————————
版权声明:本文为CSDN博主「weixin_44778850」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44778850/article/details/128363791
  1. @Configuration @EnableAutoConfiguration 进行自动配置
  2. @ComponentScan进行包扫描来构建ioc容器

43. zookeeper集群管理

leader 管理事务
follower 非事务,比如读操作
若leader挂了,则进行leader选举
SID:即Server ID
ZXID:即节点的更新程度,谁的zxid大,就选谁当leader,相同时,选myid大的当leader
MYID:myid文件中记录的数字
Nginx upstream server

44. 抽象类

抽象类的抽象方法必须被非抽象子类实现,抽象类不必须实现接口的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值