在SpringBoot中注入自定义Bean

前言

在使用SpringBoot的过程中,我们往往需要通过配置文件设置一些配置。但更多时候,我们需要由Spring容器来注入这些配置并进行统一管理。下面将阐释具体方法。

1. 配置文件

假设我们需要自定义SSH远程连接的配置,那么我们可以在application.yml中添加如下配置:

1
2
3
4
5
6
ssh:
user: username
pass: password
host: redis.sakebow.cn
port: 22
dest: /data/ftp

在这个文件中,我们定义了SSH连接中基本的配置项,包括用户名、密码、主机地址、端口号和目标目录。其中,目标目录主要用于存储SCP命令发送过去的文件。

为了读取配置,我们可以使用@ConfigurationProperties注解,并指定配置文件的前缀。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* SSH配置类
*/
@Data
@Component
@ConfigurationProperties(prefix = "ssh")
public class SSHProperties {
@Value("${ssh.user}")
private String user;
@Value("${ssh.pass}")
private String pass;
@Value("${ssh.host}")
private String host;
@Value("${ssh.port}")
private int port;
@Value("${ssh.dest}")
private String dest;
}

P.S.:这里命名为SSHProperties主要是因为需要适应RuoYi框架的命名规范。如果你并没有使用RuoYi框架,你完全可以命名为SSHConfig

P.P.S:实际上,RuoYi本身并没有集成lombokData注解,所以后面理论上需要有大量的GetterSetter方法。这里为了简洁一点,就直接用注解代替了。

@Component注解用于将配置类注册为Spring容器中的组件,这样我们就可以在其他地方通过@Autowired注解来注入这个配置类。

@ConfigurationProperties注解用于将配置文件中的配置项映射到配置类中。prefix属性用于指定配置文件的前缀,这样我们就可以只读取前缀为ssh的配置项。

假设我们接下来需要去SSHServiceImpl中注入这个方法,那么比较好的解决方案就是使用注解:

1
2
3
4
5
@Service
public class SSHServiceImpl implements SSHService {
@Autowired
private SSHProperties sshProperties;
}

当然,有些人可能会将这个修改为构造函数注入,这在另一篇文章中有提到,这就是另外一回事了,我们单独讨论。

之后,我们便可以在SSHServiceImpl中使用sshProperties对象来获取配置项。使用过程中,我们就可以直接获取到:

1
2
3
4
5
this.sshProperties.getUser(); // 获取用户名
this.sshProperties.getPass(); // 获取密码
this.sshProperties.getHost(); // 获取主机地址
this.sshProperties.getPort(); // 获取端口号
this.sshProperties.getDest(); // 获取目标目录

非常方便。