@EnableAutoConfiguration
该注解是让Spring根据当前classpath中所存在的类,自动推断出当前运行的环境(判断是否一个Web应用还是一个普通的Java应用),然后根据具体的环境去创建对应的bean,将其添加的Spring的ApplicationContext中。比如:我们在classpath中添加了tomcat-embedded.jar,因此它会去自动帮助我们自动地创建一个EmbeddedServletContainerFactory。如果没有这个对象,那么我们的Tomcat是无法启动的。
@EnableAutoConfiguration对应配置Spring Boot应用非常重要,如果缺少这个注解,就非常可能由于缺少需要的Bean而导致应用的启动失败。
Spring通常建议我们将main方法所在的类放到一个root包下,@EnableAutoConfiguration(开启自动配置)注解通常都放到main所在类的上面。这样@EnableAutoConfiguration可以从逐层的往下搜索各个加注解的类,例如:你正在编写一个JPA程序(如果你的pom里进行了配置的话),Spring会自动去搜索加了@Entity注解的类,并进行调用。
@SpringBootApplication
查看@SpringBootApplication注解源码:
从源码不难看出:@SpringBootApplication注解,其实使用了其他三个注解来标识,分别是:@Configuration
、@EnableAutoConfiguration
、@ComponentScan
。并具有他们的默认属性值。
@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来标准,也不会影响程序的正常启动。
@ComponentScan:该注解就是让Spring容器自动根据指定的包以及子包中进行组件的查找然后创建,如果没有指定具体到哪个包中进行查找,那么就以当前使用该注解的类所在的包作为查找的根,进行查找。即在WebApp这个类所在的包及其子包中进行查找。注意:这里我将HelloController定义在了WebApp所在的包的子包中,如果它们所在的包不具有上面所描述的查找关系,那么Controller是不会被创建的,即使应用可以启动,但是最终响应的结果将是404。