@SpringBootApplication和@Configuration、@EnableAutoConfiguration、@ComponentScan的联系

@SpringBootApplicationpublic class WebApp{             public static void main(String[] a...
@SpringBootApplicationpublic class WebApp{    
        public static void main(String[] args) {
        SpringApplication.run(WebApp.class, args);
    }
}

首先我们看到该类使用了@SpringBootApplication这个注解来进行标识。该注解其实又是由其他3个注解来标识,它们分别是@Configuration@EnableAutoConfiguration@ComponentScan


SpringBootApplication源码.png

(1). @Configuration:其作用是标识当前类是一个Bean定义信息的来源,它可以被Spring的ApplicationContext进行加载处理;其作用等同于我们之前使用的xml文件,只是我们以前将Bean的定义配置在xml中,而现在是将Bean的定义全部基于代码写在了使用@Configuration所标识的这个类中。
下面我们通过一个例子更加清楚地说明@Configuration的作用。

public class User {    
        private String name;    
        public String getName() {        
            return name;
      }    
        
     public void setName(String name) {        
         this.name = name;
    }
}

通过@Configuration标识的类,可以完成对Bean信息的定义:

/**
 * 使用@Configuration标识
 * 在当前类中通过@Bean标注的方式
 * 之后都由Spring的AppplicationContext来进行调用
 * 从而生成Bean对象。
 */@
 Configuration
 public class AppConfig {    
             @Bean    
             public User getUser(){
            User user = new User();        
            return user;
            }
}
public class App {    
public static void main(String[] args) {        
            /*
         * 将@Configuraion所标识的类通过Spring的上下问进行加载,从而实现Bean的创建。 
         */
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(AppConfig.class);
        ctx.refresh();

        User user = ctx.getBean("user", User.class);        
        String value = user.sayHello();
    }
}

通过上面的例子,我们应该可以看到@Configuration与xml几乎是一个等价的关系,其作用如出一辙,在我们上面的例子中,其实WebApp这个类可以不使用@Configuration来标准,也不会影响程序的正常启动。

(2). @EnableAutoConfiguration:该注解是让Spring根据当前classpath中所存在的类,自动推断出当前运行的环境(判断是否一个Web应用还是一个普通的Java应用),然后根据具体的环境去创建对应的bean,将其添加的Spring的ApplicationContext中。比如:我们在classpath中添加了tomcat-embedded.jar,因此它会去自动帮助我们自动地创建一个EmbeddedServletContainerFactory。如果没有这个对象,那么我们的Tomcat是无法启动的。我们将WebApp改成如下结果:

//不再设置EnableAutoConfiguration会导致应用启动失败
@Configuration@ComponentScan
public class WebApp {    
    public static void main(String[] args) {        
        SpringApplication.run(WebApp.class, args);
   }
}


缺少EnableAutoConfiguration启动结果.png


从上面的分析结果我们可以,@EnableAutoConfiguration对应配置Spring Boot应用非常重要,如果缺少这个注解,就非常可能由于缺少需要的Bean而导致应用的启动失败。

(3). @ComponentScan:该注解就是让Spring容器自动根据指定的包以及子包中进行组件的查找然后创建,如果没有指定具体到哪个包中进行查找,那么就以当前使用该注解的类所在的包作为查找的根,进行查找。即在WebApp这个类所在的包及其子包中进行查找。注意:这里我将HelloController定义在了WebApp所在的包的子包中,如果它们所在的包不具有上面所描述的查找关系,那么Controller是不会被创建的,即使应用可以启动,但是最终响应的结果将是404。


  • 发表于 2018-04-23 15:03
  • 阅读 ( 712 )
  • 分类:J2EE框架

条评论

请先 登录 后评论
不写代码的码农
三叔

422 篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除