通过Spring boot编码获取当前程序运行的host和端口号

1简介
在使用Java开发过程中,一般在程序内部数据的传输会使用Http协议,通过三层结构,Controller-Service-Dao层,由于自己编写的jar包在部署到其他机器上时运行的主机和端口号可能会发生变化,虽然在开发时可以使用硬编码写入自己的代码中,但这种实现确实不佳。好在Spring Boot提供了一个接口ApplicationListener,来监听项目的启动,通过监听项目启动时的端口和主机,可以自动获取主机和端口号,方便程序的灵活性扩展。

2代码实现
2.1 监听类实现
package com.cetc52.platform.config;

import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 获取项目的IP和端口
 *
 * @Owner:
 * @Time: 2019/2/22-16:21
 */


@Component
public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> {
    public int getServerPort() {
        return serverPort;
    }

    private int serverPort;

    public String getUrl() {
        InetAddress address = null;
        try {
            address = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return "http://"+address.getHostAddress()+":"+this.serverPort;
    }

    public String getHost() {
        InetAddress address = null;
        try {
            address = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return address.getHostAddress();
    }

    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        serverPort = event.getWebServer().getPort();
    }
}

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
48
49
50
51
2.2使用ServerConfig
@Component
public class HttpClientUtil {
    private String member;
    @Autowired
    private ServerConfig serverConfig;
    
    private String getImgUrl(String fileName) {
        return serverConfig.getUrl()+getRelativeDir()+ fileName;
    }
1
2
3
4
5
6
7
8
9
2.3 @Autowired注解为null
使用@Component注解来注解ServerConfig类声明该类是Spring管理的一个Bean。并且使用@Component、@Service,@Repository,@Controller是等效的,因为它们都组合了@Component这个注解。

在使用过程中有时会发现对ServerConfig成员使用了@Autowired注解,但发现在实际运行时注解的字段仍为null,这是因为,作为Spring容器管理的Bean,Bean的初始化和销毁均有Spring容器实现,因此若对上述代码中HttpClientUtil类使用了如下的语句:

new HttpClientUtil().getImgUrl()
1
会报空指针异常

3总结
本文主要阐述了Spring Boot如何获取运行时的host和端口号,以及@Autowired注解为null的原因。在实际工作中积累Spring Boot的方方面面并深刻理解Spring、Spring MVC, Spring Boot非常重要,值得积累。
————————————————
版权声明:本文为CSDN博主「思影影思」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lk142500/article/details/87926412

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值