SpringBoot2:@Configuration 注解

2023-06-26,,

@Configuration 这个注解的作用,告诉 springboot 这是一个配置类。配置类以及类里的方法都可以作为Bean。里面的方法用@Bean标记。

@Configuration 替换了繁琐的 bean.xml 配置文件,早期的 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 name="user01" class="com.itheima.bean.User">
<property name="name" value="zhangsan"/>
<property name="age" value="18"/>
<property name="pet" value="Pet"/>
</bean> <bean name="Pet" class="com.itheima.bean.Pet">
<property name="name" value="tom"/>
</bean>
</beans>

@Configuration 包含 proxyBeanMethods 字段,其作用:是否返回单例模式,默认值是 true。

@Configuration(proxyBeanMethods=”false”) 则不检测直接返回新实例。使用时注意要先指定代理 Bean,然后多次调用 Bean 的方法,看返回值是否相等

// @Configuration(proxyBeanMethods = false)
Full模式:@Configuration默认使用Full模式,使用前检测是否存在实例,保证单例模式。适用于Bean之间存在依赖的情况
Lite模式:@Configuration(proxyBeanMethods = false)代表轻量模式,不检测直接返回结果。适用于Bean之间不存在依赖的情况

实例1:

需求:写两个JavaBean,用@Configuration,将Bean装入容器。并通过 @Configuration(proxyBeanMethods=”false”) 验证返回结果是否来自同一个实例。

结构目录:

写两个 Bean,user 和 pet。

package com.itheima.bean;

public class Pet {
String name; public Pet() {
} public Pet(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Pet{" +
"name='" + name + '\'' +
'}';
}
} package com.itheima.bean; public class User {
String name;
int age;
Pet pet; public User() {
} public User(String name,int age) {
this.name = name;
this.age = age;
} public User(String name, int age, Pet pet) {
this.name = name;
this.age = age;
this.pet = pet;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Pet getPet() {
return pet;
} public void setPet(Pet pet) {
this.pet = pet;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", pet=" + pet +
'}';
}
}

  Bean的配置类:MyConfig.java,通过@Configuration和@Bean指定装配Bean

@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
public User user01(){ User zhangsan = new User("zhangsan", 18);
// zhangsan.setPet(pet01());
return zhangsan;
}
@Bean("tom")
public Pet pet01(){
return new Pet("tom");
}
}

  测试代码:将 MyConfig.java 作为 Bean,将 @Configuration(proxyBeanMethod=false),多次调用 Bean 的方法,比较返回对象是否相等。

@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run =
SpringApplication.run(MainApplication.class, args);
// String[] names = run.getBeanDefinitionNames();
// for (String name : names) {
// System.out.println(name);
// } //这个ProxyBeanMethod居然是先代理MyConfig这个bean,
// 再用bean调用其方法,测试bean的方法返回是否相等,我的天! MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
User user1 = bean.user01();
User user2 = bean.user01();
System.out.println(user1==user2); // 哥直接用run获取对应的 user01 bean,难怪反复测试都返回true
// User user01 = run.getBean("user01", User.class);
// User user02 = run.getBean("user01", User.class);
// System.out.println(user02==user01);
}
}

  结果:false。因为 MyConfig 标记的注解是 @Configuration(proxyBeanMethods = false) 。

SpringBoot2:@Configuration 注解的相关教程结束。

《SpringBoot2:@Configuration 注解.doc》

下载本文的Word格式文档,以方便收藏与打印。