一个0阶JAVA实习生的学习笔记(杂乱版)

注解篇

Lombok

@Builder:实现构造器模式。❗子类的Builder方法不包含父类的属性❗。使用builder()初始化:

Builder builder = Builder.builder().name("buildername").build();

@Data:生成get()、set()、toString()等。
@AllArgsConstructor:生成全参构造函数。
@NoArgsConstructor:生成无参构造函数。
@Getter、@Setter:可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法;放在属性上,会对该属性生成Getter/Setter方法。

spring

@Async:Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步。
@Slf4j :在类中自动生成一个名为 log 的日志对象。
@Tag:标签(没有Tag在swagger文档内无法找到)。
@Operation:描述API接口信息。
@Parameter:传参。
@RequestMapping:映射web请求(如URL路径)到具体的方法上。可以标注在类、方法上。标注在类上时,表示类中的所有响应请求的方法都是以该类路径为父路径。
@PostMapping:组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。用于处理HTTP POST请求的方法,只能标注在方法上。仅响应POST请求。
@GetMapping:组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。用于处理HTTP GET请求的方法,只能标注在方法上。仅响应GET请求。
@PutMapping:put请求是从客户端向服务端发送数据,但与post不同的是,put真正的目的其实是执行大规模的替换操作,而不是更新操作。
@PatchMapping:patch的目的是对资源数据打补丁或局部更新。
@DeleteMapping :便捷的声明能够处理DELETE请求的方法。
@GetMapping:映射HTTP GET请求到特定的处理方法上。它常用于从服务器检索信息。
@PathVariable:映射 URL 绑定的占位符。“/get/{id}”->“@PathVariable("id") String id”-->“/get/1”
@RequestParam:将指定的请求参数赋值给方法中的形参(可带默认值,给了方法名,前端需要有对应的名字)。“/delete”->“@RequestParam("ids") String ids”--> “delete?ids=1”
@RequestBody:接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,使用@RequestBody接收数据时,不能用GET方式提交数据,而用POST等方式进行提交。
@JsonProperty:用于属性上,作用是把该属性的名称序列化为另外一个名称。
@Autowired:对类成员变量、方法及构造函数进行标注,完成自动装配。
@Resource:依赖注入   仅bean可以使用这个注入。
@Component:定义组件(bean),Spring容器管理的类,当被标记时,Spring容器将会在启动时自动扫描并将其实例化为一个Bean。@Controller, @Service, @Repository是@Component的细化。
@Service: 标注业务层,主要用来进行业务的逻辑处理。
@Repository:用于标注持久层,也可以说用于标注数据访问组件,即DAO组件。
@RestController:标记类是一个控制器,并且其下的方法都将返回数据作为响应,默认将所有方法的返回值自动序列化为响应体。结合了@Controller和@ResponseBody。
@ResponseBody:标识方法返回的内容应该作为HTTP响应的正文部分返回给客户端。
@Controller:标注控制层。将一个类标识为处理HTTP请求的控制器。这意味着,被@Controller注解标记的类可以接收并处理来自客户端的请求,并生成对应的响应。
@Valid:数据校验;可以作用于方法、属性(包括枚举中的常量)、构造函数、方法的形参上。参数校验:@NotNull、@NotEmpty、@NotBlank(String去除空格后长度大于0)、@AssertTrue(为true)、@Pattern(value)(正则校验)、@Email等。
@Schema:描述数据模型,包括类和属性,用于取代 Swagger 2 中的 @ApiModelProperty。
@PostConstruct:在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。在构造函数之后,init()方法之前运行。
@PreDestroy:在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。在destroy()方法之后运行,在Servlet被彻底卸载之前。
@SpringBootApplication(scanBasePackages = {"aaaa","bbbb"})   //指定要扫描的包
@MapperScan("com.xx.xxx.xxx.mapper")    //扫描mapper文件
@DateTimeFormat:实体类日期字段、字段set方法、方法入参上,在URL传参时,格式化前端传向后端日期类型的时间格式。
@JsonFormat:JSON传参,格式化前端传参和后端返回给前端的时间格式。
@Decrypt:自定义注解(解密)。
@Encrypt:自定义注解(加密)。
@Qualifier:在类(注入到IOC容器的bean的唯一标识(id),再使用到该Bean的地方就可直接根据唯一标识(id)从IOC容器中获取)、属性(可以直接通过Bean的唯一标识(id)进行装配)、参数(指定Bean的唯一标识,让参数的指定的Bean绑定起来;具有同样指定Bean唯一标识的@Resource在此无法在参数中使用)、方法(筛选,仅有@Qualifier的Bean才会被收集注入到本方法)上。
@Seria:指定类的序列化版本号的预定义注解。确保在反序列化的时候,序列化对象版本号与反序列化对象的版本匹配,避免因版本不匹配而导致的反序列化失败的问题。
@EnableSecurity:自动应用默认的安全配置,并创建一个基本的安全上下文。
@ComponentScan:批量注册bean。让spring去扫描某些包及其子包中所有的类,将满足一定条件的类作为bean注册到spring容器容器中。
@AutoConfiguration:自动装配类的组合注解。
@EnableWebMvc:在基于Java的Spring应用程序中启用Spring MVC配置。
@JsonIgnore:注解在哪个字段上,则这个字段不会参与序列化和反序列化。
@JsonValue:序列化时,指定将枚举字段,反序列化为什么值。
@JsonCreator:用于反序列化时,指定构造方法,可以在构造方法内部,进行业务处理,常用于枚举类中。
@WebListener :作为web监听器。

缓存

@CacheEvict:标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@Cacheable:可标记在方法、类上。当标记在一个方法上时表示该方法是支持缓存的(一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的),当标记在一个类上时则表示该类所有的方法都是支持缓存的。
@CachePut:可标记在方法、类上。在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@Caching:在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

Guava注解

@VisibleForTesting:便于在测试时找到。
 

方法篇

1、String.format():动态替换字符串中的变量(变量存储在数组中)
2、MessageFormat.format(template, name, day):静态替换

3、HttpEntity ⭐
使用 RestTemplate 时可以通过 HttpEntity 设置请求头和请求体。

MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("*", *);
params.add("**", **);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/x-www-form-urlencoded;charset=gbk"));//构建请求头
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);

4、ResponseEntity执行请求

ResponseEntity<String> response = restTemplate.postForEntity(SMS_ENDPOINT, entity, String.class);//SMS_ENDPOINT 要访问的地址

response.getStatusCode():拿到请求响应码
response.getBody():拿到客户端响应返回值

5、StringBuilder group = new StringBuilder();//可变数组

6、字符串汉字长度校验(一个汉字、一个字母、一个符号计数+1)

for (char ch : content.toCharArray()) {
    if (ch >= 0x4e00 && ch <= 0x9fff) {  // 中文字符
        count += 1;
    } else if (Character.isLetterOrDigit(ch)) {  // 英文字符和数字
        count += 1;
    } else if ((ch >= 0x0621 && ch <= 0x063a) ||
                (ch >= 0x0640 && ch <= 0x0652) ||
                (ch >= 0x0660 && ch <= 0x0669)) {  // 阿拉伯字符
        count += 1;
    } else {  // 其他字符
        count += 1;
    }
}

问题篇

1、java: Annotation processing is not supported for module cycles.
项目依赖陷入循环:理清架构,底层依赖高层
2、MessagingException: Got bad greeting from SMTP host: mail.groupama-sdig.com, port: 465, response: [EOF]
spring.mail.properties.mail.smtp.ssl.enable=true

3、java.lang.IllegalArgumentException: Constructor not found!
传入参数非法,检查代码及数据(涉及到多个表的看看数据库存的数据是否匹配开发规定)

杂项知识篇

缓存

1、缓存更新策略
    主动更新策略:自定义缓存与数据库更新顺序
    Cache Aside Pattern(旁路缓存模式):读写策略分开;
    写策略的步骤:更新数据库中的数据;删除缓存中的数据。(避免读写并发时数据不一致)
    读策略的步骤:如果读取的数据命中了缓存,则直接返回数据;如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存,并且返回给用户。

2、缓存同步策略
    重试机制:引入消息队列,将第二个操作(删除缓存)要操作的数据加入到消息队列,由消费者来操作数据。
    订阅 MySQL binlog,再操作缓存:先更新数据库,再删缓存。强一致性:「更新数据库 + 更新缓存」。

3、缓存穿透:客户端请求的数据在缓存中和数据库中都不存在,请求都会打到数据库。
    ①缓存空对象:可能会缓存过多的空对象(设置过期时间TTL缓解)
    ②布隆过滤(BloomFilter):可以判断一个给定数据是否存在于海量数据中(在写入数据库数据时,使用布隆过滤器做个标记)。

4、缓存击穿/热点Key问题:缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮。
    ①添加互斥锁:保证缓存与数据库的一致性,但是如果缓存重建时间过长,性能会有极大影响,甚至有死锁的风险,牺牲了可用性。(保证同一时间内只有一个请求来构建缓存)
     redis 的 setnx (SET IF NOT EXISTS) 方法 在指定的 key 不存在时,为 key 设置指定的值设置成功,返回 1  ;设置失败,返回 0 。
     利用 redis 的 setnx 方法来表示获取锁,该方法含义是 redis 中如果没有这个key,则插入成功,我们可以根据返回值来判断线程是否成功插入key,成功插入的key的线程我们认为他就是获得到锁的线程。
    ②不给热点数据设置过期时间或者针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。

5、缓存雪崩:在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
    设置数据过期时间的时候随机过期时间,不直接给定。

6、缓存数据使用集群时,至少要有一个统一前缀,以便于区分管理。

MQ

1、作用:消峰、解耦
2、Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
3、Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
    Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。exchange有下面四种(先了解:fanout,direct,topics,header)。
    Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
4、Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。

CAS协议

1、大致过程(从应用客户端出发):
访问客户端资源-->(客户端分析是否含有service ticket,确定是否登录)未登录重定向到身份认证登录页-->进行登录、验证并产生service ticket(需要存入缓存)-->(sever自动重定向)再次访问客户端资源-->进行身份信息核验并返回service ticket-->客户端接收到资源与服务端进行验证-->验证通过返回账号(username)
2、
①CAS的目标是允许用户访问多个应用程序只提供一次用户凭据(如用户名和密码)。它还允许Web应用程序对用户进行身份验证,而不必获取用户的安全凭证,比如密码。
②CAS体系包含两个部分: CAS Server 和 CAS Client。
CAS Server需要独立部署,主要负责对用户的认证工作;
CAS Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server。(写在了sever中)

单点登录

单点登录(SingleSign-On,SSO)是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议,该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时,用户只需要登录一次,就可以访问多个系统,不需要记忆多个口令密码。单点登录使用户可以快速访问网络,从而提高工作效率,同时也能帮助提高系统的安全性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值