@EnableAutoConfiguration和@SpringBootApplication注解

本文深入探讨了Spring Boot中@EnableAutoConfiguration与@SpringBootApplication注解的作用,解释了如何通过这些注解自动推断运行环境并创建所需的bean,确保应用的正确启动。同时,详细介绍了@Configuration与@ComponentScan注解的功能,以及它们在Spring Boot应用中的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyJiang.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值