繁体   English   中英

如何在 Spring 中定义要自动装配的 bean

[英]How to define which bean to autowire in Spring

我有 2 个相同类型的豆子:

@Component("beanA")
public class BeanA implements BaseBean {}

@Component("beanB")
public class BeanB implements BaseBean {}

这种类型在我的服务中使用:

@Service
public class MyService {

    @Autowired
    private BaseBean baseBean;
}

现在我想在另一个服务中使用两个可能的 MyService bean

@Service
public class AnotherService {

    @Autowired
    private MyService myServiceWithBeanA;

    @Autowired
    private MyService myServiceWithBeanB;
}

我怎样才能做到这一点? 也许我应该采取另一种方法?

我知道如何在基于 XML 的 bean 配置中做到这一点。 如何使用注释来做到这一点?

<bean id="AnotherService" class="AnotherService">
    <property name="myServiceWithBeanA" ref="myServiceWithBeanA" />
    <property name="myServiceWithBeanB" ref="myServiceWithBeanB" />
</bean>

<bean id="myServiceWithBeanA" class="MyService">
    <property name="baseBean" ref="beanA" />
</bean>

<bean id="myServiceWithBeanB" class="MyService">
    <property name="baseBean" ref="beanB" />
</bean>

<bean id="beanA" class="BeanA" />
<bean id="beanB" class="BeanB" />

问题是MyService@Service注释。 这意味着它是 singleton - 只会创建一个实例。

为了创建多个实例,您需要通过配置暴露两个@Bean

@Configuration
public class MyServiceConfig {
    @Bean
    public MyService serviceA(@Qualifier("beanA") beanA) {
        return new MyService(beanA);
    }

    @Bean
    public MyService serviceB(@Qualifier("beanB") beanB) {
        return new MyService(beanB);
    }
}

MyService将成为

public class MyService {
    private BaseBean baseBean;

    public MyService(BaseBean baseBean) {
        this.baseBean = baseBean;
    }
}

然后,您可以使用限定符将所有这些传递给其他服务

@Service
public class AnotherService {

    @Autowired
    @Qualifier("serviceA")
    private MyService myServiceWithBeanA;

    @Autowired
    @Qualifier("serviceB")
    private MyService myServiceWithBeanB;
}

使用@Qualifier注释,您可以指定要自动装配的 bean。

@Service
public class AnotherService {

    @Autowired
    @Qualifier("beanA")
    private MyService myServiceWithBeanA;

    @Autowired
    @Qualifier("beanB")
    private MyService myServiceWithBeanB;
}

希望这可以帮助。

在您的xml bean 定义中添加这些标签<qualifier value="name"/>

<bean id="myServiceWithBeanA" class="MyService">
    <qualifier value="A"/>
    <property name="baseBean" ref="beanA" />
</bean>

<bean id="myServiceWithBeanB" class="MyService">
    <qualifier value="B"/>
    <property name="baseBean" ref="beanB" />
</bean>

然后你可以通过使用Qualifier注释来获取它们,如下所示:

@Autowired
@Qualifier("A")
private MyService myServiceWithBeanA;

@Autowired
@Qualifier("B")
private MyService myServiceWithBeanB;

你也可以做更多的事情。 查看以下链接上的文档: Qualifier documentaiton

并非所有事情都可以通过注释来完成。 如果您需要创建一个 bean 的多个实例但具有不同的 arguments,您必须回退到@Configuration并像在 XML 配置中那样定义这些 bean。

@Configuration
public class AppConfig {

    @Bean
    public MyService myServiceWithBeanA(BeanA beanA) {
        return new MyService(beanA);
    }

    @Bean
    public MyService myserviceWithBeanB(BeanB beanB) {
        return new MyService(beanB);
    }

}

现在只需告诉AnotherService期望MyService两次匹配 bean 名称,因为 bean 定义方法的名称是它的默认限定符。

@Service
public class AnotherService {

    @Autowired
    private MyService myServiceWithBeanA;

    @Autowired
    private MyService myServiceWithBeanB;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM