SpringBoot特点
依赖管理
- 父项目做依赖管理:父项目中声明了非常多的依赖,只要子项目继承了父项目,那么子项目写依赖就不需要版本号了
- 开发导入starter场景启动器
1.当需要用到web场景时,不需要引入过多的包,只需要引入springboot-starter-web即可,其他场景也是,引入springboot-starter-*即可,常规需要的依赖都会自动引入
2.所有场景启动器都有一个最底层依赖,也是springboot的核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
- 无需关注版本号,自动版本仲裁
1.引入依赖默认可以不写版本
2.引入非版本仲裁的jar,就必须写版本号 - 可以修改版本号
1.在spring-boot-dependencies里面规定当前以来的版本用的key(<mysql.version>)
2.在当前项目的pom文件中重新设置配置:如果需要自定义修改mysql或其他依赖的版本那就需要在pom文件中用标签声明mysql的版本
自动配置
- 自动配好Tomcat
- 引入Tomcat依赖
- 配置Tomcat
- 自动配置MVC
- 引入全套组件
- 自动配好常用功能
- 自动配好web常见功能
- 配置了所有web开发的场景
- 默认的包结构
- 主程序所在包及其下面的所有把里面的组件都会被默认扫描进来
- 只有当把方法类放到和主程序同一个包下,才能利用主程序将这个方法类中的方法运行(类中的请求顺利完成)
- 而当包不在同意路径时,可以在“@SpringBootApplication”后面加上(scanBasePackages="包名(扫描路径)")即可
- 无需以前的包扫描
- 各种配置都有默认值
- 默认配置都是映射到某一个类上的
- 配置文件的值最终hi绑定到某个类中,这个类会在容器中创建对象
- 按需加载所有自动配置项
- 有很多的starter,但我们只引入了web的starter,那么就会只启动web中的配置
- 引入那些场景就会启动那些场景
容器功能
组件添加
比如需要添加用户和宠物这两个组件,在之前对组件进行添加就需要先创建一个.xml文件
现在,springboot添加组件的方式为:
- 1.@Configuration
首先创建一个类
再用注解表标明
这个类就等同原来的配置文件.xml
@Bean
使用方法来为容器添加组件,用@Bean注解声明所添加的组件
这个注解用来表明,下面的方法就是给容器添加组件,方法名就作为组件的id;返回类型就是组件类型;返回的值就是组件在容器中保存的值(实例)
添加之后这两个组件就会存在在容器当中,下面就从容其中回去这个两个组件。(注意:此时,主程序可以返回容器,我们可以直接在主程序当中获取)
方法名不是数据名,是组件id(默认),如果想要另外自定义组件id(组件名),可以通过在@Bean后添加字符串类定义如,@Bean("自定义名")
注册的组件默认是单实例,也就是说,无论获取几次,获取到的都是同一个实例
注意,在开头创建的配置类,也是一个组件
proxyBeanMethods:代理bean的方法
这是@Configuration的属性,也是springboot2区别于1的地方,它的默认值是"true"(trued代理,false不代理)
同样的,外部无论对配置类中的这个注册方法调用多少次,获取的都是注册到示例中的单实例对象,是同一个对象,原因就是@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中,如果在,就直接调用,如果不在就新创建,以此来保证组建单实例性。每次被调用,都会在容器中找组件
@Configuration(proxyBeanMethods = false),那么就不是代理对象调用方法。多次获取后,得到的就不是同一个对象。每一次调用,都会创建一个新对象
在底层,springboot对@Configuration的配置分为Full(proxyBeanMethods = true)全配置、Lite(proxyBeanMethods = false)轻量级配置
使用场景:解决组建依赖
全配置:这个user想要养一个相同bean下的宠物,那么我们可以在user这个方法中调用Pet这个方法,那么此时所养的宠物就是从相同bean中获取的宠物。user想要养一个相同bean下的宠物,这就是一种依赖行为。当用户需要这种依赖关系时,我们就用全配置(每次调用需要检查内部有没有这个方法)
轻配置:这个user想要养一个相同bean下的宠物,那么我们可以在user这个方法中调用Pet这个方法,但由于是轻配置,user直接调用Pet时,Pet重新创建了一个Pet对象(尽管对象名相同,但却不是同一个对象)。不需要养相同bean下的宠物,这就是一种不依赖关系,就用轻配置(每次调用跳过检查方法是否存在,快)
当有依赖关系时就用全配置;没有依赖关系就用轻配置(快)
- 2.添加组件另一种方法
@Component(在类上标注,标明这个类是一个组件) @Controller(标明是一个控制器) @Service(标明是业务逻辑组件) @Repository(标明是一个数据库层组件),只要卸载主程序类里面的包就行 - 3.@Import
使用位置:任意一个配置类、组件中都可以
作用:这是一个class数组,可以通过这个注解导入很多的组件;导入自定义的组件、导入第三方组件
格式:@Import({User.class, DBHelper.class}),然后就可以将指定的组件放到容器中,可以通过run.getBean()方法查找是否存在。
导入后,创建的组件名默认是全类名。 - 4.@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
逻辑是:当满足或不满足某种条件、有或没有某些东西时(前半句),就注入某些组件(括号内)
逻辑就是,当容器中存在组件名为tom的组件时,我们就注册user01这个组件;如果没有就不注册;通过上面测试,我们知道tom不存在,所来来检验一下,user01是否被注册。预计结果:user01不存在
显然,没有了。
由此,当@Conditional使用在配置类的类名前时,那就将下面所有的行为当作满足条件后才可执行的行为。
此外还有:
@ConditionalOnMissingBean(name = "tom"),当容器中没有tom组件的时候,就进行下面的行为。
原生配置文件引入(进行注册组件)
- @ImportResource(导入资源)
使用位置:配置类当中
目前的springboot2是不识别自定义的.xml文件的,也就是说利用开头所讲的老式注册组件的方法,是不能够在容器中注册成功的,无法找到插件。
可以通过@ImportResource("classpath:自定义.xml")注解的方法,将指定的资源导入(作用就是将.xml文件解析,然后把里面的组件注册到容器中)
先来验证haha和hehe
而后我们通过@ImportResource("classpath:自定义.xml")导入资源
配置绑定
如何使用java读取到properties文件里的内容,并把它封装到JavaBean中,以供随时使用;
配置绑定就是,将类中的属性以及属性值,绑定到配置文件中的关键字上,这样找起来比较方便。
1.@Component+@ConfigurationProperties(prefix = "自定义关键字")方式
-
1.将目标类放到容器中(通过@Component注释)
-
2.将目标类与配置文件中的自定义关键字进行绑定(通过@ConfigurationProperties(prefix = "自定义关键字"))
-
3.在配置文件中设置属性值
-
4.虽然目标类已经在容器当中了,但我们依然需要将这个组件(类)注册到peispringboot当中(通过@Autowired)
查看返回结果
2.@EnableConfigurationProperties(prefix = "自定义关键字")+@ConfigurationProperties(类名.class)方式
这种方式必须在配置类当中写
- 在配置类中开启目标类的配置绑定功能(通过@EnableConfigurationProperties(类名.class))
并且可以将目标类自动注册到容器当中
自动配置原理
引导加载自动配置类@EnableAutoConfiguration
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
@SpringBootApplication是这些注解的合成
- @SpringBootConfiguration
内部就是@Configuration,代表当前是一个配置类(主程序是一个核心配置类) - @ComponentScan
就是一个包扫描,指定扫描那些 - @EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
@EnableAutoConfiguration是这些注解的合成
- 1.@AutoConfigurationPackage自动配置包
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
@Import就是给容器导入组件
利用Registrar给容器中导入一些列组件,批量导入
getAutoConfigurationEntry(annotionMetadata);给容器中批量导入一些组件
按需开启
虽然127个场景的所有自动配置启动的时候全部默认加载。但最终会进行按需配置
标签:容器,依赖,自定义,配置,导入,自动,组件 From: https://www.cnblogs.com/hezhipeng/p/16972632.html