1 什么是Spring内部的bean?
当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring的基于XML的 配置元数据中,可以在或元素内使用元素,内部bean通常是匿名的,它们的Scope一般是prototype。
2 什么是bean装配?
bean装配是指在Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。
3 什么是bean的自动装配?
Spring容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
4 不同方式的自动装配
在Spring中,支持五种自动装配模式,可以用来指导Spring容器用自动装配方式来进行依赖注入。
(1)no
- 这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。
<!-- no – 缺省情况下,自动配置是通过“ref”属性手动设定 -->
<bean id="person" class="org.spring.autowring.Person">
<property name="ability" ref="ability"></property>
</bean>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
(2)byName
- 根据Bean的名字进行自动装配。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
<!-- Auto-Wiring "byName" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byName"/>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
(3)byType
- 根据Bean的类型进行自动装配。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
<!-- Auto-Wiring "byType" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byType"/>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
(4)constructor
- 类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
<!-- constructor – 在构造函数参数的byType方式。 -->
<!-- 构造方法的参数 -->
<bean id="person" class="org.spring.autowring.Person">
<constructor-arg>
<ref bean="ability"></ref>
</constructor-arg>
</bean>
<bean id="ability" class="org.spring.autowring.Ability">
<property name="skill" value="Java Programming"></property>
</bean>
(5)autodetect
- 该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。
<bean id="HelloWorld" class="com.example.demo.test.HelloWorld"
autowire="autodetect">
<property name="msg">
<value>HelloWorld</value>
</property>
</bean>
<bean id="date" class="java.util.Date"></bean>
5 自动装配有哪些局限性?
重写
- 你仍需用 < constructor-arg > 和 < property > 配置来定义依赖,意味着总要重写自动装配。
基本数据类型
- 你不能自动装配简单的属性,如基本数据类型,String字符串和类。
模糊特性
- 自动装配不如显式装配精确,如果有可能,建议使用显式装配。