11.18 Spring装配Bean
本章内容
Bean自动装配
基于注解装配Bean
Bean自动装配
概念:
Bean
的装配可以理解为依赖关系注入,Bean
的装配方式是Bean
的依赖注入方式
具体是指:
Spring
容器在不使用 <constructor-arg>
和<property>
标签的情况下,可以自动装配(autowire)
相互协作的 Bean 之间的关联关系,将一个Bean
注入其他Bean
的Property
中。
Spring
支持的装配Bean
的方式:
基于
XML
的Bean
装配基于
Annotation
的Bean
装配和自动装配等
下面主要介绍基于annotation
的Bean
装配和自动装配
-
使用自动装配需要配置
<bean>
元素的autowire
属性。
autowire
属性的值:
名称 | 说明 |
---|---|
no | 默认值,表示不使用自动装配,Bean 依赖必须通过 ref 元素定义。 |
byName | 根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。 |
byType | 根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。 |
constructor | 类似于 byType,根据构造方法参数的数据类型,进行 byType 模式的自动装配。 |
autodetect(3.0版本不支持) | 如果 Bean 中有默认的构造方法,则用 constructor 模式,否则用 byType 模式。 |
示例:
-
使用之前的
Person
、Man
、MainApp
类作为基础 -
修改
Beans.xml
配置文件实现自动装配
不使用自动装配(autowire=no
):
Bean
通过ref
元素定义,Beans.xml
配置修改如下:
按名称自动装配(autowire=byName
):
XML
文件中Bean
的id
必须与类中的属性名称相同:
<bean id="man" class="com.bean.Man">
<constructor-arg value="bean" />
<constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="byName" />
注意:
-
如果更改
Bean
的名称很可能会导致注入失败
按类型自动装配(autowire="byType"
):
XML
文件中Bean
的id
与类中的属性名称可以不同,但必须只有一个类型的Bean
。
<bean id="man1" class="com.bean.Man">
<constructor-arg value="bean" />
<constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="byType" />
构造函数自动装配(autowire="constructor"
):
类中构造函数的参数必须在配置文件中有相同的类型:
<bean id="man" class="com.bean.Man">
<constructor-arg value="bean" />
<constructor-arg value="12" type="int" />
</bean>
<bean id="person" class="com.bean.Person" autowire="constructor" />
基于注解装配Bean
注意点:
-
Spring
默认不适用注解装配Bean
,需要在配置文件中添加<context:annotation-config />
启用注解
Spring中常用的注解
-
@Component
:描述spring
中的bean
可以用在任何层次。只需要将注解标注在相应的类上即可 -
@Respository
:将DAO
层的类标识为spring
中的bean
。功能与component
相同。 -
@Service
:将Service
层的类标识为spring
中的bean
。 -
@Controller
:将controller
控制层的类标注为spring
的bean
。 -
@Autowired
:应用到bean
的属性变量,属性的setter
和getter
方法以及构造函数。配合对应的注解处理器完成Bean
的自动配置工作。默认按照Bean
的类型进行装配。 -
@Resource
:作用与autowired
相同。resource默认按照bean
实例名称进行装配-
name
属性:解析为bean
的实例名称,指定name
属性,则按实例名称进行装配 -
type
属性:解析为bean
的实例类型,指定type
属性,则按Bean
类型进行装配
-
如果属性都不指定则先按Bean
实例名称装配,无法匹配再按Bean
类型进行装配。都无法匹配抛出NoSuchBeanDefinitionException
异常
-
@Qualifier
:与autowired
配合使用。默认的按Bean
类型装配修改为按Bean
的实例名称装配,Bean
的实例名称由@Qualifier
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App