Bellow是代码。当你运行它并在浏览器中进入localhost:8080/hello时,你会看到序列“1,2”,“2,3”...,因为Spring CGLIB代理(实际上插入到原型字段中)创建了新的bean在每个方法调用。Spring代码单元bean在代理时在每个方法调用上创建新的实例/ bean
我觉得bean原型应该每个HTTP调用创建只有一次这样的输出应该是“1,1”,“2,2” ..
我可以用ObjectFactory的解决这个问题,但后来我失去代理以及所有AOP弹簧功能。
这应该如何表现?我有错吗?这是否是Spring的限制?它可以通过基于Java的配置以某种方式解决吗?
这是整个代码,你只需要2个文件:
Application.java
@SpringBootApplication
@RestController
public class Application {
@Autowired //one solution is ObjectFactory<PrototypeExample>
private PrototypeExample prototype;
@GetMapping("/hello")
public String hello() {
return (prototype.getCounter() + ", " + prototype.getCounter());
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
@Scope(value = SCOPE_PROTOTYPE, proxyMode = TARGET_CLASS)
class PrototypeExample {
private static AtomicInteger counter = new AtomicInteger();
public PrototypeExample() {
counter.getAndIncrement();
}
public int getCounter() {
return counter.get();
}
}
的pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.neco</groupId>
<artifactId>spring-core_IV</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
您有原型范围,它的行为与它应该完全相同:通过在每个请求上创建新的bean。尝试删除代理或使用不同的范围。 –