Spring编程:springboot @SpringBootApplication注解_springboot applicationobjectsupport-程序员宅基地

技术标签: Java编程  spring编程  注解  springboot  springmvc  

在使用 Springboot 框架进行开发的时候,通常我们会在 main 函数上添加 @SpringBootApplication 注解,今天为大家解析一下 @SpringBootApplication,如有不正之处,欢迎批评指正。
###@SpringBootApplication
@SpringBootApplication源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
    Class<?>[] exclude() default {};

    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

从源代码中得知 @SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解所修饰,换言之 Springboot 提供了统一的注解来替代以上三个注解,简化程序的配置。下面解释一下各注解的功能。

###@Configuration
spring文档说明:

@Configuration is a class-level annotation indicating that an object is a source of bean definitions. @Configuration classes declare beans via public @Bean annotated methods.

@Configuration 是一个类级注释,指示对象是一个bean定义的源。@Configuration 类通过 @bean 注解的公共方法声明bean。

The @Bean annotation is used to indicate that a method instantiates, configures and initializes a new object to be managed by the Spring IoC container.

@Bean 注释是用来表示一个方法实例化,配置和初始化是由 Spring IoC 容器管理的一个新的对象。

通俗的讲 @Configuration 一般与 @Bean 注解配合使用,用 @Configuration 注解类等价与 XML 中配置 beans,用 @Bean 注解方法等价于 XML 中配置 bean。举例说明:

XML配置代码如下:

<beans>
    <bean id = "userService" class="com.user.UserService">
        <property name="userDAO" ref = "userDAO"></property>
    </bean>
    <bean id = "userDAO" class="com.user.UserDAO"></bean>
</beans>

等价于

package org.spring.com.user;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {
    @Bean
    public UserService getUserService(){
        UserService userService = new UserService();
        userService.setUserDAO(null);
        return userService;
    }

    @Bean
    public UserDAO getUserDAO(){
        return new UserDAO();
    }
}

package org.spring.com.user;

public class UserService {
    private UserDAO userDAO;

    public UserDAO getUserDAO() {
        return userDAO;
    }

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
}

package org.spring.com.user;

public class UserDAO {
}

注意:

  1. 使用 public 修饰 @Bean 注解的方法;
  2. UserService、UserDAO 类无需声明为 @Component、@Service、@Repository、@Controller;

看了以上 Java 代码,也许有人会问了,为什么不用 @Autowired 注解直接注入 UserDAO?我是这么认为的 @Configuration、@Bean 更注重配置方面的内容,比如我们在 @Bean 方法中可以设置 UserDAO 类对象的特殊信息,比如指定 transactionManager 等。

###@EnableAutoConfiguration
spring文档说明:

Enable auto-configuration of the spring Application Context, attempting to guess and configure beans that you are likely to need. Auto-configuration classes are usually applied based on your classpath and what beans you have defined.

启用 Spring 应用程序上下文的自动配置,试图猜测和配置您可能需要的bean。自动配置类通常采用基于你的 classpath 和已经定义的 beans 对象进行应用。

The package of the class that is annotated with @EnableAutoConfiguration has specific significance and is often used as a ‘default’. For example, it will be used when scanning for@Entity classes. It is generally recommended that you place@EnableAutoConfiguration in a root package so that all sub-packages and classes can be searched.

被 @EnableAutoConfiguration 注解的类所在的包有特定的意义,并且作为默认配置使用。例如,当扫描 @Entity类的时候它将本使用。通常推荐将 @EnableAutoConfiguration 配置在 root 包下,这样所有的子包、类都可以被查找到。

Auto-configuration classes are regular Spring Configuration beans. They are located using the SpringFactoriesLoader mechanism (keyed against this class).Generally auto-configuration beans are @Conditional beans (most often using @ConditionalOnClass and @ConditionalOnMissingBean annotations).

Auto-configuration类是常规的 Spring 配置 Bean。它们使用的是 SpringFactoriesLoader 机制(以 EnableAutoConfiguration 类路径为 key)。通常 auto-configuration beans 是 @Conditional beans(在大多数情况下配合 @ConditionalOnClass 和 @ConditionalOnMissingBean 注解进行使用)。

SpringFactoriesLoader 机制:
SpringFactoriesLoader会查询包含 META-INF/spring.factories 文件的JAR。 当找到spring.factories文件后,SpringFactoriesLoader将查询配置文件命名的属性。EnableAutoConfiguration的 key 值为org.springframework.boot.autoconfigure.EnableAutoConfiguration。根据此 key 对应的值进行 spring 配置。在 spring-boot-autoconfigure.jar文件中,包含一个 spring.factories 文件,内容如下:

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration

# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.velocity.VelocityTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider

###@ComponentScan
spring文档说明:

Configures component scanning directives for use with @Configuration classes. Provides support parallel with Spring XML’s context:component-scan element.

为 @Configuration注解的类配置组件扫描指令。同时提供与 Spring XML’s context:component-scan 元素并行的支持。

Either basePackageClasses() or basePackages() (or its alias value()) may be specified to define specific packages to scan. If specific packages are not defined, scanning will occur from the package of the class that declares this annotation.

无论是 basePackageClasses() 或是 basePackages() (或其 alias 值)都可以定义指定的包进行扫描。如果指定的包没有被定义,则将从声明该注解的类所在的包进行扫描。

Note that the context:component-scan element has an annotation-config attribute; however, this annotation does not. This is because in almost all cases when using @ComponentScan, default annotation config processing (e.g. processing @Autowired and friends) is assumed. Furthermore, when using AnnotationConfigApplicationContext, annotation config processors are always registered, meaning that any attempt to disable them at the @ComponentScan level would be ignored.

注意,context:component-scan 元素有一个 annotation-config 属性(详情:http://www.cnblogs.com/exe19/p/5391712.html),但是 @ComponentScan 没有。这是因为在使用 @ComponentScan 注解的几乎所有的情况下,默认的注解配置处理是假定的。此外,当使用 AnnotationConfigApplicationContext, 注解配置处理器总会被注册,以为着任何试图在 @ComponentScan 级别是扫描失效的行为都将被忽略。

通俗的讲,@ComponentScan 注解会自动扫描指定包下的全部标有 @Component注解 的类,并注册成bean,当然包括 @Component 下的子注解@Service、@Repository、@Controller。@ComponentScan 注解没有类似 context:exclude-filter、context:include-filte的属性。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/claram/article/details/75125749

智能推荐

报错解决:Could not build wheels for soxr, which is required to install pyproject.toml-based projects(可用)-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏8次。链接如下:【金山文档】 1-Microsoft Visual C++ Build Tools。找了好久,才找到正确的解决方案,网上一大堆升级setuptools的方法只对少数人管用。注意,虽然我的这个报错内容有点长,但是我感觉和其它的。如果网页提示登录,可以不用登录,直接下载即可。然后打开镜像ios文件(双击即可)错误是一样的解决方案。文件,打开后安装即可。_pyproject.toml-based projects

跟着iMeta学做图|ggplot2包绘制棒棒糖图展示变量间的相关性-程序员宅基地

文章浏览阅读414次。如果你使用本代码,请引用:Changwu Wu. 2022. Pan-cancer analyses reveal molecular and clinical characteristics of cuproptosis regulators. iMeta 1: e68. https://doi.org/10.1002/imt2.68代码编写及注释:农心生信工作室。写在前面气泡图 (bubbl..._棒棒图 ggplot

Java中并发编程如何避免资源竞争与死锁?-程序员宅基地

文章浏览阅读461次,点赞15次,收藏13次。在未来的开发中,随着技术的不断进步和应用的复杂化,我们还需要不断关注和研究新的并发编程技术和工具,以应对新的挑战和需求。通过合理的同步控制、使用线程安全的集合、减少共享状态、使用原子变量以及采取避免嵌套锁、设置锁超时、检测死锁、使用锁顺序和使用高级并发工具等策略,我们可以有效地降低资源竞争和死锁的风险。资源竞争是指多个线程同时访问同一资源时,由于线程的执行顺序和访问时间的不确定性,可能导致数据不一致或其他不可预期的行为。这些工具内部实现了复杂的同步机制,可以简化并发编程的难度,并降低死锁的风险。

GIS程序员保持身心健康的八种方式-程序员宅基地

文章浏览阅读88次。程序员是一个辛苦的行业,长时间面对的只是需要解决的问题,更不要提开发期限和无理取闹的客户了,这样的工作简直无以承受。怎么办呢我们?我们热爱编程,乐于创建功能……我们喜欢那种将一堆代码弄成像Facebook或者Digg那样的赚钱工具的感觉。也正由于程序员所带给我们的一切,这工作仍让我们欲罢不能。这种情况下,如何处理工作带来的压力便成了一项技巧。以下分享我的一些方式,以...

一 如何检查oracle的归档日志及空间占用率,清除归档日志、Oracle归档日志使用情况查询、查看oracle数据库一周产生的归档日志_如何查看oracle数据库清理归档命令是否完成-程序员宅基地

文章浏览阅读1.7k次。如何解决“归档日志已满问题”问题描述:所用数据库为Oracle10g ,模式为归档模式,oracle 系统默认的归档空间为2G,由于日志过多,空间写满,数据库的redo文件不能归档,而出现oracle数据库挂起的问题。oem打开oracle 10g 数据库操作界面,会显示如下错误信息: “ 由于输出设备已满或不可用, 归档程序无法归档重做日志。”数据库无法使用现将解决办法..._如何查看oracle数据库清理归档命令是否完成

浅谈异步IO各模型优缺点_产业结构io模式的利弊分析-程序员宅基地

文章浏览阅读6.9k次。本文只讨论OverLapped I/O的三种异步模型及完成端口,像select、SWASelect不作讨论,讨论顺序从劣到优,方便于循序渐进地对比,更容易区分各模型之间的差别。1. OverLapped I/O 设备内核对象模型,这种模型虽然采用异步,但为了知道对象是否触发,需要一直挂起线程,换个角度来说,与同步的差异不大2. OverLapped I/O 事件内核对象模型,这模型_产业结构io模式的利弊分析

随便推点

centos7安装Kafka Eagle_kafka eagle centos7下安装-程序员宅基地

文章浏览阅读4.1k次。centos7安装Kafka Eagle_kafka eagle centos7下安装

(OK) MPTCP setup - kernel/net/mptcp/Kconfig_net/mptcp/kconfig warning: choice default symbo is-程序员宅基地

文章浏览阅读566次。(OK) MPTCP setup - kernel/net/mptcp/Kconfig_net/mptcp/kconfig warning: choice default symbo is not contained in the choi

SC8F054中微带E方存储 MTP增强型闪存8位CMOS单片机MCU芯片IC-程序员宅基地

文章浏览阅读221次,点赞3次,收藏7次。总的来说,SC8F054中微带E方存储的MTP增强型闪存8位CMOS单片机(MCU)芯片IC是一款功能强大、性能稳定、应用广泛的芯片产品。随着物联网、智能家居等领域的快速发展,SC8F054芯片的市场需求将不断增长,为相关产业带来更加广阔的发展空间。同时,它还拥有丰富的外设接口,如UART、SPI、I2C等,方便与其他外设进行通信。SC8F054中微带E方存储 MTP增强型闪存8位CMOS单片机MCU芯片IC,​SC8F054是一款中微带E方存储的MTP增强型闪存8位CMOS单片机(MCU)芯片IC。

一文!解决静电场能量的计算和推导_电荷连续分布电荷系统的做功-程序员宅基地

文章浏览阅读1.1k次。我们有时候把该点处的电荷不考虑在内,我们有时候又把该点处的电荷考虑在内,其实我们在任何时候都不能把该点处的电荷考虑在内,我们之所以会在有些时候把该点处的电荷考虑在内,主要原因是为了方便计算,我们把所有点在计算电势的时候,都考虑在内,实际上最后效果可以起到一个等效的效果,这样子的话,可以极大程度上方便计算(从物理层面上来说,不是很好理解物理意义)4.在推导静电场能量密度的时候,我们需要把体积扩大至无穷大空间,这是一个技巧,我们这么做的目的在于,省略掉我们不需要的一项,同时给予充分的理由。_电荷连续分布电荷系统的做功

uniapp 开发App使用微信H5支付解决方案(包含前后端,后端用的thinkphp)_uniapp h5 微信支付-程序员宅基地

文章浏览阅读4.6k次,点赞3次,收藏8次。我们在用uniapp开发app常常需要接入支付功能,但是有时候出于包体积或审核的因素,并不想接入支付相关的sdk,这个时候,就可以考虑使用h5支付实现。可能会遇到iOS跳转微信完成支付后无法自动返回app,是因为UrlSchemes没有配置好。微信h5支付返回的mweb_url,前端直接访问,会报错:商家参数格式有误,请联系商家解决_uniapp h5 微信支付

大数据面试高频题目 - 深度解析 HBase:探秘分布式 NoSQL 数据库的关键技术-程序员宅基地

文章浏览阅读1.3k次,点赞34次,收藏11次。本文将深入探讨 HBase,这是分布式 NoSQL 数据库中的关键技术,被广泛用于大数据存储和实时查询。透过高频面试题解析,我们将深入研究 HBase 在数据存储和检索中的作用。无论你是初学者还是渴望加深对 NoSQL 数据库技术的了解,本文都将为你提供实用的面试准备。hbase是一种分布式、可扩展,支持海量存储的NoSQL数据库。

推荐文章

热门文章

相关标签