`

理解@Springbootapplicaion和自动装配机制

 
阅读更多

1 @SpringBootApplication理解

   @SpringBootApplication是一个合成注解,他是@EnableAutoConfiguration,@Configuration,@ComponentScane,3个的合成注解,

@EnableAutoConfiguration注解,可以帮助springBoot应用将所有符合条件的@Configuration都加载到当前springBoot创建并使用的IOC容器中

@Configuration注解是一个派生注解,它是@Component的子注解, 它还有一个@SpringBootConfiguration的子注解

@ComponentScan:SpringBoot应用使用@ComponentScan的方式装载@Configuration类

@SpringBootApplication注解中使用了@Aliasfor注解,该注解可以将其他注解的属性别名在自己的属性中,从而像使用自己的注解属性一样使用????

 

2 自动装配机制理解

  当DataSourceAutoConfiguration.EmbededDatabaseCondition匹配后,即HSQLDB的JDBC驱动类org.hsqldb.jdbcDriver存在于Class Path下时,@Configuration类DataSourceAutoConfiguration.EmbededDatabaseConfiguraion将被装配,故EmbeddedDataSourceConfiguration将被@Import注解导入

 1  

  //

// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.autoconfigure.jdbc;
import javax.sql.DataSource;
import javax.sql.XADataSource;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Builder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Dbcp2;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Generic;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Hikari;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Tomcat;
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
public DataSourceAutoConfiguration() {
    }
static class EmbeddedDatabaseCondition extends SpringBootCondition {
private final SpringBootCondition pooledCondition = new DataSourceAutoConfiguration.PooledDataSourceCondition();
EmbeddedDatabaseCondition() {
        }
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
Builder message = ConditionMessage.forCondition("EmbeddedDataSource", new Object[0]);
if (this.anyMatches(context, metadata, new Condition[]{this.pooledCondition})) {
return ConditionOutcome.noMatch(message.foundExactly("supported pooled data source"));
            } else {
EmbeddedDatabaseType type = EmbeddedDatabaseConnection.get(context.getClassLoader()).getType();
return type == null ? ConditionOutcome.noMatch(message.didNotFind("embedded database").atAll()) : ConditionOutcome.match(message.found("embedded database").items(new Object[]{type}));
            }
        }
    }
static class PooledDataSourceAvailableCondition extends SpringBootCondition {
PooledDataSourceAvailableCondition() {
        }
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
Builder message = ConditionMessage.forCondition("PooledDataSource", new Object[0]);
return this.getDataSourceClassLoader(context) != null ? ConditionOutcome.match(message.foundExactly("supported DataSource")) : ConditionOutcome.noMatch(message.didNotFind("supported DataSource").atAll());
        }
private ClassLoader getDataSourceClassLoader(ConditionContext context) {
Class<?> dataSourceClass = DataSourceBuilder.findType(context.getClassLoader());
return dataSourceClass != null ? dataSourceClass.getClassLoader() : null;
        }
    }
static class PooledDataSourceCondition extends AnyNestedCondition {
PooledDataSourceCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
        }
@Conditional({DataSourceAutoConfiguration.PooledDataSourceAvailableCondition.class})
static class PooledDataSourceAvailable {
PooledDataSourceAvailable() {
            }
        }
@ConditionalOnProperty(
prefix = "spring.datasource",
name = {"type"}
        )
static class ExplicitType {
ExplicitType() {
            }
        }
    }
@Configuration
    @Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import({Hikari.class, Tomcat.class, Dbcp2.class, Generic.class, DataSourceJmxConfiguration.class})
protected static class PooledDataSourceConfiguration {
protected PooledDataSourceConfiguration() {
        }
    }
@Configuration
    @Conditional({DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import({EmbeddedDataSourceConfiguration.class})
protected static class EmbeddedDatabaseConfiguration {
protected EmbeddedDatabaseConfiguration() {
        }
    }
}

  2 

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.autoconfigure.jdbc;
import javax.sql.DataSource;
import javax.sql.XADataSource;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Builder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Dbcp2;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Generic;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Hikari;
import org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Tomcat;
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
public DataSourceAutoConfiguration() {
    }
static class EmbeddedDatabaseCondition extends SpringBootCondition {
private final SpringBootCondition pooledCondition = new DataSourceAutoConfiguration.PooledDataSourceCondition();
EmbeddedDatabaseCondition() {
        }
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
Builder message = ConditionMessage.forCondition("EmbeddedDataSource", new Object[0]);
if (this.anyMatches(context, metadata, new Condition[]{this.pooledCondition})) {
return ConditionOutcome.noMatch(message.foundExactly("supported pooled data source"));
            } else {
EmbeddedDatabaseType type = EmbeddedDatabaseConnection.get(context.getClassLoader()).getType();
return type == null ? ConditionOutcome.noMatch(message.didNotFind("embedded database").atAll()) : ConditionOutcome.match(message.found("embedded database").items(new Object[]{type}));
            }
        }
    }
static class PooledDataSourceAvailableCondition extends SpringBootCondition {
PooledDataSourceAvailableCondition() {
        }
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
Builder message = ConditionMessage.forCondition("PooledDataSource", new Object[0]);
return this.getDataSourceClassLoader(context) != null ? ConditionOutcome.match(message.foundExactly("supported DataSource")) : ConditionOutcome.noMatch(message.didNotFind("supported DataSource").atAll());
        }
private ClassLoader getDataSourceClassLoader(ConditionContext context) {
Class<?> dataSourceClass = DataSourceBuilder.findType(context.getClassLoader());
return dataSourceClass != null ? dataSourceClass.getClassLoader() : null;
        }
    }
static class PooledDataSourceCondition extends AnyNestedCondition {
PooledDataSourceCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
        }
@Conditional({DataSourceAutoConfiguration.PooledDataSourceAvailableCondition.class})
static class PooledDataSourceAvailable {
PooledDataSourceAvailable() {
            }
        }
@ConditionalOnProperty(
prefix = "spring.datasource",
name = {"type"}
        )
static class ExplicitType {
ExplicitType() {
            }
        }
    }
@Configuration
    @Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import({Hikari.class, Tomcat.class, Dbcp2.class, Generic.class, DataSourceJmxConfiguration.class})
protected static class PooledDataSourceConfiguration {
protected PooledDataSourceConfiguration() {
        }
    }
@Configuration
    @Conditional({DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class})
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
@Import({EmbeddedDataSourceConfiguration.class})
protected static class EmbeddedDatabaseConfiguration {
protected EmbeddedDatabaseConfiguration() {
        }
    }
}

   

  不难看出,DataSourceAutoConfiguration和嵌套@Configuration类同样综合了@Configuration 类 和 @Conditional的特性,不过嵌套@Configuration类伴随着DataSourceAutoConfiguration的装配而装配,那么问题来了 DataSourceAutoConfiguration是如何被装配的

 spring-boot-autoconfiguration是spring boot核心模块,其中提供了大量的内建自动装配@Configuration类,他们统一放在org.springframework.boot.autoconfigure包或者子包下, 同时这些类均配置在META-INF/spring.factories资源中

 

 

 

 

分享到:
评论

相关推荐

    Java注解机制之Spring自动装配实现原理详解

    Java注解机制是Java语言中的一种元数据 Facility,提供了一种在编译期和运行期对Java代码进行标记和描述的机制, Spring框架中使用Java注解机制来实现自动装配功能。自动装配是指Spring框架根据注解信息来自动将Bean...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...

    Spring实现自动装配

    5. **基于JSR-330的自动装配**:Spring 3.0引入了对JSR-330标准的支持,包括`javax.inject.Inject`和`javax.inject.Named`注解,这些也可以用来实现自动装配。 在实际开发中,我们常常结合使用XML配置和注解,以...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    本篇将重点讲解Spring的@Autowired自动装配机制,包括XML配置版和注解版,并深入到源码层面进行解析。 @Autowired是Spring框架中的一个核心注解,用于实现自动装配bean的需求。当我们想要在类中注入某个依赖时,...

    spring自动装配例子

    ean的自动装配,有4种 (1)no:不做任何操作 (2)byName:根据属性 名 自动装配,设值注入 &lt;bean id="xxx" class="xxx" &gt;&lt;/bean&gt; (3)byType:根据属性 类型 自动装配,相同类型多个会抛出异常,设值注入 ...

    spring学习之四“自动装配”

    在Spring框架中,“自动装配”(Autowiring)是一项核心特性,它允许...理解并合理运用自动装配机制,可以使Spring应用的开发变得更加高效和便捷。在实际应用中,需要结合项目特点和需求,灵活选择合适的自动装配策略。

    工业机器人自动装配系统的研究与设计.pdf

    本文主要研究了工业机器人自动装配系统的设计和开发,旨在解决现有工业机器人装配系统中噪音和粉尘的影响生产环境的问题。该系统由六个模块组成,分别是主控模块、数据采集模块、视觉采集模块、测距模块、吸尘模块和...

    Spring自动装配解析

    Spring框架是Java开发中广泛应用的一个轻量级容器,它的核心特性之一就是依赖注入(Dependency Injection,简称DI),而Spring的自动...但在实际应用中,需要根据项目需求和bean的关系灵活选择自动装配还是手动配置。

    springboot自动装配笔记

    SpringBoot 是一个基于 Spring 框架的快速开发工具,旨在简化新 Spring 应用的初始搭建以及开发过程。它的核心特性是可以自动配置 Spring 框架...在实际开发中,理解这一机制对于优化应用结构和解决问题具有重要意义。

    Spring 自动装配及其注解

    在Spring框架中,自动装配...理解并熟练掌握自动装配的原理和注解,能够更好地利用Spring框架的优势,构建更加灵活和可维护的Java应用。在实际使用中,应根据项目需求和bean的关系选择合适的装配策略,以达到最佳效果。

    第四章示例代码__自动装配

    通过阅读和运行这些示例代码,你可以亲手实践自动装配,理解其工作原理,并学会如何在自己的项目中应用这一强大的设计模式。这不仅有助于提升你的编程技能,还能让你的代码更加优雅和易于维护。

    深度剖析Spring Boot自动装配机制实现原理(csdn)————程序.pdf

    总的来说,Spring Boot的自动装配机制基于一系列注解和接口,如`@EnableAutoConfiguration`、`AutoConfigurationImportSelector`、`@Conditional`等,实现了根据项目依赖和配置动态地加载和配置bean,极大地提升了...

    idea手册解决自动装配问题

    解决IDEA中自动装配,找不到类型的bean问题

    springBoot自动装配原理以及starter技术.pdf

    总结,Spring Boot的自动装配和starter技术大大简化了Java应用的配置,通过`@Import`注解和自动配置机制,我们可以高效地管理Bean的生命周期。理解这些原理对于优化和调试Spring Boot应用至关重要。

    Ext自动装配示例

    在IT行业中,自动装配是一种常见的软件开发技术,特别是在Java Spring框架和前端JavaScript库如Ext JS中。本示例主要探讨的是Ext JS中的自动装配,它主要用于简化组件间的依赖注入,提高代码的可维护性和可扩展性。 ...

    Spring由类型(Type)自动装配源码

    总的来说,Spring的类型自动装配机制是通过扫描和解析bean定义,结合@Autowired、@Qualifier等注解,以及bean工厂的方法,实现依赖的自动查找和注入。理解这一机制有助于我们更好地设计和维护Spring应用,减少手动...

    Spring中的自动装配有哪些限制?.docx

    当一个bean同时定义了构造器注入和setter注入时,自动装配将被忽略。Spring会优先使用带有@Autowired注解的构造函数或setter方法,这意味着如果这些方法存在,自动装配的配置将不起作用。因此,如果你希望使用自动...

    spring自动装配

    “工具”标签可能暗示该主题可能包含了使用Spring Tool Suite (STS)或其他相关工具进行自动装配配置和调试的方法,这些工具能帮助开发者更高效地管理和理解Spring应用的配置。 在压缩包文件名称“spring_0700_IOC_...

    springboot自定义自动装配.rar

    一、理解自动配置 1. **自动配置类**:Spring Boot通过`@EnableAutoConfiguration`注解开启自动配置功能。这个注解会触发一系列预定义的配置类,这些配置类由`META-INF/spring.factories`文件中的`org.spring...

    4Spring自动装配——annotation resource方式

    在Spring框架中,自动装配(Auto-Wiring)是一种简化依赖注入(Dependency Injection,DI)配置的方式,它允许...通过阅读和理解源码,我们可以更好地掌握Spring自动装配的工作原理,从而更好地利用这一强大的功能。

Global site tag (gtag.js) - Google Analytics