Spring泛型注入问题

下面代码如果对象是按照a->d->b的创建顺序则会启动失败,如果按照a->b->d的创建顺序会启动成功,如果没有d对象,也会启动成功,但是我们可以发现d对象和a,b对象并无任何直接的联系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Configuration
public class Config {
@Bean
public Queue<String> a() {
return new A<String>();
}

@Bean
@DependsOn("c")
public Object b(Queue<String> a) {
return new Object();
}
}

@Component
@DependsOn({"a"})
public class C {
@Autowired(required = false)
private List<Throwable> e;
}

public class A<E> implements List, Queue {
//实现接口方法
}

@SpringBootApplication
public class DemoApplication {

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

}

//失败错误如下:
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method b in com.example.demo.Config required a bean of type 'java.util.Queue' that could not be found.


Action:

Consider defining a bean of type 'java.util.Queue' in your configuration.

Spring循环依赖与Async

如果bean使用了@Async方法,并且bean进行了循环依赖,那么在项目有可能出现BeanCurrentlyInCreationException。本文简单聊聊,@Async是如何影响循环依赖的。测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Service
public class A {
//这里A依赖B
@Autowired
private B b;

//注意,这是一个异步方法
@Async
public void funA() {
}
}

@Service
public class B {
//这里B依赖A
@Autowired
private A a;
}

@SpringBootApplication
@EnableAsync
public class DemoApplication {

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

}

Spring循环依赖

spring的循环依赖主要理解singletonObjectsearlySingletonObjectssingletonFactories三个缓存是如何使用的。

网络分层体系简介

不知道大家是否对网络分层感到疑惑,每层的作用是什么。这里简单聊下我对分层的理解。

物理层

物理层的作用可以理解为如何在特定链路上传输电信号,如双绞线,光纤等。

数据链路层

在总线型网络拓扑中,如下所示,如果B要发送给C数据,那么A也会收到数据包(电信号会沿着线路传递),A如何知道要拒绝这个数据部包呢。

这里就需要在发送的信号里标识目的地址,也就我们说的MAC地址,A会判断目的MAC地址是否是自己。

OpenVPN简介

在家或者在公司,有时候需要连接VPN才能访问某些服务,不过有时候会出现连接VPN之后网络缓慢,或者完全打不开某些页面。这个时候就需要了解其基本原理,看看是否能改进网络体验。下面是OpenVPN连接的流程示意图。

Socket挂起异常

最近发现一个项目很多线程停留在java.net.SocketInputStream.socketRead0(Native Method)中,并且永远也不会返回。

线程栈

先说下结论,要想出现这个问题,需要满足下面几个条件

  • 使用了Apache http 类库,这里没有确认版本情况,笔者使用的是4.5.x版本
  • 使用了代理访问目标地址
  • 没有配置SocketConfig
  • 目标服务器断开连接时,RST包丢失

HTTP代理

反向代理

反向代理是最常见的一种代理,一般用于负载均衡,比如nginx,spring cloud gateway网关。我们不知道提供服务的具体ip,也就是对用户是透明的。

正向代理

正向代理和反向代理的区别在于,正向代理是有感知的。比如curl -x 'http://127.0.0.1:8080' 'http://httpbin.org/',我们想要请求httpbin.org的数据,我们不直接和httpbin.org建立链接,而是和127.0.0.1建立连接,并发请求发送给它。

Big Sur运行JDK Mission Control

JDK Mission Control

升级到Big Sur之后,发现JDK Mission Control打不开了,闪退。

显示包内容,进入到/Applications/JDK Mission Control.app/Contents/Eclipse目录,编辑jmc.ini文件。

image-20210409144843173

增加vm参数,修改为自己对应的JDK目录,重新打开APP即可成功运行。

Github Action集成Hexo

以前博客的CI是使用travis-ci.org,最近发现需要转移到https://www.travis-ci.com/,并且只有一定的免费限额,后续可能要购买次数,于是准备找一个替代方案。

我的博客主要有两个分支,source和master,source用于维护文章,主题,配置等信息,master用于存储博客的静态页面。只要有source的代码,随时可以生成master页面。

上网搜索发下,Github已经提供了免费的CI工具,Github Action,这里记录下所需的改动。