2015-01-28 2 views
0

삽입 된 클래스를 선택할 수있는 모든 종속성을 포함하는 하나의 JavaConfig 파일을 작성하려고합니다. 내가 @Component와 자동차 클래스를 표시 할 때 Spring JavaConfig의 한정자

@Bean 
@Qualifier("bigWheel") // Has no impact (I have several types of wheel) 
public Car getCar(Wheel wheel){ 
    return new Car(wheel); 
} 

JavaConfig

의 예를 들어 하나 개의 기능은 또한 나는 "아니 기본 생성자"예외를 얻었다. 내가 뭘 잘못하고있어?

+0

아무런 인수없이 생성자가 필요합니다. – Jens

답변

0

스프링이 스프링 컨텍스트를 만들고 콩을 인스턴스화 할 때 기본 생성자, 즉 매개 변수없이 생성자가 필요하다는 것을 알아야합니다. 확실히 간단히 말해서 휠을 공급할 것인지 알 수 없습니다.

또한 가상 예약 된 get/set 메서드를 개체 이름으로 사용하면 불만이 생길 수 있습니다. 한정자 주석에 관계없이 Car 클래스의 getCar 객체를 생성합니다.

getCar를 팩토리 메서드로 만들려고하는 것 같습니다. 내가하는 일이 아닌 경우에 대비하여 큰 설명을 쓰지 않을 것입니다. 그러나 그렇다면 패턴에 약간의 작업이 필요합니다.

편집 : 귀하의 의견을 아래에서 나는 정말 당신이 컨텍스트를 만들 때 콩을 인스턴스화 싶지 않아요. Cars와 Wheels를 사용할 수있는 일반적인 Spring Aware 빈을 원한다고 들리는 것 같습니다. 이 같은.

@Component 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
class Wheel { 
... wheel stuff 
} 

@Component 
@Scope(BeanDefinition.SCOPE_PROTOTYPE) 
class Car { 
    ... car stuff 
} 

@Component 
class Dealership extends ApplicationContextAware { 

@Autowired 
ApplicationContext applicationContext; 

... bunch of dealership code 

Wheel wheel = (Wheel) applicationContext.getBean("Wheel"); 
Car car = (Car) applicationContext.getBean("Car"); 
car.setWheel(wheel); 
... profit 

컨텍스트 초기화 중에 글로벌 싱글 톤 카에 주입되는 휠이라는 글로벌 싱글 톤을 찾는 것처럼 들리지 않습니다.

위의 이유 때문에 위의 SCOPE_PROTOTYPE 주석을 추가했습니다. 일반적으로 Spring은 객체를 인스턴스화하고 호출 할 때 해당 객체를 계속 손상시킵니다. 이것은 대부분의 경우 잘 작동합니다. 그러나 객체가 상태를 저장하기 시작하거나 물론 멀티 스레드 된 경우에는 작동하지 않습니다.

하지만 봄은 알아낼 수 없습니다. 따라서 각 getBean 호출에 대해 고유 한 객체를 인스턴스화하려면 @Scope 주석을 추가해야합니다.

희망이 있습니다.

+0

예, 이제 스프링이 "클래스 클래스의 getCar 객체를 만들 것입니다."라는 이름으로 바뀌 었습니다. 내가 원하는 것은 Car 클래스 밖에서 휠 유형을 선택할 수있게하려는 것입니다. 현재 Car 클래스에서 Wheel 클래스를 선택하는 법을 알고 있습니다 (Qualifier 주석 포함). 그러나 나 만큼은별로 의미가 없다. – flgdev