天道酬勤,学无止境

spring中使用@Bean和@Component的名称和别名(names and aliases using @Bean and @Component in spring)

问题

我们如何定义

a) 单名
b) 多个名称(别名)

使用@Bean 和@Component 注释?

在 XML 中,我们这样定义:

对于单名:

<bean name="accountService" autowire="constructor" class="com.wiley.beginningspring.ch2.AccountServiceImpl" autowire-candidate="false">
</bean>

对于别名:

<bean name="accountService,a,b" autowire="constructor" class="com.wiley.beginningspring.ch2.AccountServiceImpl" autowire-candidate="false">
</bean>

但是 @Bean 和 @Component( 或 @Service , @Repository ) 呢?

回答1

这仍然是一个功能请求 https://jira.spring.io/browse/SPR-6736

除了@Bean

@Configuration
public class Config {

  @Bean(name = { "accountService", "acc" })
  public AccountServiceImpl cccountServiceImpl() {
    return new AccountServiceImpl();
  }

}
回答2

bean 名称接受字符串数组,因此这是有效的。 @Bean({"b1", "b2"} .

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 什么是NoSuchBeanDefinitionException,我该如何解决?(What is a NoSuchBeanDefinitionException and how do I fix it?)
    问题 请解释以下有关Spring中的NoSuchBeanDefinitionException异常的信息: 这是什么意思? 在什么情况下会抛出? 我该如何预防呢? 这篇文章旨在对使用Spring的应用程序中NoSuchBeanDefinitionException出现进行全面的问答。 回答1 NoSuchBeanDefinitionException的Javadoc解释 当要求BeanFactory为其找不到其定义的bean实例时引发异常。 这可能指向不存在的bean,不唯一的bean或没有关联的bean定义的手动注册的单例实例。 BeanFactory基本上是代表Spring的Control容器反转的抽象。 它在内部和外部向您的应用程序公开bean。 当无法找到或检索这些bean时,将抛出NoSuchBeanDefinitionException 。 以下是BeanFactory (或相关类)无法找到Bean的简单原因,以及如何确保能找到它。 Bean不存在,尚未注册 在下面的示例中 @Configuration public class Example { public static void main(String[] args) throws Exception { AnnotationConfigApplicationContext ctx = new
  • Spring-学习总结
    Spring-学习总结 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 文章目录 Spring-学习总结1、Spring的设计初衷是什么?2、对控制反转(IOC)的理解有哪些?3、对依赖注入(DI)的理解有哪些4、对面向切面(AOP)的理解有哪些?5、对BeanFactory接口的了解有哪些?6、Spring模块都有哪些?7、Spring各模块都有哪些常见的功能?8、对Spring各模块之间的依赖关系了解?9、基于 Xml 的 IOC 容器的初始化过程?10、基于Annotation的IOC初始化过程?11、什么时候进行依赖注入?12、Spring依赖注入的过程?13、说说Spring IOC容器的延时加载?14、请说一下Spring中FactoryBean和BeanFactory的区别?15、Spring IOC容器提供了哪两种管理Bean依赖关系的方式?16、对autowiring实现原理的分析?17、Spring AOP应用场景有哪些?18、在AOP中,什么是切面、连接点、通知、切入点、目标对象、AOP代理、前置通知、后置通知、返回后通知、环绕通知、异常通知?19、实现Spring AOP的两种方式?20、Spring AOP实现的主要流程?21、Spring AOP代理对象的生成策略?22、Spring MVC
  • 设计模式——Spring注解编程模型
    文章目录 1. 引言2. Spring注解编程模型2.1 元注解(Meta-Annotations)2.2 Spring模式注解(Stereotype Annotations)2.3 Spring组合注解(Composed Annotations)2.3.1 MetadataReader 2.4 Spring注解属性别名和覆盖(Attribute Aliases and Overrides) 1. 引言 模式注解使框架的配置变得简洁明了,从Spring Framework 3.1开始Spring开始全面支持面向注解配置,其中一些核心注解如下 Spring模式注解: Spring 注解场景说明起始版本@Repository数据仓库模式注解2.0@Component通用组件模式注解2.5@Service服务模式注解2.5@ControllerWeb控制器模式注解2.5@Configuration配置类模式注解3.0 装配注解: Spring 注解场景说明起始版本@ImportResource替换XML元素2.5@Import导入bean或者@configuration配置类3.0@ComponentScan扫描指定package下标注Spring模式注解的类3.1 依赖注入注解如下表所示: Spring 注解场景说明起始版本@AutowiredBean依赖注入,支持多种依赖查找方式2
  • Spring bean定义的优先顺序是什么?(What is the precedence of Spring beans definitions?)
    问题 当几个具有相同名称的Spring bean被定义时,哪个将隐藏其他的? 假设我在org.example包中有几个用@Component("bean")注释的@Component("bean") ,以及一个包含以下内容的applicationContext.xml: <context:component-scan base-package="org.example"/> <alias name="aliasedBean" alias="bean"/> <bean id="aliasedBean" class="org.example.AliasedBean"/> <bean id="bean" class="org.example.XmlBean"/> <import resource="otherApplicationContext.xml"/> 当我执行applicationContext.getBean("bean")时,将检索哪个bean? 根据Spring文档: 每个bean具有一个或多个标识符。 这些标识符在承载Bean的容器内必须是唯一的。 但是,我知道(因为我已经测试过),完成此操作后Spring不会抱怨。 一个定义将隐藏其他定义。 但是我找不到规则。 我想这样做是出于测试目的。 我使用基于注释的配置来定义实际(生产)bean。 然后
  • Spring-framework5.0.2 源码阅读笔记 - 基于xml的IOC容器初始化流程
    基于xml的IOC容器初始化流程 注意: 本片博客所展示的代码中,删除了对核心流程以外的代码,为了不影响观看,所以只保留了最核心的代码 spring 初始化时序图 (免费克隆) Spring-framework 5.0.2 中文注释源码下载 闲聊 接着上一篇博客 《Spring-framework5.0.2 源码阅读笔记 - MVC 初始化》中,简单阐述了 Spring 启动触发是再 Servlet#init() 中,且初始化 MVC 和 IOC,IOC 只看到了 refresh() ,还未进入该方法内部,然后此时我要换一种方式来加强对 Spring 的启动理解。如果在不依赖 Servlet 的方式启动 Spring,又该是什么样的方式呢,Spring 的单启动方式又很多,下面通过 ClassPathXmlApplicationContext 来启动 public static void main(String[] srgs){ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(LOCALTIONS); ctx.refresh(); } 从以上的代码中,很容易就难看出,在上一篇博客中写的是 ConfigurableWebApplicationContext#refresh()
  • spring默认范围是单例还是不是单例?(Is spring default scope singleton or not?)
    问题 您能否解释一下为什么Spring会为下面所示的bean配置创建两个对象,因为默认情况下spring的默认作用域是singleton? Spring配置在这里: <bean id="customer" class="jp.ne.goo.beans.Customer"> <property name="custno" value="100"></property> <property name="custName" value="rajasekhar"> </property> </bean> <bean id="customer2" class="jp.ne.goo.beans.Customer"> <property name="custno" value="200"></property> <property name="custName" value="siva"></property> </bean> 回答1 Spring的默认范围是单例。 仅仅是您对成为单身人士的含义的想法与Spring定义单身人士的方式不匹配。 如果告诉Spring制作两个具有不同ID和相同类的独立bean,那么您将获得两个独立bean,每个bean具有单例作用域。 所有单例作用域的意思是,当您引用具有相同ID的对象时,您将获得相同的Bean实例。 Spring文档定义单例范围的方式如下:
  • 就是要让你彻底学会 @Bean 注解
    推荐阅读(点击即可跳转阅读) SpringBoot内容聚合 面试题内容聚合 设计模式内容聚合 排序算法内容聚合 多线程内容聚合 @Bean 注解全解析随着SpringBoot的流行,基于注解式开发的热潮逐渐覆盖了基于XML纯配置的开发,而作为Spring中最核心的bean当然也能够使用注解的方式进行表示。所以本篇就来详细的讨论一下作为Spring中的Bean到底都有哪些用法。 @Bean 基础声明Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。 SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。 快速搭建一个maven项目并配置好所需要的Spring 依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.13.RELEASE</version> </dependency> <dependency> <groupId
  • 注释指定的 bean 名称与现有的、不兼容的 bean def 冲突(Annotation-specified bean name conflicts with existing, non-compatible bean def)
    问题 我有一些 Spring bean 定义的问题。 我有几个由 main() 方法加载的上下文 xml 文件,它们几乎都包含一个标签。 当我的 main 方法启动时,我从 Spring 收到此错误: Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl] 两个 DAO 类都以这种方式注释: @Repository("converterDAO") public class StaticConverterDAOImpl implements ConverterDAO { ... } 内存中的 dao 也有 @Repository("converterDAO") 注释。 dao 在其他类中被引用,如下所示: ... private
  • Spring源码系列(一):BeanFactory
    Spring中的BeanFactory和ApplicationContext Spring通过配置文件或者注解描述Bean和Bean之间的依赖关系,利用Java的反射功能实例化Bean,并建立Bean之间的依赖关系。 本文主要讲解BeanFactory和ApplicationContext,其中: BeanFactory是Spring框架最核心的接口,它提供了IOC的基本配置,ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能,它支持了国际化的信息,框架的事件体系,以及资源的解析等功能。 借用参考中博客的一句话: BeanFactory是Spring框架的基础设施,面向Spring本身ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用Application而非底层的BeanFactory. BeanFactory 首先我们通过BeanFactory的类注释看看BeanFactoy主要的作用: BeanFactory是访问Spring中bean容器的根接口,这是bean容器的基本客户端视图。 这一接口被那些包含许多bean definitions的对象所实现,每个bean definition都有一个String类型的名字统一标识。根据bean定义,工厂将返回包含对象的独立实例
  • Spring源码学习第七天==>解析配置注解类与BPP
    关键词: Spring解析配置类注解Bean Spring注册Bean后置增强器(BPP) Spring消息资源和监听器的初始化 一:Spring解析配置类注解Bean==>ConfigurationClassPostProcessor 前言:Spring注册Bean可以是XML形式的也可以是注解修饰的。该小节介绍的是ConfigurationClassPostProcessor类是如何将被注解修饰的配置类注册进Bean 1.ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor(BDRPP),也就表明该类继承继承了来自父类postProcessBeanDefinitionRegistry()方法。根据之前的介绍,这个方法是对BeanDefinition进行一些具体操作的。这个方法也会在Refresh()方法执行过程中被调用,这里不再赘言。 2.我们通过Debug的方式进入到了该方法,看到了之前的几个步骤并不是是否关键,但是最后一个方法进行了跳转 @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { // 根据对应的registry对象生成hashcode值
  • 如何在 Spring Boot 中进行多 URL 映射(别名)(How to do Multiple URL Mapping (aliases) in Spring Boot)
    问题 具体来说 我想在 spring boot 中做多个 URL 映射(换句话说,别名) 详细 在我的 Spring Boot 应用程序中, Customer Controller类主要映射到/customer URL,如下所示,我想创建易于更改的别名 @Controller @RequestMapping(value = "/customer") public class CustomerController{ 在我在 XML 中进行映射的普通 Spring 应用程序中,我可以进行如下 URL 映射。 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/customer.htm">customerController</prop> <prop key="/tester.htm">customerController</prop> </props> </property> </bean> <bean id="customerController" class="com. ... .controller.CustomerController" /> Spring Boot
  • Spring - 别名与名称的使用(Spring - usage of alias vs names)
    问题 我对别名的使用感到困惑。 我确实了解别名是什么以及它是如何使用的,但我看不出它与在 bean 定义中使用名称有何不同。 <bean id="xyx" name="abc,def" .. /> <alias name="xyx" alias="pqr"/> 当我可以使用 abc 或 def 时,为什么要使用别名? 回答1 在我看来,bean 别名在无法操作 bean 名称的大型系统中很有用。 您可以选择为您的系统部分创建自己的名称(别名)... 来自 Spring 文档 (3.0.x) http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/ ...有时需要给单个 bean 多个名称,也称为 bean 别名... 因此创建多个名称或/和别名是一回事。 回答2 一个用例可能是当您想要自定义一些已经在模块化应用程序中某处定义的 bean(例如,每个模块都是一个 spring 项目)时,bean 可能由第三方框架/API 甚至您的团队定义。 在这种情况下,您希望仅在您的 spring 项目中调用自定义版本而不更改其他模块(项目),为此只需在您的 spring 配置中添加别名,这确实是一个强大的功能: <alias alias="globalBeanService"
  • 第一章 Spring5源码分析之标签解析笔记
    一、Spring程序入口 Spring 重新定义了 java 1、Spring 的历史 2002年10月,Rod Johnson发布《Expert One-on-One J2EE设计和开发》一书。 2004年3月,Spring1.0发布: 2003年6月,Spring Framework第一次以Apache 2.0许可证下发布0.9版本,2004年3月,Spring1.0正式发布;对于Spring1.0,其源码只有一个包,在该包中包含了aop、beans、context、core、jdbc、orm等。对于此时的版本,Spring1.0仅支持XML配置的方式。 2006年10月,Spring2.0发布: 对于2.0,Spring主要增加了对注解的支持,实现了基于注解的配置。 在2007年11月,发布Spring2.5,该版本具备的特性有: 添加可扩展的XML配置功能,用于简化XML配置。 支持Java5。 添加额外的IOC容器扩展点,支持动态语言(如groovy、aop增强功能和新的bean范围)。 2009年12月,Spring3.0发布,Spring3.0 主要具有的特性有: 模块重组系统 支持Spring表达式语言(Spring Expression) 基于Java的Bean配置(JavaConfig) 支持嵌入式数据库:HSQL、H2等 支持REST 支持Java6
  • 如何使用Spring配置异步和同步事件发布者(How to configure Async and Sync Event publishers using spring)
    问题 我正在尝试使用spring事件实现事件框架。我知道spring事件框架的默认行为是sync。 但是在春季上下文初始化期间,如果它找到ID为applicationEventMulticaster的bean,则其行为为Async。 现在,我想在我的应用程序中同时包含同步事件发布者和异步事件发布者,因为某些事件需要同步发布。 我尝试使用SysncTaskExecutor配置同步事件多播程序,但找不到将其注入到AsyncEventPublisher的applicationEventPublisher属性中的方法。 我的spring配置文件如下 <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" destroy-method="shutdown"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="10" /> <property name="WaitForTasksToCompleteOnShutdown" value="true" /> </bean> <bean id="syncTaskExecutor" class="org
  • Spring源码解析系列五:Spring扫描组件之ConfigurationClassPostProcessor
    1.准备测试类 public class Test01 { public static void main(String[] args) { //这个构造方法会把Spring所有的环境都准备好 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class); } } 配置类 @ComponentScan("com.v1") @Component @Configuration public class SpringConfiguration { } PersonService类 @Component public class PersonService { } 2.点击AnnotationConfigApplicationContext public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { //这个类有父类,所以会先初始化父类的构造方法,接着初始化自己的构造方法 //调用无参构造方法进行初始化一个读取器和扫描仪 this(); //把配置类加载进 DefaultListableBeanFactory 的map集合中 //配置类可以一次性传多个
  • 如何在Spring XML上下文中实现条件资源导入?(How to achieve conditional resource import in a Spring XML context?)
    问题 我想实现的功能是“动态地”(即基于配置文件中定义的属性)启用/禁用子Spring XML上下文的导入。 我想象像这样: <import condition="some.property.name" resource="some-context.xml"/> 解析属性的位置(为布尔值),如果为true,则导入上下文,否则不导入。 到目前为止,我的一些研究: 编写自定义NamespaceHandler(和相关类),以便我可以在自己的名称空间中注册自己的自定义元素。 例如: <myns:import condition="some.property.name" resource="some-context.xml"/> 这种方法的问题在于,我不想复制Spring的整个资源导入逻辑,而且对我来说,执行此操作需要委派什么也不是很明显。 重写DefaultBeanDefinitionDocumentReader以扩展“ import”元素的解析和解释行为(在importBeanDefinitionResource方法中发生)。 但是,我不确定在哪里可以注册此扩展名。 回答1 现在,使用Spring 4完全可以做到这一点。 在您的主应用程序内容文件中 <bean class="com.example.MyConditionalConfiguration"/>
  • Spring Framework的核心 - 统一资源加载策略
    IOC之Spring统一加载策略 1. 概述 资源是一个抽象的概念,什么是资源?我们已知Spring中有很多xml配置文件,同时还可能自建各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。 资源粗略的可以分为(这里以Spring的分类为例): URL资源 File资源 ClassPath相关资源 服务器相关资源(JBoss AS 5.x上的VFS资源) 通过sun的API可以实现的资源访问,在 Sun 所提供的标准 API 里,资源访问通常由 java.net.URL 和文件 IO 来完成,尤其是当我们需要访问来自网络的资源时,通常会选择 URL 类。 URL 类可以处理一些常规的资源访问问题,但依然不能很好地满足所有底层资源访问的需要,比如,暂时还无法从类加载路径、或相对于 ServletContext 的路径来访问资源,虽然 Java 允许使用特定的 URL 前缀注册新的处理类(例如已有的 http: 前缀的处理类),但是这样做通常比较复杂,而且 URL 接口还缺少一些有用的功能,比如检查所指向的资源是否存在等 //访问ClassPath中的资源 URL resourceURL = getClassLoader().getResource("java/lang/String.class"); InputStream resourceContent
  • Spring源码解析(注解方式)(一)
    先来看我们注解容器类AnnotationConfigApplicationContext AnnotationConfig容器类 指定我们所需要的配置类 我们进来看一下其构造方法 参数列表中传入一个可变参数 参数为多个组件类 由于配置类上贴有注解@Configuration注解 为@Component子注解 所以也可以作为组件类传入含参构造器 我们先来看this()方法 指向当前类无参构造器 当前构造器做了两件事 创建了 AnnotatedBeanDefinitionReader(注解Bean定义读取器) 和 ClassPathBeanDefinitionScanner(classpath Bean定义扫描器)两个对象 先来看第一个AnnotatedBeanDefinitionReader(注解Bean定义读取器)做了什么事情 当前构造器传入一个容器对象 一个环境对象,环境对象主要用于设置不同配置文件 该构造器主要创建了一个用于解析@Conditional注解的计算器并且注册我们的注解配置处理器 // 以下常量都为默认需要注册的后置处理器 //处理@Configuration注解的后置处理器 /** * The bean name of the internally managed Configuration annotation processor. */ public
  • Spring IOC容器 源码分析
    Spring IOC 容器源码分析 1、前言 Spring 最重要的两个概念: IOC(Inversion of Control:控制反转)AOP(Aspect Oriented Programming:面向切面编程) 本篇文章分析的是Spring 的 IOC 容器相关的内容。阅读本文并不能让你成为 Spring 专家,但一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。 本文采用的源码版本是 5.3.2.RELEASE。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人这么做了,至少不是纯 xml 配置,不过从理解源码的角度来看用这种方式来说无疑是最合适的。 阅读建议: 读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容还需要读者使用过 SpringMVC。本文要说的 IOC 包含两个重点内容: 创建 Bean 容器初始化 Bean 可以按这个思路分步消化学习。若有表述错误或不合理的地方,恳请大家指正。 2、引言 先看下最基本的启动 Spring 容器的例子: public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext
  • Spring bean 别名用法(Spring bean alias usage)
    问题 我知道 bean 别名在春天意味着什么。 但我想知道使用别名的用例。 为什么有人要使用别名而不是名称来引用 bean? 提前致谢。 回答1 我见过的一种用法如下:您有两个给定接口 ( SomeBean ) 的实例:一个用于环境 A,一个用于环境 B。因此您定义了两个 bean:一个名为“someBeanForA”,另一个名为“someBeanForB”。 必须注入这个 SomeBean 的 bean 不知道它们必须使用哪一个:这取决于环境。 所以他们使用别名: @Autowired @Qualifier("someBeanAlias") private SomeBean someBean; 部署到环境A时,XML文件中的别名指向someBeanA。 部署到环境B时,XML文件中的别名指向someBeanB。 回答2 我认为参考文档很好地解释了它: 在 bean 定义本身中,您可以通过使用 id 属性指定的最多一个名称和 name 属性中任意数量的其他名称的组合,为 bean 提供多个名称。 这些名称可以是同一个 bean 的等效别名,并且在某些情况下很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的 bean 名称来引用公共依赖项。 然而,在实际定义 bean 的地方指定所有别名并不总是足够的。 有时需要为在别处定义的 bean 引入别名。 这在大型系统中很常见