当前位置: 首页 > news >正文

wordpress 快站浏览器小游戏在线玩

wordpress 快站,浏览器小游戏在线玩,网站开发笔记本,wordpress 有道笔记文章目录什么是 SpringBoot 自动配置Spring 加载 Bean问题描述原因分析解决方案ComponentScanImport1 . 导入类2 . 导入 ImportSelector 接口实现类问题什么是 SpringBoot 自动配置 SpringBoot 的自动配置就是当 Spring 容器启动之后,一些配置类,bean 对…

文章目录

  • 什么是 SpringBoot 自动配置
  • Spring 加载 Bean
    • 问题描述
    • 原因分析
    • 解决方案
      • @ComponentScan
      • @Import
        • 1 . 导入类
        • 2 . 导入 ImportSelector 接口实现类
        • 问题

什么是 SpringBoot 自动配置

SpringBoot 的自动配置就是当 Spring 容器启动之后,一些配置类,bean 对象就自动存入到了 IoC 容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作

SpringBoot 自动配置,就是指 SpringBoot 是如何将依赖 jar 包中的配置以及 Bean 加载到 Spring IoC 容器中的

我们学习主要分以下两个方面:

  1. Spring 是如何把对象加载到 SpringIoC 容器中的
  2. SpringBoot 是如何实现的

Spring 加载 Bean

问题描述

需求:使用 Spring 管理第三方的 jar 包的配置

  • 引入第三方的包,其实就是在该项目下,引入第三方的代码,我们采用在该项目下创建不同的目录来模拟第三方的代码引入

数据准备

  1. 创建项目 spring-autoconfig,当前项目目录为:com.example.demo
  2. 模拟第三方代码文件在 com.bite.autoconfig 目录下image.png|251

第三方文件代码:

public class BiteConfig {  public void study() {  System.out.println("start study...");  }  
}
  1. 获取 BiteConfig 这个 Bean

写测试代码

@SpringBootTest  
class ApplicationTests {  @Autowired  private ApplicationContext applicationContext;  @Test  void contextLoads() {  BiteConfig biteConfig = applicationContext.getBean(BiteConfig.class, "biteConfig");  System.out.println(biteConfig);  }  
}
  1. 运行程序
    image.png
  • 观察日志:No qualifying bean of type 'com.bite.autoconfig.BiteConfig' available
  • 没有 com.bite.autoconfig.BiteConfig 这个类型的 Bean

原因分析

Spring 通过五大注解和 @Bean 注解可以帮助我们把 Bean 加载到 SpringIoC 容器中,以上有个前提就是这些注解类需要和 SpringBoot 启动类在同一个目录下(@SpringBootApplication 标注的类就是 SpringBoot 的启动类)

  • 启动类所在目录为:com.example.deml,而 BiteConfig 这个类在 com.bite.autoconfig 下,所以 SpringBoot 没有扫描到

解决方案

我们需要指定路径或者引入的文件,告诉 spring,让 Spring 进行扫描到

常见的解决方案有两种:

  1. @ComponentScan 组件扫描
  2. Import 导入(使用 @Import 导入的类会被 Spring 加载到 IoC 容器中)

我们通过代码来看如何解决

@ComponentScan

通过 @ComponentScan 注解,指定 Spring 扫描路径

@ComponentScan("com.bite.autoconfig")  
@SpringBootApplication  
public class Application {  public static void main(String[] args) {  SpringApplication.run(Application.class, args);  }  }
  • 可以指定扫描多个包 @ComponentScan({"com.bite.autoconfig","com.example.demo"})

运行程序:image.png|403

可以看到,这次 biteConfigBean 获取到了

  • Spring 是否使用了这种方式呢?
  • 非常明显,没有(因为我们引入第三方框架时,没有加扫描路径,如 mybatis
  • 如果 SpringBoot 采用这种方式,当我们引入大量的第三方依赖,比如 MyBatisjackson 等时,就需要在启动类上配置不同依赖需要扫描的包
  • 这种方式会非常繁琐

@Import

@Import 导入主要有以下几种形式

  1. 导入类
  2. 导入 ImportSelector 接口实现类

1 . 导入类
@Import(BiteConfig.class)  
@SpringBootApplication  
public class Application {  public static void main(String[] args) {  SpringApplication.run(Application.class, args);  }  }
  • 运行程序image.png
  • 可以看到,这种方式也可以告诉 Spring 加载 biteConfig

问题:如果又多了一些配置项呢?

@Component  
public class BiteConfig2 {  public void study2() {  System.out.println("start study2...");  }  
}

我们可以采用导入多个类

@Import({BiteConfig.class, BiteConfig2.class})  
@SpringBootApplication  
public class Application {  public static void main(String[] args) {  SpringApplication.run(Application.class, args);  }  }

很明显,这种方式也很繁琐,所以,SpringBoot 依然没有采用

2 . 导入 ImportSelector 接口实现类

ImportSelector 接口实现类

public class MyImportSelector implements ImportSelector {  @Override  public String[] selectImports(AnnotationMetadata importingClassMetadata) {  // 需要导入的全限定类名  return new String[]{"com.bite.autoconfig.BiteConfig", "com.bite.autoconfig.BiteConfig2"};  }  
}

启动类:

@Import(MyImportSelector.class)  
@SpringBootApplication  
public class Application {  public static void main(String[] args) {  SpringApplication.run(Application.class, args);  }  }

运行程序:image.png|472

  • 可以看到,我们采用这种方式也可以导入第三方依赖提供的 Bean

问题

问题
但是他们都有一个明显的问题,就是使用者需要知道第三方依赖中有哪些 Bean 对象或配置类。如果漏掉了其中一些 Bean,就可能导致我们的项目出现大事故

依赖中有哪些 Bean,使用时需要配置哪些 Bean,第三方依赖最清楚,那能否由典发那个依赖来做这件事呢?

  • 比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以 @EnableXxxx 开头,注解中封装的就是 @Import 注解

  1. 第三方依赖提供注解
import org.springframework.context.annotation.Import;  import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.TYPE)  
@Import(MyImportSelector.class)  
public @interface EnableBiteConfig {  
}

注解中封装 @Import 注解,导入 MyImportSelector.class

  1. 在启动类上使用第三方提供的注解
@EnableBiteConfig  
@SpringBootApplication  
public class Application {  public static void main(String[] args) {  SpringApplication.run(Application.class, args);  }  }

运行程序:image.png

  • 可以看到,这种方式也可以导入第三方依赖提供的 Bean
  • 并且这种方式更优雅一点,SpringBoot 采用的也是这种方式
http://www.dtcms.com/a/551410.html

相关文章:

  • 漳浦网站设计vue框架 wordpress
  • 足球哪个网站做的比较好网站可以不备案吗
  • 营销型网站 案例南京网站推广费用
  • 建设网站入不入无形资产吉林省吉林市邮政编码
  • 网站模版网 下载博物馆建设网站的作用
  • 网站推广方案怎么写传奇游戏排行榜
  • 做商城网站服务器配置怎么选择2 网站建设的一般步骤包含哪些
  • 网站开发 网络工程 哪个好成都旅游几月份去最佳时间
  • 网站建设需要哪些软件沙县住房和城乡规划建设局网站
  • 梅州网站建设求职简历网页布局排版技巧
  • 河南住房与建设厅网站外贸建站用什么服务器
  • 清远住房和城乡建设局网站网站建设上机考试题目
  • 网站优化北京哪家强?wordpress编译太慢
  • 安徽房和城乡建设部网站wordpress 清空 demo
  • 学做网站需要学哪些软件网络宣传怎么做
  • 网站建设人员招聘要求上海idc机房托管
  • 建设美食电子商务网站沧州网站制作
  • 免费开源代码网站网站如何做seo规划
  • 一学一做动漫视频网站重庆网站营销公司
  • 汕头网站备案滑动门代码 wordpress
  • 网站中搜索栏怎么做的管理软件网站模板
  • 好网站建设网站网站开发的问题
  • 二级域名如何绑定网站网页版梦幻西游伙伴
  • 好多职业培训网站是怎么做的咸阳网站推广
  • 建设电商网站的个人心得张家界酒店网站建设
  • 云南省建设网站福千欣隆网站建设公司 概况
  • 服务器做网站用什么环境好河南郑州网站建设
  • 溧阳网站优化漂亮的企业网站源码
  • 高水平的徐州网站建设企业网站备案 过户
  • 医药招商网站大全免费dedecms网站迁移