복붙노트

[SPRING] AOP가있는 Spring session scope bean의 문제점

SPRING

AOP가있는 Spring session scope bean의 문제점

HomeController 클래스에 currentUser 인스턴스를 주입하려고합니다. 따라서 모든 요청에 ​​대해 HomeController에는 currentUser 객체가 있습니다.

내 구성 :

<bean id="homeController" class="com.xxxxx.actions.HomeController">
    <property name="serviceExecutor" ref="serviceExecutorApi"/>
    <property name="currentUser" ref="currentUser"/>
</bean>

<bean id="userProviderFactoryBean" class="com.xxxxx.UserProvider">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="currentUser" factory-bean="userProviderFactoryBean" scope="session">
    <aop:scoped-proxy/>
</bean>

하지만 다음과 같은 오류가 발생합니다.

Caused by: java.lang.IllegalStateException: Cannot create scoped proxy for bean 'scopedTarget.currentUser': Target type could not be determined at the time of proxy creation.
        at org.springframework.aop.scope.ScopedProxyFactoryBean.setBeanFactory(ScopedProxyFactoryBean.java:94)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1350)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)

문제가 무엇입니까? 더 나은 / 간단한 대안이 있습니까?

건배.

해결법

  1. ==============================

    1.범위가 지정된 프록시를 사용하면 Spring은 컨텍스트가 초기화 될 때 Bean의 유형을 알아야하며,이 경우에는 수행하지 못합니다. 더 많은 정보를 제공해야합니다.

    범위가 지정된 프록시를 사용하면 Spring은 컨텍스트가 초기화 될 때 Bean의 유형을 알아야하며,이 경우에는 수행하지 못합니다. 더 많은 정보를 제공해야합니다.

    factory-method를 지정하지 않고 currentUser 정의에서 factory-bean 만 지정한다는 것을 알았습니다. 저는 사실 두 사람이 일반적으로 함께 사용되기 때문에 그것이 유효한 정의라는 사실에 다소 놀랐습니다. 따라서 사용자 bean을 생성하는 userProviderFactoryBean의 메소드를 지정하는 factory 메소드 속성을 currentUser에 추가하십시오. 이 메소드는 Spring이 currentUser 유형을 추론하는 데 사용할 User 클래스의 리턴 유형을 가져야합니다.

    편집 : 좋아, 아래에 귀하의 의견을 후, 당신은 봄에 공장 콩을 사용하는 방법을 오해했습니다 것 같습니다. FactoryBean 타입의 bean을 가지고 있다면 factory-bean 속성을 사용할 필요가 없다. 그래서 이것 대신 :

    <bean id="userProviderFactoryBean" class="com.xxxxx.UserProvider">
        <property name="userDao" ref="userDao"/>
    </bean>
    
    <bean id="currentUser" factory-bean="userProviderFactoryBean" scope="session">
        <aop:scoped-proxy/>
    </bean>
    

    당신은 단지 이것을 필요로합니다 :

    <bean id="currentUser" class="com.xxxxx.UserProvider" scope="session">
        <aop:scoped-proxy/>
        <property name="userDao" ref="userDao"/>
    </bean>
    

    여기에서 UserProvider는 FactoryBean이고 Spring은이를 처리하는 방법을 알고 있습니다. 최종 결과는 currentUser bean이 UserProvider 인스턴스가 아닌 UserProvider가 생성하는 것입니다.

    factory-bean 애트리뷰트는 팩토리가 FactoryBean 구현이 아니라 단지 POJO 일 때 사용되며, Spring에게 팩토리 사용법을 명시 적으로 알려준다. 그러나 FactoryBean을 사용하기 때문에이 속성이 필요 없습니다.

  2. from https://stackoverflow.com/questions/1951259/problem-in-spring-session-scope-bean-with-aop by cc-by-sa and MIT license