@Configuration注解
这个注解的作用就是表明这个类就是配置类。【配置类默认是单例的,其中的组件默认也是单例的】
代码示例:
@Configuration(proxyBeanMethods = true)//表示这是一个配置类===配置文件
@Scope("prototype")
public class Config01 {
@Bean
public Student save(){
return new Student();
}
}
上述的代码中@Configuration(proxyBeanMethods = true)注解中的proxyBeanMethods = true属性表示是不是要创建代理的Bean对象【默认时true】
true:表示是全模式,可以解决组件依赖的关系。创建代理对象。【默认值】
flse:表示是轻量级模式【不可以实现组件的依赖】
如果配置类中的组件存在依赖关系则选择全模式来进行,如果不存在依赖关系,则选择flase来优化册程序的运行时间。
测试:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回的是IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//如果@Configuration(proxyBeanMethods = true)那么run就是一个代理对象,如果是flase那么config就是一个普通的对象。
//,代理对象调用getBean方法之前会在容器中查看组件中是不是已经在容器中如果有则直接进行获取
Config01 config01 = (Config01) run.getBean("config01");
System.out.println(config01);
Config01 config02 = (Config01) run.getBean("config01");
Student save = config01.save();
System.out.println(save);
//是一个普通的对象
Student save1 = config02.save();
System.out.println(save == save1);
最终的返回值是true则证明两个Student是统一个对象,则证明了是代理对象【代理对象调用方法的时候会从容器中查看是不是有这个对象,有的话直接进行使用没有就直接进行创建】
代理对象的地址值:com.itguigu.boot.config.Config01$$EnhancerBySpringCGLIB$$42954591@4d6f197e。则说明是一个代理对象。普通对象:com.itguigu.boot.config.Config01
代码示例二:
@Configuration(proxyBeanMethods = true)//表示这是一个配置类===配置文件
@Scope("prototype")
public class Config01 {
@Bean
public Student save(){
Student student = new Student();
//save组件依赖了save01组件 也就是相当于注入
student.setStudentto(save01());
return student;
}
@Bean
public Studentto save01(){
Studentto studentto = new Studentto();
studentto.setWenju("铅笔");
return studentto;
}
}
//测试类
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回的是IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
Student save = (Student) run.getBean("save");
Studentto studentto = save.getStudentto();
Studentto saveo1 = (Studentto) run.getBean("save01");
System.out.println(studentto == saveo1);
}}
返回值是true那么会就证明在全模式的情况下可以保证一个组件可以保证另一个被依赖的组件可以保持是同一个组件从而保证需要依赖的组件能够保持统一,如果设置为flase的话就完全表示同一个组件。为true的话可以进行
@Import注解
为容器中导入组件
使用范围是:
在任何一个配置类或者是组件的类上面都可以使用;
使用方法:
@Import(****.class,****.class)其中的参数是一个类对象的数组。
给容器中自动创建数组中的组件依赖与数组类的无参构造器。
和在配置类里面的Bean标签的一定的功能。
@Conditional注解
条件装配:满足@Conditional指定的条件才进行装配。
@Conditional注解还是一个根注解派生了很多注解:
派生的注解:
上述的注解每个注解都有它生效的条件只有条件满足才会往容器中注入组件
以@Condi'tionalOnBean()注解为例子可以 = 根据容器中是不是有指定的组件为条件,有 则进行注入容器 没有 不注入组件。【可以标注在组件方法上(判定范围就是这一个组件) 标注在类上(判定范围就是这个配置类里面的所有组件)】。注解内部的参数 可以指定组件的class类型数组,也可以是 组件名称的数组
@ImportResource注解
这个注解是用于引入xml配置文件的作用【大部分是在用于维护老项目中的xml文件的场景】参数是配置文件的地址,相对于类加载路径。
======================beans.xml=========================测试代码示例: @ImportResource("classpath:beans.xml") public class MyConfig {} ======================测试================= boolean haha = run.containsBean("haha"); boolean hehe = run.containsBean("hehe"); System.out.println("haha:"+haha);//true System.out.println("hehe:"+hehe);//true
@ConfigurationProperties和@EnableConfigurationProperties
第一种形式:
是用于配置绑定:【在底层源码中的自动配置类中大量使用】
就例如在配置数据源的时候数据源的配置信息都存储到propertypes文件中,使上述的注解可以直接的进行绑定到配置文件中的配置属性值。
代码示范:
@Component
@ConfigurationProperties(prefix = "carname")
public class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + ''' +
'}';
}
使用@ConfigurationProperties(prefix = "carname")注解的时候需要将这个组件注入到容器中,注解是进行注解绑定参数{carname}是进行筛选配置文件中的配置信息,注解是进行注解绑定的注解其中的参数是 prefix 是进行筛选配置文件中的配置信息,prefix 代表是配置文件中代码的开头 carname.name=sjds 中的carname。然后会根据类中的属性名称与carname.后面的名称进行匹配,并把值进行自动绑定。
测试代码
@GetMapping("/save02")
public String save02(){
return car.getName();
}
第二种方式:
使用@EnableConfigurationProperties + @ConfigurationProperties注解
这种情况下可以用于第三方包下面的配置绑定因为第三方包中的类不能加入@Component注解,
代码示例:
//配置类中的代码
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}
//用于绑定的实体类
@ConfigurationProperties(value = "carname")
public class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + ''' +
'}';
}


