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();
}
}
2.2使用ServerConfig
@Component
public class HttpClientUtil {
private String member;
@Autowired
private ServerConfig serverConfig;
private String getImgUrl(String fileName) {
return serverConfig.getUrl()+getRelativeDir()+ fileName;
}
2.3 @Autowired注解为null
使用@Component注解来注解ServerConfig类声明该类是Spring管理的一个Bean。并且使用@Component、@Service,@Repository,@Controller是等效的,因为它们都组合了@Component这个注解。
在使用过程中有时会发现对ServerConfig成员使用了@Autowired注解,但发现在实际运行时注解的字段仍为null,这是因为,作为Spring容器管理的Bean,Bean的初始化和销毁均有Spring容器实现,因此若对上述代码中HttpClientUtil类使用了如下的语句:
new HttpClientUtil().getImgUrl()
会报空指针异常
3总结
本文主要阐述了Spring Boot如何获取运行时的host和端口号,以及@Autowired注解为null的原因。在实际工作中积累Spring Boot的方方面面并深刻理解Spring、Spring MVC, Spring Boot非常重要,值得积累。