【问题标题】:Use Spring Beans In Micronaut Applications在 Micronaut 应用程序中使用 Spring Bean
【发布时间】:2019-10-20 19:58:24
【问题描述】:

我一直在寻找这样的东西。

拥有这个 micronaut 应用程序代码

@Configuration
@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration.class,
        org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.class,
        org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.class,
        org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class})
@ComponentScan(basePackageClasses = HelloController.class)
public class Application {

    public static void main(String[] args) throws Exception {

        System.setProperty("akka.config", "/Users/nb38tv/workspace/hello-micronaut/src/main/resources/config/");
        System.setProperty("akka.config.file", "application.conf");
        ConfigurableApplicationContext springContext = ReactiveConnectorBootable.loadReactiveConnector();

        ConfigurableApplicationContext context = new MicronautApplicationContext();
        context.setParent(springContext);
        context.start();

        Micronaut.run(Application.class);

    }

}

如何将 Spring 的 ApplicationContext 与 Micronaut 合并。

我需要它,因为我有一个使用 Spring 的 ApplicationContext 注入一些 bean 的库。

然后在我的控制器中我需要使用它。

@Controller("/hello")
public class HelloController {

    @Inject
    private ReactorConnectorManager<RequestInfoDTO, String> reactorConnectorRestManagerExecutor;

    @Get(produces = MediaType.TEXT_PLAIN)
    public String index() {
        if(reactorConnectorRestManagerExecutor == null){
            return "boooo";
        }
        return "Hello World";
    }
}

其中ReactorConnectorManagerSpring context 中加载的bean

问候

【问题讨论】:

  • 您想仅在应用程序启动时对您的 bean 执行操作,还是希望使用 Micronaut 上下文中的 bean?
  • 我想在 Micronaut 应用程序中注入 Spring bean,我会更新我的问题
  • 我尝试了这段代码并创建了一个简单的应用程序,它似乎工作正常。可以看看吗

标签: java spring micronaut


【解决方案1】:

你可以查看this有一个如何集成Micronaut with Spring的例子

我创建了一个基于this 的简单应用程序,代码如上。 例如在http://localhost:8080/hello/World 上,它返回:Hello World with Test : World and Test : World。所以看起来Controller 使用了Bean

package greeting.example;

import io.micronaut.runtime.Micronaut;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import java.util.function.Function;

@SpringBootApplication
public class Application {

    public static void main(String... args) {
        Micronaut.run(Application.class);
    }

    @Bean
    Function<String, String> stringService(){
        return (value) -> "Test : "+ value;
    }
}

package greeting.example;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.reactivex.Single;

import javax.inject.Inject;
import java.util.function.Function;

@Controller("/")
public class HelloController {

    @Inject
    Function<String, String> stringService;

    @Autowired
    private ApplicationContext applicationContext;

    @Get(uri = "/hello/{name}", produces = MediaType.TEXT_PLAIN)
    public Single<String> hello(String name) {
        Function<String, String> service =  applicationContext.getBean(Function.class);
        return Single.just("Hello " + name + " with " + stringService.apply(name)
                + " and " + service.apply(name));
    }
}

更新

允许访问 ConfigurableApplicationContext context 的 hack。在Application 创建类似单例的东西,或者在我的示例静态字段中保存你的context

static ConfigurableApplicationContext springContext;

...

ConfigurableApplicationContext springContext = ReactiveConnectorBootable.loadReactiveConnector();

然后在你的HelloController:

@Get(produces = MediaType.TEXT_PLAIN)
public String index() {
    ReactorConnectorManager<RequestInfoDTO, String> reactorConnectorRestManagerExecutor =
            Application.springContext.getBean(ReactorConnectorManager<RequestInfoDTO, String>.class);
    if(reactorConnectorRestManagerExecutor  == null){
        return "boooo";
    }
    return "Hello World";
}

【讨论】:

  • 我遵循这一点,不幸的是它不起作用。 100% 使用 micronaut 或 100% 使用 Spring boot,但不能将这两种功能混合在一起。
  • 但这个例子不是我的例子。尝试从 Spring 获取已经加载了一些 bean 的 ApplicationContext,并尝试将这些 bean 注入 Micronaut
  • 谢谢,但我不太明白为什么你不能获得豆子。我将示例更改为也使用 ApplicationContext。 @保罗
  • @paul "工作 100% micronaut 或 100% Spring boot,但你不能将这两个功能混合在一起。" - 那不是真的。你绝对可以把它们混合在一起。我们已经在 Grails 4 中做到了这一点,并且有一些库可以完全独立于 Grails 来帮助做到这一点。有超过 1 个选项。 1 是您可以使用 Micronaut 作为父上下文。另一种选择是您可以使用github.com/micronaut-projects/micronaut-spring,它允许您执行诸如将 Micronaut bean 暴露给 Spring 应用程序之类的操作。有很多方法可以解决,绝对不是不能一起使用的情况。
  • @paul 我添加了一个 hack 如何访问你的 beans 的想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多