【问题标题】:how to create a controller based on auto configuration spring boot 1.4.0如何基于自动配置spring boot 1.4.0创建控制器
【发布时间】:2017-01-25 21:31:54
【问题描述】:

我使用的是 Spring Boot 1.4.0

我只想在特定条件下在我的 Spring Boot 应用程序中创建一个控制器。例如,如果有某个名称为“neededBean”的 bean。

这个“neededBean”在一个 AutoConfiguration 类中,它只会在特定条件下被创建。

如果需要,我想避免创建控制器 Bean 不满足其自动配置条件。所以我不能用 @Controller 注释我的类,因为无论自动配置类如何,都会创建它

有什么方法可以实现我想要的吗?

【问题讨论】:

    标签: spring-mvc spring-boot


    【解决方案1】:

    @Controller 仅因组件扫描而被检测到。默认情况下,您可以删除整体组件扫描或排除该包。然后设置一个@Configuration 类,它以另一个bean 存在为条件。在该配置中,您告诉它扫描该控制器包以添加适当的控制器。

    另一个选项是使用@Profile 仅在为正在运行的应用程序设置了特定的活动配置文件时启用控制器。您可以在希望使用的场景中指定该配置文件。

    【讨论】:

    • 感谢肖恩会尝试第一种方法
    【解决方案2】:

    org.springframework.boot.actuate.endpoint.mvc.AbstractMvcEndpoint 是您求婚的良好开端。

    这是一个示例案例,这只是为您的案例提供解决方案,但对现实世界没有用处。 这里我使用@ConditionalOnClass,但对你来说,需要使用@ConditionalOnBean@ConditionalOnMissingBean

    RabbitEndpoint.java - 仅在使用 Tomcat 时自动配置。

    /**
     * @author lhuang
     */
    @ConditionalOnClass(value = Tomcat.class)
    public class RabbitEndpoint extends AbstractMvcEndpoint {
        public RabbitEndpoint() {
            super("rabbit", true);
        }
    
        @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
        public void invoke(HttpServletRequest request, HttpServletResponse response)
                throws IOException, ServletException {
            System.out.println(" ------ Auto-Configuration on Tomcat.class Conditional ------ ");
        }
    }
    

    META-INF/spring.factories,注册自动配置类

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.cloudhuang.web.RabbitEndpoint
    

    然后启动spring boot app,访问路径“http://localhost:8080/rabbit

    你会得到控制台输出

     ------ Auto-Configuration on Tomcat.class Conditional ------ 
    

    【讨论】:

    • 谢谢黄,这正是我在发布问题之前所做的,但想看看我是否可以不用执行器端点
    • 你在用执行器端点做什么?他回答中的执行器只是@ConditionalOnBean/@ConditionalOnMissingBean/@ConditionalOnClass 用法的一个例子
    【解决方案3】:

    查看docs 中的@ConditionalOnBean 注释。

    您可以将此注解添加到您的控制器并指定您的 bean 的名称,因此只有在您的应用程序上下文中可用此 bean 时才会实例化它。

    @ConditionalOnBean(value=MyBean.class, name="NameOfMyBean")
    @Controller
    public class MyController{
    
      ...
    }
    

    【讨论】:

    • @ConditionalOnBean 不能用于非自动配置的类,甚至 spring 文档都警告不要使用它
    • 可以使用。它只是不应该被使用,因为如果你这样做了,bean 处理的顺序很重要。这就是我链接到文档的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2015-05-07
    • 2017-01-17
    • 2017-03-12
    • 2017-01-16
    • 2017-07-04
    相关资源
    最近更新 更多