11.18 Spring装配Bean

11.18 Spring装配Bean

本章内容

  • Bean自动装配

  • 基于注解装配Bean


Bean自动装配

概念:

Bean的装配可以理解为依赖关系注入,Bean的装配方式是Bean的依赖注入方式

具体是指:

Spring容器在不使用 <constructor-arg><property>标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个Bean注入其他BeanProperty中。

Spring支持的装配Bean的方式:

  • 基于XMLBean装配

  • 基于AnnotationBean装配和自动装配等


下面主要介绍基于annotationBean装配和自动装配

  • 使用自动装配需要配置<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 模式。

示例:

  • 使用之前的PersonManMainApp类作为基础

  • 修改Beans.xml配置文件实现自动装配

不使用自动装配(autowire=no):

Bean通过ref元素定义,Beans.xml配置修改如下:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="man" class="com.bean.Man">
       <constructor-arg value="JunkingBoy" />
       <constructor-arg value="12" type="int" />
   </bean>

   <bean id="person" class="com.bean.Person" autowire="no">
       <constructor-arg ref="man" type="com.bean.Man" />
   </bean>
</beans>

按名称自动装配(autowire=byName):

XML文件中Beanid必须与类中的属性名称相同:

<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文件中Beanid与类中的属性名称可以不同,但必须只有一个类型的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控制层的类标注为springbean

  • @Autowired:应用到bean的属性变量,属性的settergetter方法以及构造函数。配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。

  • @Resource:作用与autowired相同。resource默认按照bean实例名称进行装配

    • name属性:解析为bean的实例名称,指定name属性,则按实例名称进行装配

    • type属性:解析为bean的实例类型,指定type属性,则按Bean类型进行装配

如果属性都不指定则先按Bean实例名称装配,无法匹配再按Bean类型进行装配。都无法匹配抛出NoSuchBeanDefinitionException异常

  • @Qualifier:与autowired配合使用。默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier 注解的参数指定。

posted @   俊king  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示