我正在使用spring boot 1.4.0
我只想在特定条件下在Spring启动应用程序中创建一个Controller。 Ex如果有一个带有某个名称的bean" needsBean。
这" neededBean"在AutoConfiguration类中,它将仅在某些条件下创建。
我想避免控制器的创建,如果needBean没有确定其自动配置条件。所以我不能使用@Controller注释我的类,因为它将被创建而不管自动配置类
有没有办法达到我想要的目的?
答案 0 :(得分:2)
仅在组件扫描时检测到@Controller
。您可以删除整个组件扫描或默认情况下排除该包。然后设置一个@Configuration
类,该类具有另一个bean存在的条件。在该配置中,您告诉它扫描该控制器包以添加适当的控制器。
另一种选择是使用@Profile
仅在为正在运行的应用程序设置特定活动配置文件时启用控制器。您可以在希望使用它的方案中指定该配置文件。
答案 1 :(得分:1)
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 ------
答案 2 :(得分:0)
查看docs中的@ConditionalOnBean
注释。
您可以将此注释添加到Controller并指定bean的名称,因此只有在您的应用程序上下文中提供此bean时才会实例化它。
@ConditionalOnBean(value=MyBean.class, name="NameOfMyBean")
@Controller
public class MyController{
...
}