복붙노트

[SPRING] 직렬화 관점에서 Spring 세션 범위 bean (컨트롤러)과 서비스에 대한 참조

SPRING

직렬화 관점에서 Spring 세션 범위 bean (컨트롤러)과 서비스에 대한 참조

지금까지이 문제를 거의 무시했습니다. 최근에 내 모든 스프링 의존성을 일시적으로 선언하고 정적 유틸리티 클래스 인 WebApplicationContextUtils 및 ThreadLocal에서 요청 / ServletContext를 보유하는 readResolve ()로 다시 가져 오는 것을 고려했습니다. 이것은 지루하지만, 객체가 deserialize 될 때, 그것의 의존성은 현재의 애플리케이션 컨텍스트와 함께 "최신"이 될 것이라는 것을 보장한다.

이것 또는 스프링 컨텍스트의 부분을 serialize하기위한 지침에 대한 어떤 허용 된 연습 있습니까?

JSF에서 관리 Bean (~ 컨트롤러)은 상태 기반 (동작 기반 웹 프레임 워크와 달리)입니다. 그래서 내 질문은 spring-mvc보다 JSF가 더 중요하다.

해결법

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

    1.이 프레젠테이션 (약 1시 14 분경)에서 연사는이 문제가 현재 직렬화가 불가능한 Bean의 프록시를 제공하여 봄 3.0에서 해결되었다고 말합니다.이 컨테이너는 현재 응용 프로그램 컨텍스트 (비 직렬화)

    이 프레젠테이션 (약 1시 14 분경)에서 연사는이 문제가 현재 직렬화가 불가능한 Bean의 프록시를 제공하여 봄 3.0에서 해결되었다고 말합니다.이 컨테이너는 현재 응용 프로그램 컨텍스트 (비 직렬화)

  2. ==============================

    2.나는 컨트롤러를 '싱글 톤'으로, 즉 세션이 아닌 애플리케이션마다 한 번씩 범위를 지정할 것으로 기대한다.

    나는 컨트롤러를 '싱글 톤'으로, 즉 세션이 아닌 애플리케이션마다 한 번씩 범위를 지정할 것으로 기대한다.

    세션 범위 지정은 일반적으로 사용자 별 정보 또는 사용자 별 기능을 저장하는 데 더 많이 사용됩니다.

    일반적으로 세션에 'user'객체를 저장하고 인증 등에 사용되는 일부 bean 만 저장합니다. 그게 전부 야.

    aop 프록시를 사용하여 세션 범위에서 일부 사용자 데이터를 구성하기위한 스프링 문서를 살펴보십시오.

    http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

    희망은 도움이됩니다.

  3. ==============================

    3.현상금은 단일 답변을 끌어 오지 않았으므로 제한적인 이해를 문서로 작성합니다.

    현상금은 단일 답변을 끌어 오지 않았으므로 제한적인 이해를 문서로 작성합니다.

    @Configuration
    public class SpringConfig {
    
        @Bean 
        @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 
        MyService myService() {
            return new MyService();
        }
    
        @Bean
        @Scope("request")
        public IndexBean indexBean() {
            return new IndexBean();
        }
    
        @Bean
        @Scope("request")
        public DetailBean detailBean() {
            return new DetailBean();
        }
    }
    
    public class IndexBean implements Serializable {
    
        @Inject MyService myService;
    
        public void doSomething() {
            myService.sayHello();
        }
    }
    
    public class MyService {
        public void sayHello() {
            System.out.println("Hello World!");
        }
    }
    

    Spring은 노출 된 MyService를 IndexBean에 삽입하지 않고 직렬화 가능한 프록시를 삽입합니다. (나는 그것을 테스트했고, 효과가 있었다).

    그러나 스프링 문서는 다음과 같이 썼다.

    적어도 자바 기반의 설정을 사용할 때, Bean과 그 프록시는 아무런 예외도 발생시키지 않고 잘 인스턴스화 될 수있다. 그러나 직렬화 가능성을 달성하기 위해 범위가 지정된 프록시를 사용하는 것이 이러한 프록시의 의도 된 용도가 아닌 것 같습니다. 이와 같이 나는 Spring이 "버그"를 수정하고 Java 기반 구성을 통해 범위가 지정된 프록시를 만들지 못하게 할까 두려워합니다.

    또한 제한이 있습니다. 프록시의 클래스 이름은 웹 응용 프로그램을 다시 시작한 후에 달라집니다 (프록시의 클래스 이름은 생성하는 데 사용 된 조언의 해시 코드를 기반으로하므로 hashCode의 인터셉터의 클래스 객체 .Class.hashCode는 Object.hashCode를 재정의하지 않으며, 다시 시작하면 안정적이지 않습니다. 따라서 직렬화 된 세션은 다른 VM이나 재시작시 사용할 수 없습니다.

  4. ==============================

    4.나는 최근 JSF와 Spring을 결합했다. RichFaces와 JSF 빈을 직렬화하는 @KeepAlive 기능을 사용합니다. 이 방법을 사용하는 데는 두 가지 방법이 있습니다.

    나는 최근 JSF와 Spring을 결합했다. RichFaces와 JSF 빈을 직렬화하는 @KeepAlive 기능을 사용합니다. 이 방법을 사용하는 데는 두 가지 방법이 있습니다.

    1) JSF 백업 빈에 @Component ( "session") 사용

    2) ELContext에서 다음과 같이 필요할 때마다 bean을 얻는다.

    @SuppressWarnings("unchecked")
    public static <T> T  getBean(String beanName) {
        return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, beanName);
    }
    
  5. ==============================

    5.모든 다른 대안을 시도한 후에는 bean 정의에 aop : scoped-proxy를 추가하면된다.

    모든 다른 대안을 시도한 후에는 bean 정의에 aop : scoped-proxy를 추가하면된다.

    <bean id="securityService"
        class="xxx.customer.engagement.service.impl.SecurityContextServiceImpl">
        <aop:scoped-proxy/>
        <property name="identityService" ref="identityService" />
    </bean>
    

    securityService가 뷰 범위 인 내 managedbean에 삽입됩니다. 이것은 잘 작동하는 것 같습니다. 스프링 문서에 따르면, securityService는 싱글 톤이기 때문에 BeanCreationException을 던질 것으로 예상됩니다. 그러나 이것은 일어나는 것 같지 않고 잘 동작합니다. 이것이 버그인지 또는 부작용이 될지 확실하지 않습니다.

  6. ==============================

    6.Dynamic-Proxies의 직렬화는 다른 JVM 사이에서도 잘 작동합니다 (예 : 세션 복제에 사용됩니다.

    Dynamic-Proxies의 직렬화는 다른 JVM 사이에서도 잘 작동합니다 (예 : 세션 복제에 사용됩니다.

    @Configuration public class SpringConfig {
    @Bean 
    @Scope(proxyMode = ScopedProxyMode.INTERFACES) 
    MyService myService() {
        return new MyService();
    }
    .....
    

    컨텍스트를 새로 고치기 전에 ApplicationContext의 ID를 설정하기 만하면된다 (org.springframework.beans.factory.support.DefaultListableBeanFactory.setSerializationId (String) 참조).

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    // all other initialisation part ...
    // before! refresh
    ctx.setId("portal-lasg-appCtx-id");
    // now refresh ..
    ctx.refresh();
    ctx.start();
    

    스프링 버전에서 잘 작동합니다. 버전 : 4.1.2.RELEASE

  7. from https://stackoverflow.com/questions/3180963/spring-session-scoped-beans-controllers-and-references-to-services-in-terms-o by cc-by-sa and MIT license