文章目录
前言
注解的意思是proxyBeanMethods配置类是用来指定@Bean注解标注的方法是否使用代理。
直接看下面列子简单明了
一、项目结构
二、Dog和Cat简单实体类
@Data
public class Dog {
private String name;
private Cat cat;
}
@Data
public class Cat {
}
三、启动类ProxybeanmethodtestApplication
简单创建的springboot工程
@SpringBootApplication
public class ProxybeanmethodtestApplication {
public static void main(String[] args) {
SpringApplication.run(ProxybeanmethodtestApplication.class, args);
}
}
四、pom文件如下
只使用了lombok依赖,其他都是springboot工程脚手架自带的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cch</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.cch</groupId>
<artifactId>proxybeanmethodtest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>proxybeanmethodtest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
五、PetConfig
1.proxyBeanMethods 先使用默认true的方式
@Configuration(proxyBeanMethods = true)
public class PetConfig {
@Bean
public Dog dog() {
Dog dog = new Dog();
dog.setName("狗狗");
dog.setCat(cat());
return dog;
}
@Bean
public Cat cat() {
System.out.println("cat调用~~~~喵喵******");
return new Cat();
}
}
1.启动工程输出如下:
2.proxyBeanMethods 先使用默认false的方式
@Configuration(proxyBeanMethods = false)
public class PetConfig {
@Bean
public Dog dog() {
Dog dog = new Dog();
dog.setName("狗狗");
dog.setCat(cat());
return dog;
}
@Bean
public Cat cat() {
System.out.println("cat调用~~~~喵喵******");
return new Cat();
}
}
2.启动工程输出如下:
总结
proxyBeanMethods配置类是用来指定@Bean注解标注的方法是否使用代理。
1.当设置为true的时候,说明,当配置类中的某个bean需要配置类中其他的bean对象的时候,是去spring 容器拿的,所以被依赖的那个bean只会创建一次,如本篇文章中,当proxyBeanMethods设置为true时,cat对象只会创建一次,因为创建dog的时候,会去spring容器获取。
2.当设置为false的时候,说明当配置类中的某个bean需要配置类中其他bean对象的时候,是立即创建的,而不是去找spring容器获取。如本篇文章中,当proxyBeanMethods设置为false时,cat对象会创建两次,一次是cat交给spring管理的bean,一次是dog bean初始化的时候会去自己创建一个cat对象出来