说明:1.Spring Framework版本:7.0.22.开发框架:Spring boot(版本3.5.6)3.开发工具:eclipse4.jdk版本:255.操作系统:debian12详细说明依赖项和配置如前一节所述,您可以将Bean属性和构造器参数定义为对其他受管理Bean(合作者)的引用,或定义为内联定义的值。为此,Spring基于XML的配置元数据在其property/和constructor-arg/元素中支持子元素类型。直接值(基本类型、字符串等)property/ 元素的 value 属性将属性或构造函数参数指定为人类可读的字符串表示形式。Spring的转换服务用于将这些值从String类型转换为属性或参数的实际类型。以下示例展示了设置的各种值:bean destroy-method="close" !-- 这会导致调用 setDriverClassName(String) 方法 -- property value="com.mysql.jdbc.Driver"/ property value="jdbc:mysql://localhost:3306/mydb"/ property value="root"/ property value="misterkaoli"/ /bean以下示例使用p-namespace来实现更简洁的XML配置:beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd" bean destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/mydb" p:username="root" p:password="misterkaoli"/ /beans上述XML更为简洁。但是,除非您在创建Bean定义时使用的是支持自动属性补全的IDE(如IntelliJ IDEA或Spring Tools),则拼写错误否将在运行时而非设计时被发现。强烈建议您使用此类IDE辅助工具。您还可以按照以下方式配置一个java.util.Properties实例:bean !-- 被定义为 java.util.Properties 类型 -- property value jdbc.driver.className=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb /value /property /beanSpring容器通过JavaBeans PropertyEditor机制,将value/元素内的文本转换为java.util.Properties实例。这是一个很好的捷径,也是Spring团队倾向于使用嵌套value/元素而非value属性样式的少数几个场景之一。Java版的配置详见附录一。idref元素idref元素是一种简单且防错的方法,用于将容器中另一个bean的id(一个字符串值,而非引用)传递给constructor-arg/或property/元素。以下示例展示了如何使用它:bean / bean property idref bean="collaborator" / /property /bean上述 bean 定义片段(在运行时)与以下片段完全等效:bean / bean property value="collaborator" / /bean第一种形式比第二种更可取,因为使用idref标签可以让容器在部署时验证所引用的命名bean确实存在。在第二种变体中,不对传递给客户端Bean的targetName属性的值进行验证。因此,只有在客户端Bean实际实例化时,才会发现拼写错误(这很可能会导致严重后果)。如果客户端Bean是原型Bean,那么这种输入错误以及由此引发的异常可能只有在容器部署很久之后才会被发现。注意:idref/元素带来价值的一个常见场景(至少在Spring 2.0之前的版本中是这样)是在ProxyFactoryBean bean定义中配置AOP拦截器。在指定拦截器名称时使用idref/元素可以防止拼错拦截器ID。对其他 Bean(协作对象)的引用ref元素是constructor-arg/或property/定义元素中的最后一个元素。在此,您将bean的指定属性的值设置为对容器管理的另一个bean(合作者)的引用。被引用的Bean是待设置属性的Bean的依赖项,在设置属性之前,它会根据需要按需初始化。(如果合作者是单例Bean,则容器可能已经对其进行了初始化。)所有引用最终都是对另一个对象的引用。作用域和验证取决于您是通过bean属性还是parent属性来指定另一个对象的ID或名称。通过ref/标签的bean属性指定目标bean是最通用的形式,允许创建对同一容器或父容器中任何bean的引用,无论该bean是否位于同一XML文件中。bean属性的值可能与目标bean的id属性相同,也可能与目标bean的name属性中的某个值相同。以下示例展示了如何使用ref元素:ref bean="someBean"/通过parent属性指定目标bean会创建一个对当前容器父级容器中bean的引用。parent属性的值可能与目标bean的id属性相同,或者与目标bean的name属性中的某个值相同。目标 bean 必须位于当前 bean 的父容器中。当您拥有容器层次结构并且想要用与父容器中的 bean 同名的代理来包装父容器中的现有 bean 时,应主要使用此 bean 引用变体。以下两个清单展示了如何使用parent属性:!--在子(后代)上下文中,bean名称与父bean相同 -- bean property ref parent="accountService"/ !--注意我们如何引用父级bean -- /property !--根据需要在此处插入其他配置和依赖项-- /bean注意:在4.0版本的Bean XSD中,ref元素上的local属性已不再受支持,因为它不再为常规Bean引用提供任何价值。在升级到4.0模式时,请将现有的ref local引用更改为ref bean。Inner Beansproperty/ 或 constructor-arg/ 元素中的 bean/ 元素定义了一个内部 bean,如下例所示:bean !--无需使用对目标bean的引用,只需直接内联定义目标bean即可 -- property bean !-- 这是内部bean -- property value="Fiona Apple"/ property value="25"/ /bean /property /bean内部Bean定义不需要已定义的ID或名称。如果指定了,容器也不会将此类值用作标识符。容器在创建时还会忽略scope标志,因为内部Bean始终是匿名的,并且总是与外部Bean一起创建。无法独立访问内部Bean,也无法将它们注入到除封装Bean之外的其他协作Bean中。作为一种极端情况,有可能从自定义作用域接收销毁回调——例如,对于包含在单例 bean 中的请求作用域内部 bean。内部Bean实例的创建与其包含Bean相关联,但销毁回调使其能够参与请求作用域的生命周期。这种情况并不常见。内部Bean通常只是共享其包含Bean的作用域。注:在基于java的配置中没有直接的内部Bean定义,可以通过匿名类模仿,Java版的配置详见附录二。集合list/、set/、map/和props/元素分别用于设置Java集合类型List、Set、Map和Properties的属性和参数。以下示例展示了如何使用它们: