[学习记录] SpringBoot 2. 底层注解

SpringBoot 2. 底层注解

尚硅谷

官方文档

1. @Configuration

1.1 基本应用

新建 PetUser 类,代码省,并实现 gettersetter 等方法。
新建 MyConfire 类:

@Configuration
public class MyConfigure {

    /**
     * 给容器中添加组件, 以方法名作为组件 id。
     * 返回类型就是组件类型, 返回的值就是组件在容器中的实例。
     */
    @Bean
    public User user01() {
        return new User("张三", 18);
    }

    @Bean("tom")
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }
}

@Configuration 告诉 SpringBoot 这是一个 配置类 == 配置文件

配置类中使用 @Bean 标注在方法上给容器注册组件,默认是单实例的。@Bean(id) 若不加 id 参数,默认组件 id 就是方法名。

getBean(id, class) 在主程序中获取组件:

ConfigurableApplicationContext run = SpringApplication.run(SpringbootReviewRecordsApplication.class, args);
Pet tom1 = run.getBean("tom", Pet.class);
Pet tom2 = run.getBean("tom", Pet.class);
System.out.println(tom1 == tom2);

最后的结果是 true,说明是单实例的。

用配置类 组件bean.组件默认名() 查看组件:

MyConfigure bean = run.getBean(MyConfigure.class);
System.out.println(bean);
User user = bean.user01();
System.out.println(user);

在这里插入图片描述

外部无论对配置文件中的这个组件注册方法调用多少次获取的都是之前注册容器的单实例对象

1.2 两种模式

  • Lite 模式(默认)
    @Configuration(proxyBeanMethods = true) 启动代理对象调用方法,SpringBoot 总会检查这个组件是否在容器中存在。保持组件单实例。
  • Full 模式
    @Configuration(proxyBeanMethods = false),则每次调用都新建对象。

最佳实战:

  • 配置类组件之间无依赖关系用 Lite 模式加速容器启动过程,减少判断
  • 配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用 Full 模式

2. @Bean,@Component,@Controller,@Service,@Repository

跟之前的用法一致。

3. @ComponentScan,@Import

@ComponentScan 用法和之前一致。

@Import 注解可以导入自己的组件。

@Import({User.class})
@Configuration(proxyBeanMethods = true)
public class MyConfigure {
	@Bean
    public User user01() {
        return new User("张三", 18);
    }
	// ...	
}

@Import({User.class}) 给容器中自动创建 User.class 类型的组件。

在主程序中查看:

String[] beanNamesForType = run.getBeanNamesForType(User.class);
for (String s : beanNamesForType) {
    System.out.println(s);
}

在这里插入图片描述
可以看到默认组件的名字就是全类名 com.xz.entity.User

4. @Conditional

条件装配:满足 Conditional 指定的条件,则进行组间注入。

继承树:
[学习记录] SpringBoot 2. 底层注解_第1张图片
比如:
ConditionalOnBean 当有指定 Bean 组件干什么。

ConditionalOnMissingBean 当没有指定 Bean 组件干什么。

	@ConditionalOnBean(name = "tom22")
    @Bean
    public User user01() {
        return new User("张三", 18);
    }

若存在名字为 tom22 的组件,则创建 user01 组件,否则不创建。

5. @ImportResource

引入以前的 xml 文件。
比如:
@ImportResource("classpath:beans.xml")

6. 配置绑定

能更简单的与配置文件交互。

补:

  • Q:什么有配置文件?
  • A:因为如果全写在程序里面的话每次修改配置都需要重新编译。

6.1 @ConfigurationProperties

先新建一个 Car 类,两个属性 brandprice,并实现 gettersetter 等方法。

加上注解:

@ConfigurationProperties(prefix = "mycar")
public class Car {
	// ... 
}

application.yml 添加:

mycar:
  brand: BYD
  price: 100000

6.2 @EnableConfigurationProperties + @ConfigurationProperties

在 6.1 的基础上,在 MyConfigure 上加注解 @EnableConfigurationProperties(class),表示开启 Car 属性配置功能,并把 Car 这个组件自动注入到容器中:

@EnableConfigurationProperties(Car.class)
public class MyConfigure {
	// ...
}

编写 HelloController,添加内容:

@Autowired
Car car;

@RequestMapping("/car")
public Car car() {
    return car;
}

访问 http://localhost:8888/car 然后就可以看到
在这里插入图片描述

6.3 @Component + @ConfigurationProperties

取消 MyConfigure 类上的注解 @EnableConfigurationProperties(Car.class),然后在 Car 类上加上 @Component

访问 http://localhost:8888/car 然后也可以看到
在这里插入图片描述

你可能感兴趣的:(Spring,Boot,spring,boot,学习,java)