@Configuration注解在类上,将该类设置为springboot的配置类,相当于springmvc中的xml文件。
配置类本身也是一个组件和容器。
被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器。
proxyBeanMethods :
存在组件依赖时,属性值应该为true,不存在组件依赖时,可以用false。
pom.xml
4.0.0 org.example springboot-learning1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent2.3.7.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-thymeleaforg.springframework.boot spring-boot-starter-weborg.springframework.session spring-session-coreorg.springframework.boot spring-boot-maven-plugin
将MyConfig.java设置为Springboot的配置类:
MyConfig.java
package com.zwy.boot.config;
import ch.qos.logback.core.db.DBHelper;
import com.zwy.boot.bean.Pet;
import com.zwy.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration(proxyBeanMethods = true)
public class MyConfig {
@Bean
public User user01() {
User zhangsan = new User("zhangsan", 18);
// User组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean
public Pet tomcatPet() {
return new Pet("tomcat");
}
}
其中启动类有:
MainApplication.java
package com.zwy.boot;
import ch.qos.logback.core.db.DBHelper;
import com.zwy.boot.bean.Pet;
import com.zwy.boot.bean.User;
import com.zwy.boot.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class MainApplication {
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);
}
System.out.println("======================");
// 3.从容器中获取组件,注册
Pet pet1 = run.getBean("tom", Pet.class);
Pet pet2 = run.getBean("tom", Pet.class);
System.out.println("组件:" + (pet1 == pet2));
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
User user1 = bean.user01();
User user2 = bean.user01();
System.out.println(user1 == user2);
// 4.验证proxyBeanMethods=false时,用户的宠物是不是容器中的宠物?
User user01 = run.getBean("user01", User.class);
Pet tom = run.getBean("tom", Pet.class);
System.out.println("用户的宠物:" + (user01.getPet() == tom));
}
}
另外有:
User.java
package com.zwy.boot.bean;
public class User {
private String name;
private Integer age;
private Pet pet;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer 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 +
'}';
}
}
Pet.java
package com.zwy.boot.bean;
public class Pet {
private 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 + ''' +
'}';
}
}
文件结构
有文件结构如下:
运行如果proxyBeanMethods = false,每次调用这些方法,都会产生一个新的对象,此时用户的宠物就不是宠物了,会显示用户的宠物:false
参考https://blog.csdn.net/gaochenglong1/article/details/107387284
https://www.cnblogs.com/Infinity-Finish/articles/15759136.html



