③. 父项目依赖管理特性
- ①. 父项目做依赖管理
<!--依赖管理--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <!--上面项目的父项目如下--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> </parent> <!--它几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制-->
②. Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
见到很多 spring-boot-starter-* :*代表某种场景
只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
SpringBoot所有支持的场景
见到的 *-spring-boot-starter:第三方为我们提供的简化开发的场景启动器
<!--所有场景启动器最底层的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.3.4.RELEASE</version> <scope>compile</scope> </dependency>
- ③. 无需关注版本号,自动版本仲裁
- 引入依赖默认都可以不写版本
- 引入非版本仲裁的jar,要写版本号
④. 底层注解@Configuration
- ①. 关于Configuration详解
- Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认)
- Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)
/** (1). 配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的 (2). 配置类本身也是组件 (3). proxyBeanMethods:代理bean的方法 Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认) Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的) proxyBeanMethods = false,如果别人不用,设置为false,会变得快,减少了这个检查的过程 */ @SuppressWarnings("all") @Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件 public class MyConfig { //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例 @Bean public User user01(){ User zhangsan = new User("zhangsan", 18); //user组件依赖了Pet组件 zhangsan.setPet(tomcatPet()); return zhangsan; } @Bean("tom") public Pet tomcatPet(){ return new Pet("tomcat"); } }
@SpringBootApplication //等同于如下三个注解 //@SpringBootConfiguration //@EnableAutoConfiguration //@ComponentScan("com")//可以扫描com及com下的所有包 public class MainApplication { public static void main(String[] args) { //1.返回我们的IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //2.查看容器里面的组件 String[] names = run.getBeanDefinitionNames(); for (String name : names) { //System.out.println(name); } //3.从容器中获取组件 Pet tomcat1 = run.getBean("tom", Pet.class); Pet tomcat2 = run.getBean("tom", Pet.class); System.out.println(tomcat1==tomcat2); //4、com.xiaozhi.config.MyConfig@2def7a7a MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); /** * 如果@Configuration(proxyBeanMethods = true)代理对象调用方法 * SpringBoot总会检查这个组件是否在容器中有。 * 保持组件单实例 * */ User user = bean.user01(); User user1 = bean.user01(); System.out.println(user == user1); User user01 = run.getBean("user01", User.class); Pet tom = run.getBean("tom", Pet.class); System.out.println("用户的宠物:"+(user01.getPet() == tom)); } }
- ②. 最佳实战
- 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
- 配置 类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式(默认)