문제

응용 프로그램 컨텍스트 XML에 정의 된 클래스에 스프링 콩을 자동 캐스트하는 방법이 있습니까? XML 구성 파일과 코드에서 콩에 대한 유형 정보를 두 곳에 두는 것을 피하고 싶습니다.

예를 들어이 구성 파일이 주어지면

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

전화 할 수 있습니까? ApplicationContext.getBean("bean-name") 리턴 유형을 직접 캐스트하지 않는 방식으로 SimpleStringBean. 나는 또한 내가 전화 할 수 있다는 것을 안다 ApplicationContext.getBean("bean-name", SimpleSpringBean.class) 캐스트 자체를 피하기 위해, 그러나 여전히 2 개의 장소에 유형 정보가 있습니다.

봄이 수업 정보를 얻을 수있는 것 같습니다 (ApplicationContext.getType) 또는 콩 자체에서 유형을 가져 와서 프로그래머 개입없이 유형을 자동으로 캐스트 할 수있는 방법은 없습니다.

도움이 되었습니까?

해결책

나는 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");

다른 팁

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

또한, 당신이 요구하는 것은 Java 언어에서 전혀 불가능할 것입니다. 캐스팅은 런타임 점검과 결합 된 컴파일 타임 기능입니다. getBean ()의 반환 유형은 컴파일 시간에 간단히 알아야합니다. 스프링이 객체의 유형을 결정할 수 있더라도 런타임시 자체 방법 서명을 변경할 수는 없습니다.

또 다른 것은 이것이 가능하더라도 기능이 그다지 유용하지 않다는 것입니다. Spring AOP는 동적 프록시를 사용하여 구현되기 때문에 거의 항상 Spring이 구현 클래스가 아닌 Bean Amplements (AOP 프록시 일 수 있음)의 인스턴스를 건네주기를 원합니다.

내가 사용하는 또 다른 접근법은 다음을 사용하여 부트 스트랩 클래스를 자동화하는 것입니다.

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 작동해야합니다.)

주된 이유 getBean Unttyped는 Java 1.4와 Spring (최대 2.5.x)의 호환성입니다. Spring 3.0은이를 떨어 뜨려 입력을 제공합니다 getBean 그런 다음 방법.

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

내 응용 프로그램이 광범위하게 사용하는 객체 공장으로 Spring을 사용하는 경우 어떻게해야합니까? 즉, 알려진 Java 클래스를 이미 상속 받거나 포장하는 수업을 작성하는 대신 Java 코드의 줄을 줄이기 위해 모든 것을 XML 파일로 옮기기로 결정합니다. 이것은 많은 XML 라인을 의미하지만 스프링이나 오토 와이어를 주입하는 골격 자바 클래스를 만들 필요는 없습니다. 따라서 Java 코드 라인을 덜 만듭니다.

이런 이유로 스프링을 처음 접했던 것처럼 이전 게시물에서 언급 한 바와 같이 GetBeans () 주위를 감싸는 정적 Java 메소드를 사용했습니다.

나는 Spring과 함께 일했지만 여전히 내 질문을 용서합니다.

"Spring AOP는 동적 프록시를 사용하여 구현되기 때문에 거의 항상 Spring이 구현 클래스가 아닌 Bean Amplements (AOP 프록시 일 수 있음)의 인스턴스를 건네주기를 원합니다."

따라서 getBean ()을 사용하여 동적 프록시를 얻을 수있는 방법이 없으며, 인터페이스가없고 독립형 드라이버 클래스가 실행될 경우 모범 사례는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top