如何在弹簧启动中扫描组件

时间:2016-08-16 17:55:11

标签: java spring spring-boot

Spring boot如何处理组件扫描?我们在一些web.xml文件中没有在spring boot中指定<component-scan>标记。我们不会在spring boot中编写任何调度程序servlet。那么Spring boot在哪里进行组件扫描?它如何注册所有控制器,服务? Spring Boot Web服务微服务的切入点是什么?注意:由于它是一个web项目,我可能不想在这里使用main方法。

1 个答案:

答案 0 :(得分:2)

如果你看一下注释,那么相同的包和子包有一个隐含的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {...

当然,它将在run方法之后执行:

public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

问题是:我们没有指定组件扫描,但事实并非如此。它在Spring Boot注释中声明。

编辑1 Spring MVC替代

但是,<component-scan>是一个Spring注释,而不仅仅是Spring Boot。您可以使用Spring MVC配置WAR Web应用程序,根本不需要Spring Boot库。看看:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-config-customize

@Configuration
@EnableWebMvc
public class ConfigWebMVC extends WebMvcConfigurerAdapter
{
...
}

此外,为了更好地理解@ComponentScan,我想强调一下文档中的一些要点:

关于bean生命周期:

  

默认情况下,ApplicationContext实现急切地创建和   将所有单例bean配置为初始化过程的一部分..

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-lazy-init

关于组件扫描:

  

默认情况下,使用@Component,@ Repository,@ Service注释的类,   @Controller,或者自己注释的自定义注释   @Component是唯一检测到的候选组件。但是,你   只需应用自定义过滤器即可修改和扩展此行为。   将它们添加为includeFilters或excludeFilters参数   @ComponentScan注释(或包含过滤器或排除过滤器   组件扫描元素的子元素

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-scanning-filters