2016-11-02 3 views
0

У меня есть интерфейс (X) с методом, который печатает statement и интерфейс имеют 2 реализаций него X1 и X2 и есть этот класс Y, который имеет 2 объектов X autowired по типу для X1 и X2 с интерфейсом. например, private X x; и private X x2;, и когда я вызываю x.statement(), он печатает заявление профиля по умолчанию, но когда x2.statement() называется, он все еще печатает инструкцию печати x.statement() вместо x2.statement().

BTW Я использую весенний ботинок.Autowired не проводки фасоли по типу

public interface HelloWorldService { 
    public String getGreeting(); 
} 

@Component 
@Profile({ "default", "english" }) 
public class HelloWorldServiceEnglishImpl implements HelloWorldService { 
    @Override 
    public String getGreeting() { 
     return "Hello World"; 
    } 
} 

@Component 
@Profile("spanish") 
public class HelloWorldServiceSpanishImpl implements HelloWorldService { 
    @Override 
    public String getGreeting() { 
     return "Hola Mundo"; 
    } 
} 

-

@Controller 
public class GreetingController { 

    @Autowired 
    private HelloWorldService helloWorldService; 

    @Autowired 
    private HelloWorldService helloWorldServiceSpanish; 

    public void setHelloWorldServiceSpanish(HelloWorldServiceSpanishImpl helloWorldServiceSpanish) { 
     this.helloWorldServiceSpanish = helloWorldServiceSpanish; 
    } 

    public void setHelloWorldService(HelloWorldService helloWorldService) { 
     this.helloWorldService = helloWorldService; 
    } 

    public String sayHello() { 
     String greeting = helloWorldService.getGreeting(); 
     System.out.println(helloWorldServiceSpanish.getGreeting()); 
     System.out.println(greeting); 
     return greeting; 
    } 
} 
+1

Вы можете поместить свой код для X, X1 , и X2 здесь? – Todd

+0

@Todd Я добавил код –

+1

Где вы настраивали профиль? – developer

ответ

0

В то время, только один профиль будет ACTIVE в зависимости от заданного значения, так что вы либо можете иметь возможность печатать на английском или испанском, но не то и другое, как в вашей конфигурации ,

Дополнительную информацию вы можете найти на странице here.

+0

Это абсолютно неправда. Одновременно может быть несколько профилей. Даже в документах, которые вы связывали 'dev' и' hsqldb', оба являются активными. –

2

Во-первых, что заставляет вас думать, что один из компонентов Injected beans станет «английским» bean-компонентом, а один станет «испанским». Вы вводите два экземпляра компонента, определенные активным профилем: «Английский» компонент. Для этого профиля нет Bean HelloWorldServiceKannadaImpl. Таким образом, оба экземпляра - это экземпляры HelloWorldServiceEnglishImpl.

//this code is not called. The instance variable is auto-wired by field 
    //and the auto-wired bean is the only one available: the English one. 
    public void setHelloWorldServiceSpanish(HelloWorldServiceSpanishImpl helloWorldServiceSpanish) { 
     this.helloWorldServiceSpanish = helloWorldServiceSpanish; 
    } 

Как должно быть:

@Controller 
public class GreetingController { 

    //will be English or Spanish depending on Active profile. 
    @Autowired 
    private HelloWorldService helloWorldService; 

    public void sayHello() { 
     String greeting = helloWorldService.getGreeting(); 
     System.out.println(greeting); 

    } 
} 

В исходном коде либо удалить @Profile из двух бобов, или изменения в spring.profiles.active=english,spanish и он может работать, как вы ожидаете. Несмотря на то, что оба вида поражений имеют общую цель, которая должна иметь динамически вставляемый компонент, основанный на среде выполнения.

0

Если вы хотите иметь возможность вставлять два компонента одного и того же типа одновременно, вы не должны связывать их с профилями: вы можете назначить им разные имена.

@Component("english") 
public class HelloWorldServiceEnglishImpl implements HelloWorldService { 
    @Override 
    public String getGreeting() { 
     return "Hello World"; 
    } 
} 

@Component("spanish") 
public class HelloWorldServiceSpanishImpl implements HelloWorldService { 
    @Override 
    public String getGreeting() { 
     return "Hola Mundo"; 
    } 
} 

, то вы можете вводить их с @Named (Java API) или @Qualifier (весна апи) (если я помню правильно) аннотацию

@Named("english") // @Qualifier("english") 
@Autowired 
private HelloWorldService helloWorldService; 

@Named("spanish") // @Qualifier("spanish") 
@Autowired 
private HelloWorldService helloWorldServiceSpanish; 
Смежные вопросы