01 XML配置
1 | <bean id="user" class="org.geekbang.thinking.in.spring.ioc.overview.domain.User"> |
02 Java注解配置
1 | // 3. 通过 @Import 来进行导入 |
注意,此处的Config类,Import了一次,又Component了一次,但是容器中是只有一个Bean的。
另外即使给了user一个别名,也是只有一个User类的Bean的。
03 Java API配置
命名方式 org.springframework.beans.factory.support.BeanDefinitionRegistry#registerBeanDefinition
非命名方式org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerWithGeneratedName
1 | public class AnnotationBeanDefinitionDemo { |
输出结果:
User 类型的所有 Beans{mercyblitz-user=User{id=1, name=’小马哥’, city=null, workCities=null, lifeCities=null, configFileLocation=null, company=null, context=null, contextAsText=’null’, beanName=’mercyblitz-user’}, org.geekbang.thinking.in.spring.ioc.overview.domain.User#0=User{id=1, name=’小马哥’, city=null, workCities=null, lifeCities=null, configFileLocation=null, company=null, context=null, contextAsText=’null’, beanName=’org.geekbang.thinking.in.spring.ioc.overview.domain.User#0’}}
非命名的方式会在名称后面加#和一个递增的数字
仔细看一下,会发现非命名调用的方法里面就多了一个生成BeanName的方法,
1 | public static String registerWithGeneratedName(AbstractBeanDefinition definition, BeanDefinitionRegistry registry) |
generateBeanName方法里判断是否是isInnerBean来区分命名方式,关于isInnerBean的具体含义,注释里说的不是很清楚
(whether the given bean definition will be registered as inner bean or as top-level bean (allowing for special name generation
for inner beans versus top-level beans)
1 | if (isInnerBean) { |
通过方法注释(Turn the given bean name into a unique bean name for the given bean factory,appending a unique counter as suffix if necessary.)可以看到一个Bean只是在当前bean factory中才是唯一的,而且数字后缀也不是必须的。
然后还是调用命名方式同样的方法,方法如下:
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition