spring boot中通过注解@Bean声明的bean的名称是什么?

问题

spring boot中我们常常会在configuration类中通过@Bean注解去声明Bean。
但是很多人不清楚默认情况下,通过@Bean注解声明的Bean的名称是什么?

请问,如下代码声明bean的名称是什么?

@Configuration
public class LogAutoConfigure {
    @Bean
    public Queue queueTest() {
        return new Queue("log-queue", true);
    }
}

为什么我们要关注声明bean的名称,这是由于spring容器中的bean默认是单例模式的,如果声明的bean的名称一样,就无法识别出具体调用哪一个。在调用的时候就会出错。

The bean 'queueTest', defined in class path resource [com/hcf/base/log/config/LogDataSourceConfig.class], could not be registered. A bean with that name has already been defined in class path resource 

试验

@Configuration
public class LogConfigure {
    @Bean(name="queue-test")
    public Queue queue() {
        return new Queue("log-queue1", true);
    }

    @Bean
    public Queue queueTest() {
        return new Queue("log-queue2", true);
    }
}

使用单元测试去获取spring容器中的baen

@Component
public class ApplicationContextHelper implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    public ApplicationContextHelper() {
    }

    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHelper.applicationContext = applicationContext;
    }

    /**
     * 获得spring上下文
     * @return
     */
    public  ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public  Object getBean(String beanName) {
        return applicationContext != null ? applicationContext.getBean(beanName) : null;
    }
}
@SpringBootTest(classes = LogApplication.class)
class LogApplicationTests {
     @Autowired
    ApplicationContextHelper contextHelper;

    @Test
    void testGetBean(){
       Queue queue1 = (Queue) contextHelper.getBean("queue-test");
       System.out.println(queue1);

        Queue queue2 = (Queue) contextHelper.getBean("queueTest");
        System.out.println(queue2);
    }
}

执行单元测试的结果:

Queue [name=log-queue1, durable=true, autoDelete=false, exclusive=false, arguments={}, actualName=log-queue1]
Queue [name=log-queue2, durable=true, autoDelete=false, exclusive=false, arguments={}, actualName=log-queue2]

结论

通过观察我们不难发现,默认情况下,使用 @Bean声明一个bean,bean的名称由方法名决定。此外,可以通过@Bean注解里面的name属性主动设置bean的名称。

注入指定名称的bean

@Autowired
@Qualifier("queue-test")
private Queue queue;

典型场景

多数据源配置场景:
每个数据源都使用setDataSource()方法配置数据源,所以要使用@Bean(name = “j3sqlDataSource”)中通过name主动说明bean的名字
在这里插入图片描述
在这里插入图片描述
消息队列中,多队列声明
这里通过采用不同的方法名,声明多个队列和交换器,避免bean的名称重复
在这里插入图片描述
在这里插入图片描述

总结

1、spring boot中通过@Bean声明bean,默认情况下,bean的名称由方法名决定。另外,可以通过@Bean注解里面的name属性主动设置bean的名称。
2、通过@Autowired和@Qualifier(“queue-test”)结合使用,可以注入指定名称的bean

更多精彩,关注我吧。
图注:跟着老万学java

### 回答1: Active Directory域服务是一种由微软公司开发的网络服务,它提供了一种集中管理和控制网络资源的方式。它可以在一个域中集中管理用户、计算机、应用程序和其他网络资源,从而提高了网络的安全性和可管理性。Active Directory域服务还提供了一些高级功能,如单点登录、组策略管理和域名系统(DNS)集成等,使得网络管理员可以更加轻松地管理和维护网络。 ### 回答2: Active Directory域服务(Active Directory Domain Services,简称AD DS)是微软公司的一项用于管理和组织网络资源的目录服务。它是一种基于LDAP(轻量级目录访问协议)的目录服务,可以让用户和管理员方便地管理和访问网络中的资源。 AD DS的主要功能包括用户身份认证、访问控制、组管理和资源管理等。通过AD DS,管理员可以集中管理和配置用户和计算机的访问权限,确保系统安全。同时,AD DS还提供了域的集中管理功能,管理员可以通过域控制器管理域中的所有对象,并在域中实施策略。 AD DS还支持单点登录功能,用户只需在登录到域之后,即可自动访问到所属域中的资源,而无需再次输入用户名和密码。这大大提高了用户的工作效率。 此外,AD DS还支持多域架构,可以通过建立信任关系实现跨域资源的访问和管理。管理员可以维护多个域之间的信任关系,实现用户和资源的统一管理。 总而言之,AD DS是一种强大的目录服务,可以实现用户和资源的集中管理和访问控制,提高网络系统的稳定性和安全性。它是企业网络管理的重要组成部分,为企业提供了高效的身份认证和资源管理功能,增强了企业的生产力和安全性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斗者_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值