尚硅谷
官方文档
新建 Pet
和 User
类,代码省,并实现 getter
,setter
等方法。
新建 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);
外部无论对配置文件中的这个组件注册方法调用多少次获取的都是之前注册容器的单实例对象。
@Configuration(proxyBeanMethods = true)
启动代理对象调用方法,SpringBoot 总会检查这个组件是否在容器中存在。保持组件单实例。@Configuration(proxyBeanMethods = false)
,则每次调用都新建对象。最佳实战:
跟之前的用法一致。
@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
。
条件装配:满足 Conditional 指定的条件,则进行组间注入。
继承树:
比如:
ConditionalOnBean
当有指定 Bean 组件干什么。
ConditionalOnMissingBean
当没有指定 Bean 组件干什么。
@ConditionalOnBean(name = "tom22")
@Bean
public User user01() {
return new User("张三", 18);
}
若存在名字为 tom22
的组件,则创建 user01
组件,否则不创建。
引入以前的 xml 文件。
比如:
@ImportResource("classpath:beans.xml")
能更简单的与配置文件交互。
补:
先新建一个 Car
类,两个属性 brand
和 price
,并实现 getter
,setter
等方法。
加上注解:
@ConfigurationProperties(prefix = "mycar")
public class Car {
// ...
}
在 application.yml
添加:
mycar:
brand: BYD
price: 100000
在 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
然后就可以看到
取消 MyConfigure
类上的注解 @EnableConfigurationProperties(Car.class)
,然后在 Car
类上加上 @Component
。
访问 http://localhost:8888/car
然后也可以看到