2017-08-24 3 views
1

ベローがコードです。それを実行してブラウザで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 PrototypeExampleSCOPE_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> 
+0

プロトタイプのスコープがあり、正確に動作します。つまり、要求ごとに新しいBeanを作成します。プロキシを削除するか、別のスコープを使用してください。 –

答えて

1

あなたの豆:

これは、あなただけの2つのファイルを必要とし、全体のコードです。 official documentationによると

新しいBeanインスタンスの作成 でBeanのデプロイメント結果の非シングルトン、プロトタイプの範囲、その特定 Beanに対する要求が行われるたびに。つまり、Beanは別のBeanにインジェクトされるか、コンテナ上のgetBean()メソッド呼び出しによって にリクエストされます。 ルールでは、すべてのステートフルBeanのプロトタイプスコープとステートレスBeanのシングルトン スコープを使用します。あなたはシングルトンが必要な場合は

、ちょうど@Scope注釈を削除するか(デフォルト1である)singletonに設定します。使用可能なスコープはすべてhereです。

関連する問題