项目中的多个@SpringBootApplication批注

Mar*_*ani 7 spring-boot

在我的SpringBoot创建的项目中,

我在@SpringBootApplication中添加了2个主要类.

因为如果我使用STS,我可以在开始调试时选择一个主应用程序.

但我发现当SpringDemoApplication启动时,RabbitMQApplication也在运行.

这是规格吗?工作得当吗?

这是重现的样本 https://github.com/MariMurotani/SpringDemo/tree/6_rabbitMQ

在此输入图像描述

SpringDemoApplication

package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringDemoApplication {

public static void main(String[] args) {

        SpringApplication application = new SpringApplication(SpringDemoApplication.class);
        ApplicationContext context = application.run(args);

    }
}
Run Code Online (Sandbox Code Playgroud)

RabbitMQApplication

package demo;

import java.util.Date;

import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

import demo.configs.Const;
import demo.dto.Mail;

@SpringBootApplication
public class RabbitMQApplication implements CommandLineRunner {

@Autowired
ApplicationContext context;


@Autowired
RabbitTemplate rabbitTemplate;

@Bean
Queue queue() {
    return new Queue(Const.RabbitMQMessageQue, false);
}

@Bean
TopicExchange exchange() {
    return new TopicExchange("spring-boot-exchange");
}

@Bean
Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(Const.RabbitMQMessageQue);
}

@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames(Const.RabbitMQMessageQue);
    //container.setMessageListener(listenerAdapter);
    return container;
}

/*
For asyncronized receiving

@Bean
Receiver receiver() {
    return new Receiver();
}

@Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
    return new MessageListenerAdapter(receiver, "receiveMessage");
}*/

public static void main(String[] args) throws InterruptedException {
    SpringApplication.run(RabbitMQApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
    System.out.println("Waiting five seconds...");

    while(0 < 1){
        for(int i = 0 ; i < 5 ; i++){
            String object = (String)rabbitTemplate.receiveAndConvert(Const.RabbitMQMessageQue);
            if(object != null){
                try{
                    System.out.println(new Date().toGMTString() + ": " + object);
                    ObjectMapper mapper = new ObjectMapper();
                    Mail mail = mapper.readValue(object, Mail.class);
                    System.out.println(mail.getToAddress() + " , " + mail.getStrContent());
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
            }
        }
        Thread.sleep(10000);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

ner*_*erd 15

@SpringBootApplication注释是一条捷径注释@Configuration,@EnableAutoConfiguration@ComponentScan.

http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

默认行为@ComponentScan是查找相同包中的类@Configuration@Component类以及带注释类的所有子包.由于你所有的类都在同一个包中,当你启动它们中的任何一个时,Spring会找到其他@Configuration类并将它们视为类,并注册它们的bean等.

所以,是的,这是您的项目设置的预期行为.@SpringBootApplication如果您不希望在本地测试中发生这种情况,请将每个类放在单独的子包中.如果这在某个时刻超出了演示,你可能想要提出一个更好的设置(每个子项目@SpringBootApplication可能).