容器功能[重点]
1.组件添加【就是创建Bean对象[重点]】
组件添加,就是在容器创建Bean
对象
A.@Configuration
注解
@Configuration
注解表示是一个配置类,可以添加相关的组件
基本使用:
Full
模式和Lite
模式
-
配置类组件之间无依赖关系用
Lite
模式加速容器启动过程,减少判断,加载快,启动快@Configuration(proxyBeanMethods = false)
-
配置类组件之间有依赖关系,方法会调用得到之前单实例组件,用
Full
模式@Configuration(proxyBeanMethods = true)也是默认值
作用是:如果需要使用到单例模式Full
也就是组件依赖也是默认模式,就设置成Full
模式,其他就使用Lite
模式
示例:
User
类
public class User {
private String name;
private Integer age;
private Pet pet;
提供seting和geting方法及toString
有参构造器和无参构造器
}
Pet
类
public class Pet {
private String name;
提供seting和geting方法及toString
有参构造器和无参构造器
}
Config
类【配置类】
/**
* 表示该类是一个配置类
* 1.配置类里面使用`@Bean`标注在方法上给容器注册组件,默认是单实例的
* 2.配置类本身也是一个组件
* 3.proxyBeanMethods:代理Bean方法
* Full[@Configuration(proxyBeanMethods = true)]:保证每个`@Bean`方法被调用多少次返回的组件都是单实例的
* Lite[@Configuration(proxyBeanMethods = false]:每个`@Bean`方法被调用多少次返回组件都是新创建的
*
* 4.作用是:组件依赖:如果在容器需要单实例的,就使用`Full`模式也是默认方式,否则其他方式是Lite模式
*/
@Configuration(proxyBeanMethods = true)
public class MyConfig {
/**
* Full:外部无论对配置类的这此组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
*/
@Bean//给容器中添加组件,以方法名作为组件的`id`,返回类型就是组件类型,返回的值就是组件在
// 容器中的实例
public User user(){
//如果是:Full模式的, 获取的组件Pet在容器中只有一个就是单例的
User user = new User("湛江",23,pet());
return user;
}
@Bean("tom")// 返回是组件的`ID`是`tom`
public Pet pet(){
return new Pet("tom");
}
}
测试
/**
* @SpringBootApplication注解标注的表示是:是一个SpringBoot应用
* 同时也是程序的入门
*/
@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
// 表示是程序的入口
public static void main(String[] args) {
// 获取 Spring 容器的IOC
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 获取容器中的所有组件
String[] strings = run.getBeanDefinitionNames();
for (String name:
strings) {
System.out.println(name);
}
// 获取容器中的User对象和Pet对象,比较User中的Pet属性和Pet对象是否是同一个对象
User user = run.getBean("user", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("判断用户中的宠物是否和Pet是同一个对象:"+(user.getPet()==tom));
//返回值:判断用户中的宠物是否和Pet是同一个对象:true
}
}
B.@Bean
@Component
@Controller
@Repository
注解创建Bean
对象【添加组件】
C.@ComponentScan
@Import
注解创建Bean
对象【添加组件】
注意是:@Import
注解可以使用在任何组件上对象类上
例如:
/**
* @Import({User.class, DBHelper.class})
* 给容器中自动创建出两个类型的组件,默认组件的名字就是全类名
*/
@Import({User.class})
测试:
/**
* @SpringBootApplication注解标注的表示是:是一个SpringBoot应用
* 同时也是程序的入门
*/
@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
// 表示是程序的入口
public static void main(String[] args) {
// 获取 Spring 容器的IOC
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 获取组件中所有名称
String[] names = run.getBeanNamesForType(User.class);
for (String name:
names) {
System.out.println(name);
}
}
}
@Import
注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration @Configuration}, {@link ImportSelector},
* {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
*/
Class<?>[] value();
}
D.@Conditional
注解【非常重要在底层】
@Conditional
注解是可以作用在类上,表示该类满足条件才装配,可以在方法上
条件装配:满足@Conditional
指定的条件,则进行组件注入
@Conditional
是一个父注解,下面有很多子注解
例如:
@ConditionalOnBean(User.class)
//表示要MyConfig类中包含User.class类型的组件才进行添加组件【就是才创建Bean对象,不创建】
=====================测试条件装配==========================
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
//@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom22")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
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);
}
boolean tom = run.containsBean("tom");
System.out.println("容器中Tom组件:"+tom);
boolean user01 = run.containsBean("user01");
System.out.println("容器中user01组件:"+user01);
boolean tom22 = run.containsBean("tom22");
System.out.println("容器中tom22组件:"+tom22);
}
2.原生配置文件引入@ImportResouce
注解
例如:由于很多在项目中使用了xml
方式创建Bean
对象,所以使用@ImportRResource
注解,引入xml
文件
示例:
需要使用xml
的类上添加该注解引入bean
创建
@ImportResource("classpath:bean.xml")
public class MyConfig {}
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user1" class="com.haikang.boot.pojo.User">
<property name="name" value="海康"/>
<property name="age" value="21"/>
</bean>
</beans>
测试:
@SpringBootApplication(scanBasePackages={"com.haikang"})// 这个注解等同下面三个注解
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan("com.haikang")
public class MainApplication {
// 表示是程序的入口
public static void main(String[] args) {
// 获取 Spring 容器的IOC
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 测试:@ImportResource注解
User user1 = run.getBean("user1", User.class);
System.out.println(user1);
// 返回值:User{name='海康', age=21, pet=null}
}
}
3.配置绑定@ConfigurationProperties
注解
注意配置信息一定要放在主配置
文件中
配置绑定就是读取properties
配置文件中内容,完成相关配置,如:数据库连接等
如何使用java
读取到properties
配置文件内容,并且把它封装到JavaBean
中
配置绑定方式一:@ConfigurationProperties
注解+@Component
注解
需要配置绑定
的类必须在容器中,使用@Component
注解标识目的就是让容器创建该类对象
示例:
主配置
文件中配置信息
#配置绑定演示
mycar.brand="EEJE"
mycar.price=888888
在需要配置绑定
类上添加@ConfigurationProperties
和@Component
注解
/**
* @Component表示将该类,让容器创建对象
* 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
*/
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
提供seting和geting及toString
有参构造器和无参构造器
}
测试
@RestController
public class WordController {
@Autowired
private Car car;
//测试配置绑定
@RequestMapping("/car")
public Car car(){
return car;
}
}
页面显示:
配置绑定方式二:@ConfigurationProperties
注解+@EnableConfigurationProperties
注解
注意是:一定要在配置类
上添加@EnableConfigurationProperties
注解,并且配置信息要写在主配置
文件中,使用场景是使用第三方类
示例:
主配置
文件中配置信息
#配置绑定演示
mycar.brand="EEJE"
mycar.price=888888
在需要配置绑定
类上添加@ConfigurationProperties
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
提供seting和geting及toString
有参构造器和无参构造器
}
在配置类
中添加@EnableConfigurationProperties
注解,表示开启配置绑定
@Configuration(proxyBeanMethods = true)
@EnableConfigurationProperties(Car.class)// 传入需要开启Car配置绑定功能类字节码
/**
* @EnableConfigurationProperties注解作用
* 1.开户Car配置绑定功能
* 2.把这个Car这个组件自动注册到容器中【就是将Car在容器中创建对象】
*/
public class MyConfig {
}
测试
@RestController
public class WordController {
@Autowired
private Car car;
//测试配置绑定
@RequestMapping("/car")
public Car car(){
return car;
}
}
说明了:@EnableConfigurationProperties(Car.class)
----> @ConfigurationProperties(prefix = "mycar")
----> application.properties
三者之间建立了,关系,我们只需要修改application.properties
配置文件中的内容,就是可以修改掉相关配置