自动装配不按类型连接豆

时间:2016-11-02 20:23:57

标签: java spring spring-boot

我有一个接口(X),其中有一个打印出statement的方法,接口有2个X1X2的实现,并且有这个类Y其中有XX1对象按类型X2private X x;进行了自动装配。即,像private X x2;x.statement()一样,当我调用x2.statement()时,它会打印默认的配置文件语句,但是当调用x.statement()时,它仍会打印x2.statement()打印语句而不是of 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"; } }

顺便说一下,我正在使用Spring启动。

@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;
    }
}

-

(x1, y1)

3 个答案:

答案 0 :(得分:2)

首先,是什么让你觉得其中一个注入的豆子将是英语'豆和一个将是'西班牙语'豆。您注入了由活动配置文件定义的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);

    }
}

在原始代码中,从两个bean中删除@Profile,或者更改为spring.profiles.active=english,spanish,它可能会按预期工作。虽然这两种方法都有失败的目的,即根据运行时环境动态注入bean。

答案 1 :(得分:0)

同时,根据设定值,只有一个配置文件处于活动状态,因此您可以打印英语或西班牙语,但不能同时打印您的配置。

您可以查看here了解详情。

答案 2 :(得分:0)

如果您希望能够同时注入相同类型的两个bean,则不应将它们绑定到配置文件:您可以为它们分配不同的名称。

@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(spring api)注入它们(如果我没记错的话)注释

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

@Named("spanish") // @Qualifier("spanish")
@Autowired
private HelloWorldService helloWorldServiceSpanish;