ベローがコードです。それを実行してブラウザでlocalhost:8080/helloに移動すると、実際にプロトタイプフィールドに挿入されているSpring CGLIBプロキシが新しいBeanを作成するため、シーケンス "1,2"、 "2,3"すべてのメソッド呼び出しで。バックスシングルトンBeanは、プロキシされたときに各メソッド呼び出しで新しいインスタンス/ Beanを作成します
私はのObjectFactoryでこれを解決することができ
...出力が「1,1」、「2,2」でなければなりませんので、プロトタイプBeanは一度だけHTTP呼び出しごとに作成しなければならないと思うが、その後、私はすべてのAOPバネ機能とともにプロキシを失う。
これはどのように動作するはずですか?私は間違っているのですか?これはSpringの本当の制限ですか? Javaベースの設定で何とか解決できますか?
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 PrototypeExample
がSCOPE_PROTOTYPE
scope属性を持つ
<?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を作成します。プロキシを削除するか、別のスコープを使用してください。 –