巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 39|回复: 0

Spring 6 依赖注入和元数据配置详解

[复制链接]

5

主题

7

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-12-12 00:09:15 | 显示全部楼层 |阅读模式
这是依赖注入的第三篇内容

接着之前的再次进行演示依赖注入的使用方式。
3.3 依赖注入和元数据配置详情

上一节讲解了,可以将 Bean 属性和构造函数参数定义为其他的 Bean 的协作者 ,包含其中 Bean 对象的引用,可以将其定义为内联值。也就是在 Spring 的 XML 元数据配置中的 这里原语的意思是计算机操作系统中的原语 (Primitives),代表的含义是直接给出的定义。这是在我们使用上面两个属性的时候,对于  元素的值属性将属性或构造函数参数指定为开发人员易读的字符串表示。 Spring的转换服务用于将这些值从字符串转换为属性或参数的实际类型。 下面的代码示例显示了正在设置的各种值:




上面是配置了一个 DBCP 的数据库连接池。 当然,我们也可以配置现在常用 Druid 或者 HikariCP这里对于不同的数据库连接池只是其中 class 有变化。 com.alibaba.druid.pool.DruidDataSource
com.zaxxer.hikari.HikariDataSource当然这些不是本节的重点。只是顺带着这个知识点说一下,这样的话,在进行 SSM 整合的时候,就能明白其中的问题所在。
这里我模拟了一下该类的参数方法。
并加入了对应的 XML 的配置信息。
运行测试查看效果:
为了方便我在 close 中写入了对应的打印代码,就是打印我们传入进去的参数值。
p 的命名空间方式

这里处理使用 XML 的 property 属性外,还可以使用命名空间的方式进行赋值。需要先引入其定义。
使用 p-属性名 完整代码如下所示:
这里红色字体是因为这个 schema 没有找到,想要不报错,就到对应的设置中,加入 schema 的 url 就好了。 不演示了。 说一下明白为什么就行,但是不会影响其使用。
虽然使用这种方式更加简洁,对于子元素配置来说。方式不同结果导向是一致的。
除了上面的两种方式外,还也指定一个 java.util.Properties 配置对象实例。 properties 的使用方式

演示例子如下:
publicclassPropertiesDemo {
privatefinalstaticLoggerlogger=LoggerFactory.getLogger(PropertiesDemo.class);
publicPropertiesproperties;

publicPropertiesgetProperties {
returnproperties;
}

publicvoidsetProperties(Propertiesproperties) {
this.properties=properties;
}

publicvoidlist{
properties.forEach((k,v) -> {
logger.info("k: {}, v: {}", k, v);
});
}
}XML 的配置文件如下:
执行测试代码,代码如下所示:
@Test
publicvoidtest {
StringconfigFile="v12/spring.xml";
ApplicationContextcontext=newClassPathXmlApplicationContext(configFile);
PropertiesDemopropertiesDemo=context.getBean(PropertiesDemo.class);
propertiesDemo.list;
}可以看到已经加载到对应的设置值,拿到了我们需要的数据。
对于上面的这种方式,是 Spring 容器将 <value/> 元素中的文本转换成 java.util.properties 实例,这是很便捷的一种方式,也是在 Spring 中支持使用嵌套元素的几个地方之一。 对于 idref 元素 只是一种防错方法,可以将容器中另一个bean 的 id,这里是设置的对应的字符串,而不是其引用。 把其中的值传递给 或  元素。 以下示例显示了如何使用它:
配置文件如下:
这里为了演示其效果,就传入一个 idRefTest 的字符串。
查看运行的结果,如下所示:
对于其中 idref 而言。

idRefTest这两个值为等同的概念。 相当于上面说的传入的能够接收的就是 一个字符串。 并且对于这种方式而言,配置阶段并不会针对这个值是否存在,不去校验。等到运行的时候,才能知道是否有问题。 这里需要注意的。
在 Spring 6 的定义中。 可以看到该元素就只有一个参数,就是 bean 。xsd 约束文件如下:
不过就这个参数而言,更推荐使用下面的方式。
上一节说了 idref 的简单的使用方式,接下来我们来说说另外一个属性参数,ref 引用的方式。
元素中。并且在这个配置中,可以将 Bean 指定的值设置为对容器管理中的另一个 Bean 的引用。对于引用的 bean 是要设置属性的 bean 的依赖性,并需要在设置属性之前根据需要对其进行初始化。 (如果合作者是单例 bean,则可能已经由容器初始化。)所有引用最终都是对另一个对象的引用。 范围和验证取决于您是否通过 Bean 或父属性指定其他对象的 id 或 name。 标签的 bean 属性指定目标 bean 是最常用的通用形式,允许在同一容器或父容器中创建对任何bean 的引用,而不管它是否在同一XML文件中。 Bean 属性的值可能与目标 Bean 的 id 属性相同,也可以与目标Bean 的名称属性中的值之一相同。 以下示例显示了如何使用 ref 元素:
根据 xsd 定义查看,可以得知对于 ref 属性是一个简写的方式,它等同于子元素中的 配置,并且还可以看到对于子元素中还有一个属性为 parant 。
通过父属性指定目标 Bean 将创建对当前容器的父容器中的 Bean 的引用。父属性的值可以与目标 Bean 的 id 属性或目标 Bean 的 name 属性中值的其中之一相同。目标 Bean 必须位于当前 Bean 的父容器中。当您有一个容器层次结构,并且希望使用与父 Bean 同名的代理将现有 Bean 包装在父容器中时,应该主要使用这个 Bean引用变量。以下列表显示了如何使用父属性:
父类和子类代码,完整如下:
测试并运行结果的代码如下:
需要先加载一个父类容器,并在创建子容器的时候,传入指定的父容器,就可以进行测试。
对于上面说的都是关于  元素的 和  元素配置及说明,但是如果一个类中包含了另外一个类,该如何进行声明并配置呢?这个比较像是类中 setter 的配置方式,只不过不需要另外的地方进行配置了。
配置文件如下所示:







测试代码如下:
这里就可以看到除了使用 ref 的引用进行调用之外, 还可以直接在配置文件中配置 bean 的另外一个信息。

来源:http://www.yidianzixun.com/article/0kqajvpH
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部