2017-08-24 58 views
1

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> 
+0

您有原型范围,它的行为与它应该完全相同:通过在每个请求上创建新的bean。尝试删除代理或使用不同的范围。 –

回答

1

你的bean PrototypeExampleSCOPE_PROTOTYPE scope属性。

按照official documentation

非单身,在每一个为特定 豆的请求时的时间 创建一个新的bean实例的豆部署结果的原型范围。也就是说,这个bean被注入到另一个bean中,或者你通过容器上的getBean()方法调用来请求它。作为 规则,使用所有有状态bean的原型范围和无状态bean的单例 范围。

如果你需要一个单身,只是删除@Scope注解或将其设置为singleton(这是默认的)。所有可用的示波器都列出了here

相关问题