42.SpringBoot—原理篇

一、SpringBoot原理篇。

(1)自动配置。

(1.1)bean加载方式。

(1.1.1)xml方式。(适用自定义bean与第三方bean) 

(1.1.2)注解方式+组件扫描。(适用于自定义bean)

(1.1.3)@Bean方式+将类定义为bean+组件扫描。(适用自定义bean与第三方bean) 

(1.1.4)@Import。

注意:@Import导入的bean的名称是全路径类名,其他注解只是类名(首字母小写)。 

(1.1.5)使用上下文对象注册bean对象。

注意:AnnotationConfigApplicationContext对象才有注册bean的方法,其他的对象没有。

(1.1.6)导入实现了ImportSelector接口的类,实现对导入源的编程式处理。

@Import(MyImportSelector.class)在SpringConfig6上面,所以SpringConfig6类是MyImportSelector类的元数据。

@Configuration
//@ComponentScan(basePackages = "com.itheima")
@Import(MyImportSelector.class)
public class SpringConfig6 {
}
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {System.out.println("================");System.out.println("提示:"+metadata.getClassName());System.out.println(metadata.hasAnnotation("org.springframework.context.annotation.Configuration"));Map<String, Object> attributes = metadata.getAnnotationAttributes("org.springframework.context.annotation.ComponentScan");System.out.println(attributes);System.out.println("================");//各种条件的判定,判定完毕后,决定是否装在指定的beanboolean flag = metadata.hasAnnotation("org.springframework.context.annotation.Configuration");if(flag){return new String[]{"com.itheima.bean.Dog"};}return new String[]{"com.itheima.bean.Cat"};}
}

 (1.1.7)导入实现了ImportBeanDefinitionRegistrar接口的类。

@Import({BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar2.class, MyRegistrar.class})
public class SpringConfig8 {
}

(1.1.8)导入实现了BeanDefinitionRegistryPostProcessor接口的类。

理解: 等BeanDefinitionRegistry注册完所有bean之后,BeanDefinitionRegistryPostProcessor才会开始执行,如果遇到同名的则会覆盖之前的。

@Import({BookServiceImpl1.class, MyPostProcessor.class, MyRegistrar2.class, MyRegistrar.class})
public class SpringConfig8 {
}

 (1.1.9)创建上下文对象时指定配置类。(该方式等于@Import(xxx.class))

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);

提示:若创建上下文对象的时候不指定该类(即需要被组件扫描发现是配置类),则需加上@Configuration注解声明该类为配置类。

@ComponentScan({"com.itheima.bean","com.itheima.config"})
public class SpringConfig3 {@Beanpublic DogBean dog(){return new DogBean();}
}
public class App3 {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);String[] names = ctx.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}System.out.println(ctx.getBean("dog"));}
}

(1.1.10)FactoryBean接口(制造接口泛型类型的bean,本质@Bean声明,返回是泛型类型)。

 注意:虽然返回是DogFactoryBean类型,但实际上返回的是泛型的类型。(原理暂不清楚)

public class DogFactoryBean implements FactoryBean<Dog> {@Overridepublic Dog getObject() throws Exception {Dog d = new Dog();//.........return d;}@Overridepublic Class<?> getObjectType() {return Dog.class;}@Overridepublic boolean isSingleton() {return true;}
}
@ComponentScan({"com.itheima.bean","com.itheima.config"})
public class SpringConfig3 {//该方法与下面的方法只能存在一个。(因为两个方法返回值都是Dog类型)@Beanpublic DogFactoryBean dog(){return new DogFactoryBean();}//这个返回的是Dog类型(Dog是接口),该方法与下面的方法只能存在一个。(因为两个方法返回值都是Dog类型)
//    @Bean
//    public Dog dog(){
//        return new Dog();
//    }}

提示:传递的泛型是Book,即@Bean出来的实际是Book对象。 

(1.1.11)配置文件+配置类 = 搭配使用。

提示:个人觉得,跟配置文件中注解扫描该配置类,然后上下文对象中指定配置文件是一样的。

ApplicationContext ctx = new ClassPathXmlApplicationContext("SpringConfig2.xml");

(1.1.12)@Configuration注解的不一样。

@Configuration默认创建的是代理对象,在获取代理对象后,调用该对象里面的方法(有@Bean标记的方法)的时候先去IOC容器中获取返回(即得到的都是同一个对象)。

注意:proxyBeanMethods属性默认是ture,如果是false,则不是代理对象。

(1.1.13)小结。

注意:@Import导入的bean的名称是全路径类名,其他注解只是类名(首字母小写)。  

提示:6、7、8这上使用@Import导入实现接口的类,实际该类不会被注册到容器里面,只会注册接口方法中定义的需要被注册到容器的bean。 

(1.2) Bean的加载控制。

(1.2.1)bean加载控制方式。

提示:能够对bean的加载进行控制的基本都是编程式的。


(1.2.2)bean的加载控制(编程式)。

@Import(MyImportSelector.class)
public class SpringConfig {
}

 (1.2.3)bean的加载控制(注解)。 

@ConditionalOnClass(Mouse.class)检测是否存在这个类,其实使用类型没意义,需要使用字符串才不报错。(这是关于项目有没有该类)

@ConditionalOnBean(name = "com.itheima.bean.Mouse")bean名为mouse(使用@Component注解标记),这也满足。(这是在IOC容器中有没有该对象)

@ConditionalOnBean(name = "jerry")则名称必须要相同(使用@Component(“jerry”)标记)。

注意:注解需要导入springboot基本依赖。 

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.5.4</version></dependency>

注意:还可以在类上就行判断是否需要加载为bean: 

@Component("tom")
@ConditionalOnBean(name = "jerry")
//@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
public class Cat {
}

(1.3)bean依赖属性配置。

总结起来就是:如果配置文件中有值则使用,如果没有则使用默认值。 

@EnableConfigurationProperties(CartoonProperties.class) 注解的作用是将 CartoonProperties 类注册为一个 Spring Bean。

(1.4)自动配置原理。

(1.5)变更自动配置。

(2)自定义starter。

(3)核心原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个QT快速应用

文章目录 创建一个QT快速应用创建项目创建主视图添加应用逻辑为视图添加动画素材文件 参考文章 创建一个QT快速应用 本教程使用内置的QML类型&#xff0c;介绍了Qt Quick的基本概念。有关可以选择的用户界面选项的更多信息&#xff0c;请参阅用户界面。 本教程描述了如何使用…

File Upload

File Upload 文件上传功能是大部分WEB应用的常用功能&#xff0c;网站允许用户自行上传头像、照片、一些服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而&#xff0c;看似不起眼的文件上传功能如果没有做好安全防护措施&#xff0c;…

c++通过gsop调用基于https的webservice接口总结

ww哦步骤&#xff1a; 第一步&#xff1a;生成头文件 webservice接口一般会有一个对外接口文档。比如&#xff1a;http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL 问号后面的参数表示WSDL文档&#xff0c;是一个XML文档&#xff0c;看不懂配置没关系&a…

红帽8.2版本CSA题库:第十题配置用户帐户

红帽8.2版本CSA题库&#xff1a;第十题配置用户帐户 useradd -u 3533 manalo #传创建用户指定uid为3533 echo flectrag | passwd --stdin manalo #设置密码 tail -1 /etc/passwd #查看

RTT(RT-Thread)IIC设备

目录 IIC设备 IIC介绍 电气连接 IIC总线时序 IIC协议 读协议 写协议 访问I2C总线设备 查找 I2C 总线设备 I2C数据读写&#xff08;数据传输&#xff09; 配置IIC步骤 IIC设备 IIC介绍 I2C&#xff08;Inter Integrated Circuit&#xff09;总线是 PHILIPS 公司开发…

SpringBoot案例-部门管理-新增

根据页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 接口文档链接如下&#xff1a; 【腾讯文档】SpringBoot案例所需文档 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 前端在输入要新增的部门名称后&#xff0c;会以JSON格式将数据传入至后端&#xf…

2023年国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

leader-line相关配置问题

安装完两个插件都是教去改config // configureWebpack: config > {// let path require(path)// config.module.rules.push({// test: path.resolve(__dirname, node_modules/leader-line/),// use: [// {// loader: skeleton-loader,// …

开源低代码平台Openblocks

网友 HankMeng 想看低代码工具&#xff0c;正好手上有一个&#xff1b; 什么是 Openblocks &#xff1f; Openblocks 是一个开发人员友好的开源低代码平台&#xff0c;可在几分钟内构建内部应用程序。 传统上&#xff0c;构建内部应用程序需要复杂的前端和后端交互&#xff0c;…

使用GraphQL在Postman中进行API测试

GraphQL 是一种用于API的开源数据查询和操作语言&#xff0c;用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求&#xff0c;并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。 Postman 是一款用于API开发的强大工具&#xff0c;它支持REST和Gra…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

电脑提示数据错误循环冗余检查怎么办?

有些时候&#xff0c;我们尝试在磁盘上创建分区或清理硬盘时&#xff0c;还可能会遇到这个问题&#xff1a;数据错误循环冗余检查。这是如何导致的呢&#xff1f;我们又该如何解决这个问题呢&#xff1f;下面我们就来了解一下。 导致冗余检查错误的原因有哪些&#xff1f; 数据…