【发布时间】:2016-04-07 20:09:38
【问题描述】:
我想在启动时加载 Spring Bean,它们存在于导入的 maven 依赖项中。有没有办法在不从注入的依赖 jar 中实际导入 context.xml 的情况下做到这一点?
我尝试了@EnableAutoConfiguration,但没有成功。
【问题讨论】:
我想在启动时加载 Spring Bean,它们存在于导入的 maven 依赖项中。有没有办法在不从注入的依赖 jar 中实际导入 context.xml 的情况下做到这一点?
我尝试了@EnableAutoConfiguration,但没有成功。
【问题讨论】:
嗯嗯。没有选择。如果不告诉它这样做,Spring 应用程序上下文中不会出现任何内容。
如果你的依赖只有context.xml,那么除非@Import,否则没什么神奇的。
@EnableAutoConfiguration 仅适用于org.springframework.boot.autoconfigure.EnableAutoConfiguration 注册的用户。
在spring-boot-autoconfigure/META-INFO 中查看spring.factories。
正确:阅读更多 Spring Boot 文档。
所以,如果你不想@Import,你可以用@Import写一些@Configuration(例如MyAutoConfiguration)并将spring.factories添加到你的任何jar中,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.my.proj.autoconfigure.MyAutoConfiguration
【讨论】:
@Import 或在spring.factories 上这样做,如果你基于弹簧靴。仅此而已。
您可以在应用程序中创建一个 bean 并扩展要加载的 bean。
示例(我用它来外部化rabbitmq绑定定义):
外部:
package com.bpedroso.rabbitmq.beans;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CustomerMQBinding {
@Bean
public Queue myQueue() { ... }
@Bean
public Queue myDlq() { ... }
@Bean
public DirectExchange myExchange() { ... }
@Bean
FanoutExchange myDlx() { ... }
/*
* Bindings
*/
@Bean
Binding bindingMyrQueue(final Queue myQueue, final DirectExchange myExchange) { ... }
@Bean
Binding bindingMyDlq(final Queue myDlq, final FanoutExchange myDlx) { ... }
}
当前项目:
import org.springframework.context.annotation.Configuration;
import com.bpedroso.rabbitmq.beans.CustomerMQBinding;;
@Configuration
public class MyCustomerBindingMQBeans extends CustomerMQBinding {
}
【讨论】: