我使用的是spring boot 1.4.0
我只想在某些情况下在我的spring boot应用程序中创建一个控制器。例如,如果存在命名为"neededBean“的bean。
此"neededBean“位于AutoConfiguration类中,只有在特定条件下才会创建它。
我想要避免创建控制器,如果neededBean不满足其自动配置condition.So,我不能用@Controller注释我的类,因为它将被创建,而与自动配置类无关
有什么方法可以实现我想要的吗?
发布于 2016-09-18 14:18:19
对于你的提议,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.factory,注册自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.cloudhuang.web.RabbitEndpoint然后启动spring boot应用程序,访问路径"http://localhost:8080/rabbit“
您将获得控制台输出
------ Auto-Configuration on Tomcat.class Conditional ------ 发布于 2016-09-18 13:25:12
由于组件扫描,仅检测到@Controller。默认情况下,您可以删除整个组件扫描或排除该包。然后设置一个@Configuration类,该类的条件是现有的另一个bean。在该配置中,您告诉它扫描控制器包以添加适当的控制器。
另一种选择是,如果为正在运行的应用程序设置了特定的活动配置文件,则使用@Profile仅启用控制器。您可以在您希望使用的场景中指定该配置文件。
发布于 2016-09-18 14:30:24
看一下docs中的@ConditionalOnBean注释。
您可以将此注释添加到Controller中并指定bean的名称,因此只有在应用程序上下文中有此bean时,才会实例化该bean。
@ConditionalOnBean(value=MyBean.class, name="NameOfMyBean")
@Controller
public class MyController{
...
}https://stackoverflow.com/questions/39552060
复制相似问题