文章目录
- 0. 交换机与路由器
- 1. java元数据(元注解)
- 2 循环依赖
- 3. bean使用
- 4. swagger简单注解
- 5. 日期计算:前推offsetHours小时
- 6. 定时任务crontab
- 7. Long(包装类)-128-127会缓存,大于127会new Long,这样就不相等了,应该转化为基本类型再比较
- 8. 反射需要从jvm方法区中去找Entity对象的类型信息,再找到字段对象的地址进行赋值,而set、get方式在方法栈中通过字段对象的引用句柄能直接找到地址进行赋值。
- 9. 用不到的集合即时clear()
- 10. put是幂等的,用来修改资源;post是非幂等的,用来新增资源
- 11. Arrays.asList()之后执行add()操作会报错
- 12. 入参参数名是属性:role.roleName = ?
- 13. String可以接收任何mysql类型
- 14. s1+=1,+=不会进行隐式自动类型转换,java编译器会对它进行特殊处理,可以正确编译
- 15. url中/{code},若值为空,则会报404,所以值可能为空就写成map形式:?code=
- 16. 行锁并不是锁这行记录,而是锁索引,一条sql用到了主键索引,就锁主键索引,一条sql用到了非主键索引,就会先锁非主键索引,再锁主键索引,没有索到索引就没有用到行锁,就会锁表
- 17. excel请求参数
- 18. URI RUL
- 19. aop
- 20. aop基于代理实现分为两种
- 21. post请求入参出参可以不用任何注解,但是只能有一个类型的入参
- 22. 领域模型 数据模型
- 23. options 预检请求
- 24. jakarta.ws.rs-api
- 25. 查询ip信息
- 26. sh是bash的一种模式
- 27. LocalDateTime会丢失秒,时间传参用字符串表示
- 28. bean生命周期
- 29. 返回码 204 服务器成功处理了请求,只是无返回内容
- 30. 拦截器
- 31. 直接使用aop,一个类搞定,不用配置
- 32. url中传参是string类型
- 33. get请求url中的参数不能为list
- 34. 在url中都是String类型
- 35. url中长度限制,各个浏览器不同,chrome浏览器限制是八千多个字符
- 36. jvm调优
- 37. 函数式接口
- 38. @SpringBootApplication
- 39 spring自动装配&依赖注入方式
- 40. springboot启动类main方法参数args
- 41. springboot的starter
- 42. SpringBoot启动流程
- 43. zookeeper集群管理
- 44. 抽象类
0. 交换机与路由器
- 路由器:寻址,转发(依靠 IP 地址)
交换机:过滤,转发(依靠 MAC 地址 - 路由器内有一份路由表,里面有它的寻址信息(就像是一张地图),它收到网络层的数据报后,会根据路由表和选路算法将数据报转发 到下一站(可能是路由器、交换机、目的主机)
交换机内有一张MAC表,里面存放着和它相连的所有设备的MAC地址,它会根据收到的数据帧的首部信息内的目的MAC地址在自己的表中查找,如果有就转发,如果没有就放弃 - 通过拓扑图我们应该知道:
每一个路由器与其之下连接的设备,其实构成一个局域网
交换机工作在路由器之下,就是也就是交换机工作在局域网内
交换机用于局域网内网的数据转发
路由器用于连接局域网和外网
1. java元数据(元注解)
- 概念:元数据就是数据的数据,信息的信息,比如你在编辑器上写了一篇作文,那么这篇作文的编码格式、占磁盘大小、文件修改时间这些就是元数据。在java中元数据有通过annotation体现,称为元注解(java四种类型:类、枚举、接口、注解(@Interface类型))。
另外像方法的栈深度就是方法的元数据,属于方法的stack属性。 - 常见元注解(java.lang.annotation包下有6个元注解,其中五个是用来修饰注解的,下面介绍其中四个)
- @Retention:修饰注解,指定注解可以保留到什么阶段
- RetentionPolicy.SOURCE:保留在源码中,将被编译器丢弃
- RetentionPolicy.CLASS:保留在class文件中可用,但会被jvm丢弃
- RetentionPolicy.RUNTIME:jvm运行时仍然存在,因此可以通过反射机制读取注解的信息。
- @Target:修饰注解,指定注解可以用在什么地方
- ElemenetType.CONSTRUCTOR-----------------------------构造器声明
- ElemenetType.FIELD ----------------------------------域声明(包括 enum 实例)
- ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明
- ElemenetType.METHOD ---------------------------------方法声明
- ElemenetType.PACKAGE --------------------------------包声明
- ElemenetType.PARAMETER ------------------------------参数声明
- ElemenetType.TYPE----------------------------------- 类,接口(包括注解类型)或enum声明
- @Documented 修饰注解,被此注解修饰的注解将包含在 javadoc 中。
- @Inherited 修饰注解,别它修饰的注解将有继承性。
- @Retention:修饰注解,指定注解可以保留到什么阶段
2 循环依赖
-
bean的声明周期:
定义-实例化-属性赋值-初始化-生存期-销毁 -
情况:
- a依赖a
- a依赖b,b依赖a
- a依赖b,b依赖c,c依赖a
-
前置条件:
- bean是单例的
- a注入b的方式为setter,b注入a的方式为setter和构造器
-
3个缓存就是3个map,都是单例池
- 一级缓存:singletonObjects,存放经过完整生命周期的bean
- 二级缓存:earlySingleObjects,存放未经过完整生命周期的bean,未完成属性赋值、初始化
- 三级缓存:singleFactories,工厂,二级缓存中存储的就是从这个缓存中获取到的对象
aop:原始对象(目标对象) 代理对象
3. bean使用
- @Autowired 根据类型
- @Resource 根据名称
- @Qualifier 根据名称->根据类型
- @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包:
- 在web.xml中配置拦截点所在文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
- applicationContext.xml中配置拦截器拦截点
<beans>
<bean id="haha" class="com.xin.HahaInceptor"/>
<aop:config>
<aop:point id="HahaPointCut" expression="execution(* com.xin.*Service.*(..))"/>
</aop:config>
</beans>
- 定义拦截器
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
- java -Xms 初始堆大小,默认值为物理内存的1/64
- 现在默认使用的垃圾回收器是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类型的属性,然后给他们赋值,方式分为:
- setter方法设值注入
- 构造器注入
- 接口注入,实现特定方法进行注入
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,可以独立启动,有自动配置,减少了很多配置
大致总结:
- 生成SpringApplication实例
- 运行main方法->run方法
- 构造一个StopWatch计时器,用来记录SpringBoot的启动时间 。
- 初始化监听器,获取SpringApplicationRunListeners并启动监听,用于监听run方法的执行。
- 创建并初始化ApplicationArguments,获取run方法传递的args参数。
- 打印banner和版本。
- 启动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
- @Configuration @EnableAutoConfiguration 进行自动配置
- @ComponentScan进行包扫描来构建ioc容器
43. zookeeper集群管理
leader 管理事务
follower 非事务,比如读操作
若leader挂了,则进行leader选举
SID:即Server ID
ZXID:即节点的更新程度,谁的zxid大,就选谁当leader,相同时,选myid大的当leader
MYID:myid文件中记录的数字
Nginx upstream server
44. 抽象类
抽象类的抽象方法必须被非抽象子类实现,抽象类不必须实现接口的方法