복붙노트

[SPRING] 스프링 캐스팅 자동 캐스팅

SPRING

스프링 캐스팅 자동 캐스팅

스프링을 애플리케이션 컨텍스트 XML에 정의 된 클래스로 자동 캐스팅하는 방법이 있습니까? 나는 두 곳의 빈에 관한 타입 정보를 넣는 것을 피하고 싶다 .... XML 설정 파일과 캐스팅으로 코드에 넣는다.

예를 들어,이 설정 파일

<bean id="bean-name" class="SimpleSpringBean"  scope="prototype">
    <property name="myValue" value="simple value"></property>
</bean>

반환 유형을 SimpleStringBean으로 직접 캐스팅하지 않도록 ApplicationContext.getBean ( "bean-name")을 호출 할 수 있습니까? 캐스트 자체를 피하기 위해 ApplicationContext.getBean ( "bean-name", SimpleSpringBean.class)을 호출 할 수 있다는 것을 알고 있지만 여전히 2 자리에 유형 정보가 있습니다.

Spring이 클래스 정보 (ApplicationContext.getType)를 얻거나 bean 자체에서 타입을 가져 오는 것으로 보이지만, 프로그래머의 개입없이 타입을 자동으로 형변환 할 방법이 없다.

해결법

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

    1.나는 Sii와 동의한다. 가능한 한 getBean을 호출하지 말아야한다. 콩을 그들에게 의존하는 수업에 연결하십시오.

    나는 Sii와 동의한다. 가능한 한 getBean을 호출하지 말아야한다. 콩을 그들에게 의존하는 수업에 연결하십시오.

    응용 프로그램 컨텍스트를 보유하는 단일 클래스가있는 경우에도 다음과 같은 래퍼 일반 메서드를 제공 할 수 있습니다.

    class MyContextHolder{
        ApplicationContext appContext;
        ......
        @SuppressWarnings("unchecked")
        public static <T> T getBean(String beanName)
        {
            return (T)appContext.getBean(beanName);
        }
    }
    

    그럼 캐스팅하지 않고도 호출 할 수 있습니다.

    MyClass mc = MyContextHolder.getBean("myClassBean");
    
  2. ==============================

    2.그 대답은 가능하다면 ApplicationContext.getBean ()을 사용해서는 안되며, 부트 스트랩 코드에있는 한 곳을 가지고 있어야합니다. 일반적으로 응용 프로그램의 진입 점 외부에서는 getBean ()을 사용할 필요가 없습니다.

    그 대답은 가능하다면 ApplicationContext.getBean ()을 사용해서는 안되며, 부트 스트랩 코드에있는 한 곳을 가지고 있어야합니다. 일반적으로 응용 프로그램의 진입 점 외부에서는 getBean ()을 사용할 필요가 없습니다.

    또한, 당신이 요구하는 것은 Java 언어에서 전혀 불가능할 것입니다. 캐스팅은 런타임 검사와 결합 된 컴파일 타임 기능입니다. getBean ()의 리턴 유형은 컴파일시 알려줘야합니다. Spring이 객체의 유형을 결정할 수 있다고하더라도 런타임에 자체 메소드 서명을 변경할 수는 없습니다.

    또 다른 한가지는 가능한 경우에도이 기능이 그다지 유용하지 않다는 것입니다. Spring AOP는 동적 프록시를 사용하여 구현되기 때문에, Spring이 구현 클래스가 아닌 Bean이 구현하는 인터페이스 (AOP 프록시 일 수 있음)의 인스턴스를 Spring이 제공하기를 원할 것입니다.

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

    3.또 하나의 방법은 다음을 사용하여 부트 스트래핑 클래스를 autowiring하는 것입니다.

    또 하나의 방법은 다음을 사용하여 부트 스트래핑 클래스를 autowiring하는 것입니다.

    public class Main {
        @Autowired FooFacade foo;
        @Autowired BarFacade bar;
    
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("appCtx.xml");
            AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
            Object main = bf.createBean(Main.class, 
                                        AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT,
                                        false);
            ((Main) main).run();
        }
    
        private void run() {
            foo.doBootstrapStuff();
            bar.doMoreBootstrapStuff();
        }
    }
    

    (코드는 메모리에서 수행됩니다. 당신은 스프링 컨텍스트가 배선 주석을 처리하도록 설정되어있는 경우에만 작업 할 수 있습니다.이 경우 foo 및 bar에 대한 setter가 작동해야합니다.)

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

    4.유형이 지정되지 않은 getBean의 주요 이유는 Spring 1.4.x와 Java 1.4의 호환성입니다. Spring 3.0은 그것을 삭제할 것이고 따라서 typed getBean 메소드를 제공 할 것이다.

    유형이 지정되지 않은 getBean의 주요 이유는 Spring 1.4.x와 Java 1.4의 호환성입니다. Spring 3.0은 그것을 삭제할 것이고 따라서 typed getBean 메소드를 제공 할 것이다.

    그럼에도 불구하고 콩을 직접 찾지 말고 가능한 한 사용을 최소화해야합니다.

  5. ==============================

    5.내 응용 프로그램이 광범위하게 사용하는 객체 팩토리로 Spring을 사용하면 어떨까요? 즉, 이미 상속받은 클래스 또는 여러 클래스를 작성하는 대신 알려진 자바 클래스들. 나는 그 모든 것을 xml 파일로 옮겨서 줄이기로 결정했다. 자바 코드 라인. 이것은 xml의 많은 라인을 의미 할 것이지만 나는 만들 필요가 없을 것이다. Spring이나 autowire로 삽입하는 뼈대 Java 클래스. 따라서 라인 만들기 Java 코드가 적습니다.

    내 응용 프로그램이 광범위하게 사용하는 객체 팩토리로 Spring을 사용하면 어떨까요? 즉, 이미 상속받은 클래스 또는 여러 클래스를 작성하는 대신 알려진 자바 클래스들. 나는 그 모든 것을 xml 파일로 옮겨서 줄이기로 결정했다. 자바 코드 라인. 이것은 xml의 많은 라인을 의미 할 것이지만 나는 만들 필요가 없을 것이다. Spring이나 autowire로 삽입하는 뼈대 Java 클래스. 따라서 라인 만들기 Java 코드가 적습니다.

    이런 이유로 나는 봄에 처음 왔기 때문에 나는 이전에 게시물은 getBeans ()를 감싸는 정적 Java 메소드를 사용했습니다.

    나는 봄과 함께 일했지만 여전히 내게 새로운 것이므로 내 질문을 용서해 준다.

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

    6."스프링 AOP는 동적 프록시를 사용하여 구현되기 때문에 Spring이 구현 클래스 인"Spring "이 구현하는 인터페이스의 인스턴스 (AOP 프록시 일 수 있음)

    "스프링 AOP는 동적 프록시를 사용하여 구현되기 때문에 Spring이 구현 클래스 인"Spring "이 구현하는 인터페이스의 인스턴스 (AOP 프록시 일 수 있음)

    따라서 getBean ()을 사용하여 동적 프록시를 얻는 방법은 없으며 실행되는 독립 실행 형 드라이버 클래스와 인터페이스가없는 경우 가장 좋은 방법은 무엇일까요?

  7. from https://stackoverflow.com/questions/812178/auto-cast-spring-beans by cc-by-sa and MIT license