如何在Spring AuthenticationSuccessHandler实现中注入原型bean

时间:2014-10-21 11:55:44

标签: java spring dependency-injection spring-security

我使用Spring安全AuthenticationSuccessHandler进行登录验证。

@Component
public class LoginAuthenticationHandler  implements AuthenticationSuccessHandler {
….

我在LoginAuthenticationHandler中注入UserData,如下所示

@Autowired
UserData userData;

UserData应该是原型。

当我在LoginAuthenticationHandler中为不同的用户[在用户登录时间]打印userData的哈希码时,哈希码是相同的。它告诉我UserData bean不是原型。

这是spring-security.xml

中的LoginAuthenticationHandler定义
<beans:bean id="authenticationSuccessHandler" class="com.org.login.handler.LoginAuthenticationHandler" scope="prototype">
</beans:bean> 

这是UserData bean类

@Service
@Scope("prototype")
public class UserDataImpl implements UserData {

使UserData成为“真实”原型的选项是什么

2 个答案:

答案 0 :(得分:2)

首先,您已经两次定义了LoginAuthenticationHandler bean(注释和XML),不要这样做。

如果要在单例bean中使用原型bean,则必须使用代理。改变范围注释:

@Scope(value="prototype", proxyMode=ScopedProxyMode.INTERFACES)

答案 1 :(得分:0)

显然,您正在使用LoginAuthenticationHandler注释@Component,使其成为自动发现的Spring bean,并在XML配置中声明它。由注释创建的bean将是单例,从XML创建的bean将是原型。您还没有展示过如何实际使用该bean,但可以理解系统的其余部分正在使用单例版本。当然,在创建单例时,该版本的单个UserData实例被分配了一次。

要继续前进,请先使用LoginAuthenticationHandler的声明清理情况。