2014-10-21 3 views
1

Я использую Spring security AuthenticationSuccessHandler для моей проверки входа.Как внедрить прототип bean в Spring AuthenticationSuccessHandler реализация

@Component 
public class LoginAuthenticationHandler implements AuthenticationSuccessHandler { 
…. 

Я инъекционный UserData в LoginAuthenticationHandler следующий

@Autowired 
UserData userData; 

UserData должен быть прототипом.

Когда я печатаю хэш-код userData внутри LoginAuthenticationHandler для разных пользователей [во время входа пользователя], хеш-код такой же. Он говорит, что компонент UserData не работает как прототип.

Это определение LoginAuthenticationHandler из весенне-security.xml

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

Это UserData боб класс

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

Что это возможность сделать UserData 'реальная' прототип

+1

Фактически он работает как прототип. Вы получаете новый экземпляр для каждого запроса нового экземпляра. Однако единственный созданный экземпляр - во время запуска. Внедрение прототипа в одноэлемент создает конкретный экземпляр для этого одноэлементного компонента. Если вы введете 'UserData' на 2 разных компонента, вы получите 2 экземпляра. В shor tdon't autwire, если вы хотите, чтобы он вел себя как прототип, просмотрите его или, возможно, используйте компонентный объект с запросом. Который все еще дает тот же хэш-код, но затем для динамического прокси. –

ответ

2

Во-первых, вы дважды определили свой бит LoginAuthenticationHandler (аннотация и XML), не делайте этого.

Если вы хотите использовать прототип bean-компонента внутри одноэлементного компонента, вы должны использовать прокси-сервер. Измените аннотацию сферы охвата:

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

Это хорошо работает с этим изменением, спасибо – Sam

0

Очевидно, вы оба аннотируете свой LoginAuthenticationHandler с помощью @Component, что делает его автоматически обнаруженным весенним фасолью, объявив его в конфигурации XML. Компонент, созданный аннотацией, будет однострочным, а созданный из XML будет прототипом. Вы не показали, как вы на самом деле используете этот компонент, но разумно, что остальная часть системы использует версию singleton. Конечно, эта версия имеет один экземпляр UserData, назначенный один раз, при создании синглтона.

Чтобы двигаться вперед, сначала проясните ситуацию с объявлением LoginAuthenticationHandler.

Смежные вопросы