SpringBoot核心,my-springboot-start实战

本文深入探讨了SpringBoot的作用,包括独立运行、内置Tomcat、自动配置和约定优于配置的特点。接着详细阐述了@Conditional注解的使用,并分析了SpringBoot的工作原理,特别提到了自动配置的流程。最后,通过my-springboot-start实战,展示了如何自定义spring-boot-start来整合第三方框架,强调了动态配置和默认对象的选择机制。
摘要由CSDN通过智能技术生成

一、SpringBoot 作用

  • 可以以jar形式独立运行
  • 内置tomcat容器
  • 自动配置spring
  • 约定大于配置,无代码生成

二、@Conditional注解

  • Config配置类
/**
 * 创建PersonEntity,根据条件不同,注入不同的对象
 */
@Configuration
public class Config {
   
    
    @Bean
    @Conditional(ConditionDev.class)
    public PersonEntity personDepEntity(){
   
        PersonEntity entity = new PersonEntity();
        entity.setName("personDepEntity create");
        return entity;
    }

    @Bean
    @Conditional(ConditionTest.class)
    public PersonEntity personTestEntity(){
   
        PersonEntity entity = new PersonEntity();
        entity.setName("personTestEntity create");
        return entity;
    }
}
  • ConditionDep条件类
public class ConditionDep implements Condition {
   
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
   
        //注解对应的类名
        String className = ((StandardMethodMetadata) metadata).getDeclaringClassName();
        //注解对应的方法名
        String methodName = ((StandardMethodMetadata) metadata).getMethodName();
        //注解对应其他注解的属性,可以获得其他注解的信息
        MultiValueMap<String, Object> annotationAttributes =
                metadata.getAllAnnotationAttributes("org.springframework.context.annotation.Bean");
        System.out.println(className);
        System.out.println(methodName);
        System.out.println(annotationAttributes);
        //spring工厂类。可以获取bean
        System.out.println(context.getBeanFactory().getClass());
        //返回值决定,条件是否成功
        return true;
    }
}
  • ConditionTest条件类
public class ConditionTest implements Condition {
   
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
   
        return false;
    }
}
  • 测试类
public class Main {
   
   public static void main(String[] args) {
   
       AnnotationConfigApplicationContext context =
               new AnnotationConfigApplicationContext(Config.class);
       //输出注入对象
       System.out.println(context.getBean(PersonEntity.class));
   }
}
  • 运行结果
//注解对应的类名
com.moon.condition.Config
//注解对应方法名
personDepEntity
//指定注解的信息
{
   name=[[Ljava.lang.String;@68be2bc2], value=[[Ljava.lang.String;@68be2bc2], initMethod=[], autowire=[NO], destroyMethod=[(inferred)]}
//工厂对象的真是类型
class org.springframework.beans.factory.support.DefaultListableBeanFactory
//注入的对象为personDepEntity 
PersonEntity{
   name='personDepEntity create', age=null, workEntity=null}
------------------------------------------------------------------------
//修改ConditionDep 的返回值为false,修改ConditionTest 的返回值为true
com.moon.condition.Config
personDepEntity
{
   name=[[Ljava.lang.String;@68be2bc2], value=[[Ljava.lang.String;@68be2bc2], initMethod=[], autowire=[NO], destroyMethod=[(inferred)]}
class org.springframework.beans.factory.support.DefaultListableBeanFactory
//此时的注入对象为personTestEntity 
PersonEntity{
   name='personTestEntity create', age=null, workEntity=null}
----------------------------------------------------------------------
结论:@Conditional()的类,实现Condition接口的类,返回的布尔值,决定对象是否注入

三、SpringBoot工作原理

  • Main方法入口
@SpringBootApplication
public class SpringbootsourceApplication {
   
    public static void main(String[] args) {
   
        SpringApplication.run(SpringbootsourceApplication.class, args);
    }
}
  • @SpringBootApplication核心注解
@Target(ElementType.TYPE)//注解使用位置
@Retention(RetentionPolicy.RUNTIME)//运行中使用
@Documented//生成文档
@Inherited//可以被集成
@SpringBootConfiguration//是一个配置
@EnableAutoConfiguration//    自动配置!!!!!!!!
@ComponentScan(excludeFilters = {
   //包扫面
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
   
}
  • @EnableAutoConfiguration自动配置
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage//保存自动配置类以供之后的使用,如jpa的@Entity注解
@Import(AutoConfigurationImportSelector.class)// 配置筛选!!!!!!!!!!!
public @interface EnableAutoConfiguration {
   
}
  • AutoConfigurationImportSelector自动配置选择
public class AutoConfigurationImportSelector
		implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
		BeanFactoryAware, EnvironmentAware, Ordered {
   
		
	@Override
	public void process(AnnotationMetadata annotationMetadata,
			DeferredImportSelector deferredImportSelector) {
   
		Assert.state(
				deferredImportSelector instanceof AutoConfigurationImportSelector,
				() -> String.format("Only %s implementations are supported, got %s",
						AutoConfigurationImportSelector.class.getSimpleName(),
						deferredImportSelector.getClass().getName()));
		//核心方法				
		AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
				.getAutoConfigurationEntry(getAutoConfigurationMetadata(),
						annotationMetadata);
		this.autoConfigurationEntries.add(autoConfigurationEntry);
		for (String importClassName : autoConfigurationEntry.getConfigurations()) {
   
			this.entries.putIfAbsent(importClassName, annotationMetadata);
		}
	}
	
	protected AutoConfigurationEntry getAutoConfigurationEntry(
			AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
   
		if (!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值