最近想在springboot中增加一个启动项,随着springboot的部署启动udp协议,然后我将对于udp的本地端口和服务器端的ip和端口等的配置放在yml,方便修改和配置。
当然,先把yml和取值的类写好。
以下是application.yml文件中的配置:
udp:
mip: 127.0.0.1
mport: 9999
localport: 6125
以下是获取值的类:
@Component
public class udpClientGetTime(){
@Value("${udp.mip}")
public String mip;
}
然后就是将他放到启动项中。
1、new一个类。于是,我在启动项中new了一个我想要的类,然后失败了,获得的都是null,上网一搜索,发现new是行不通的。下面是错误示范。
@SpringBootApplication
@EnableScheduling
@ComponentScan()
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
udpClientGetTime udpClientGetTime=new udpClientGetTime();
System.out.println(udpClientGetTime.getMip);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
System.out.println("外部tomcat,chapter启动!");
return application.sources(DemoApplication.class);
}
}
2、@Autowire,添加注释。还是不行,因为在将在application的启动类中,如果要注入一个类,好像必须要静态引用,不要问我为什么,我也不晓得。但是尴尬就尴尬在这,如果静态引用你用value获取的值,那是获取不到的,null。属性不能用static final等修饰。下面是错误示范。
@SpringBootApplication
@EnableScheduling
@ComponentScan()
public class DemoApplication extends SpringBootServletInitializer {
@Autowire
static
udpClientGetTime udpClientGetTime
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
System.out.println(udpClientGetTime.getMip);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
System.out.println("外部tomcat,chapter启动!");
return application.sources(DemoApplication.class);
}
}
3、在配置文件中继承启动类,将他做成一个启动项。突然想到,既然不能把想要开机启动的配置类引用到启动类里,那反过来呢?于是就想到,让想要开机启动的配置类继承启动类ApplicationRunner。可以,搞定,正解。
public class udpClientGetTime() implements ApplicationRunner{
@Value("${udp.mip}")
public String mip;
………………
@Override
public void run(ApplicationArguments args) throws Exception {
// TODO Auto-generated method stub
System.out.println(getMip());
}
}