spring-boot项目会遇到这样一种情况,有一些工具的参数,在测试环境和生产环境是不一样的,对于非静态的参数,可以在properties配置文件里创建,然后用@value注解注入.
对于某些静态参数来说,可以通过项目初始化的时候,把参数值放进static和final修饰的map里,然后通过getKey的方式,得到静态参数.
步骤:
1.application启动类上反射获取bean对象
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MqttApplication.class, args);
ServerInit s = run.getBean(ServerInit.class);
s.preHandle(run);
}
2.初始化类
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Configuration本身是继承自@Component,因此也可以和正常被@Component一样被扫描到,或使用autowired。
所以这个地方注解换成@Component也可以.
标题1里,获得了这个ServerInit 的bean对象,然后执行的是其preHandle方法,该方法参数为ConfigurableApplicationContext,
方法里边没有用到,用到了就可以用这个参数搞一些初始化的事情
@Configuration
public class ServerInit {
public static final Map<String, String> MQTT_INFO = new HashMap<String, String>();
@Value("${mq.send.queue}")
private String queue;
@Value("${mqtt.server.host}")
private String host;
@Value("${mqtt.server.userName}")
private String userName;
@Value("${mqtt.server.password}")
private String password;
@Value("${mqtt.client.topic}")
private String topic;
@Value("${mqtt.client.clientId}")
private String clientId;
/**
* 初始化信息到内存中
*
* @param run
*/
public void preHandle(ConfigurableApplicationContext run) {
//将mqtt信息初始化
MQTT_INFO.put("host", host);
MQTT_INFO.put("userName", userName);
MQTT_INFO.put("password", password);
MQTT_INFO.put("topic", topic);
MQTT_INFO.put("clientId", clientId);
RabbitMQUtil.initFactory("开始搞");
//启动mq监听
startMq();
}
/**
* 启动mq监听
*/
private void startMq() {
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
sleep(200);
// LOGGER.info("循环获取");
List<String> masgs = RabbitMQUtil.receiveMessages(queue, 4);
for (String msg : masgs) {
LOGGER.info("RabbitMQ接收" + msg.toString());
PublishMessage.start(msg);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}