2016-09-14 84 views
0

Spring中的请求作用域bean意味着容器为每个HTTP请求创建一个bean实例。请求作用域bean的实例化

让说我有一个RequestScopedBean豆:

@Component 
public class RequestScopedBean { 
    @PostConstruct 
    void init() { 
    System.out.println("Init method called for each incoming HTTP Request"); 
    } 
} 

public void doSomething() {} 

配置:

@Configuration 
public class MyBeansConfig { 
    @Bean 
    @Scope(value="request", proxyMode=TARGET_CLASS) 
    public RequestScopedBean requestScopedBean() { 
    return new requestScopedBean(); 
    }   
} 

我用我的RequestScopedBean一个辛格尔顿豆里面 - 和我期待的是,为每个传入的HTTP请求调用init()方法。但事实并非如此。 init()方法只被调用一次,这意味着容器只创建一个我的实例RequestScopedBean !!! 有人可以向我解释:如果我期望的行为是正确的/或配置有什么问题。

回答

1

您已完成RequestScopedBean的冗余配置。 在弹簧托管bean(如@Component)的情况下,您不需要在具有@Bean的Configuration类中定义相同的值。您可以将类注释为@Component,Spring会为您扫描并在需要时进行实例化。它的范围可以在课堂上提供。就像这样:

@Component 
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class RequestScopedBean { 
@PostConstruct 
void init() { 
    System.out.println("Init method called for each incoming HTTP Request"); 

}

否则,您可以定义一个@Bean方法,其中实例化任何类(不一定是春季管理的bean),设置所需的参数和返回的实例。这种情况下的范围可以在方法级别提供。就像这样:

@Configuration 
public class MyBeansConfig { 
    @Bean 
    @Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS) 
    public RequestScopedBean requestScopedBean() { 
    //if needed set the required parameters 
    return new RequestScopedBean(); 
    }   
} 

在你的情况,你做了两个,这不是必须的,也许这就是预期为什么它不表现。要解决您的问题,请执行以下任一操作:

  1. 删除RequestScopedBean类中的@Component注释。

OR

  • 添加如RequestScopedBean上面所示@Scope注解,并从配置类移除RequestScopeBean的@Bean方法。