前言
属性值注入是Spring框架的核心功能之一,它可以帮助我们将依赖的对象或配置信息注入到Bean中,从而完成对象的创建和初始化。
一、属性值注入
1、新建一个项目,结构如下
2、导入 spring 依赖
<!-- spring 的核心依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
</dependencies>
3、新建一个 User 类
@Data
public class User {
private String name;
private Integer age;
private Set<String> tels;
private List<String> address;
private Map<String, String> card;
}
上述代码是一个Java类 User,其中使用了Lombok库的 @Data 注解,它自动生成了一些通用的方法,如toString()、equals()、hashCode()等。这样可以简化代码,避免手动编写这些重复且繁琐的方法。
在 User 类中,定义了以下属性:
- name:表示用户的姓名,类型为 String。
- age:表示用户的年龄,类型为 Integer。
- tels:表示用户的电话号码集合,类型为 Set<String>。
- address:表示用户的地址列表,类型为 List<String>。
- card:表示用户的身份证信息,类型为 Map<String, String>,使用键值对来存储身份证号码和对应的姓名。
通过使用Lombok的 @Data 注解,我们无需再手动编写属性的Getter和Setter方法,它们会被自动生成。此外,还会生成其他常用方法,如equals()、hashCode()、toString()等,以及一个全参的构造函数。使用Lombok可以大大简化代码,并提高开发效率。
需要注意的是,使用Lombok时,我们需要在IDE中安装并启用Lombok插件,以便正确识别和处理注解。
4、 在 resources 下新建一个 spring 的 xml 文件 beans.xml,在配置文件中完成 Bean 的装配
<?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.xsd">
<!-- 装配 User -->
<bean id="user" class="edu.nf.ch06.User">
<!-- 值类型的注入 -->
<property name="name" value="user1"/>
<property name="age" value="18"/>
<!-- 注入 list 集合 -->
<property name="address">
<list>
<value>广州</value>
<value>珠海</value>
</list>
</property>
<!-- 注入 set 集合 -->
<property name="tels">
<set>
<value>12323451233</value>
<value>13289091999</value>
</set>
</property>
<!-- 注入 map 集合 -->
<property name="card">
<map>
<entry key="工行" value="2223232322424241241"/>
<entry key="商行" value="2223232322424241241"/>
</map>
</property>
</bean>
</beans>
这段代码是一个Spring的配置文件,在该配置文件中定义了一个名为 "user" 的Bean,并设置了它的各个属性。
解析该配置文件的结构如下:
- <?xml version="1.0" encoding="UTF-8"?>:XML声明,指定XML的版本和编码方式。
- <beans>:根元素,表示一个Spring配置文件。
- xmlns="http://www.springframework.org/schema/beans" 和 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance":定义了XML命名空间,用于引入Spring的XML schema。
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd":指定XML schema的位置,这里引用的是Spring beans的schema。
- <bean id="user" class="edu.nf.ch06.User">:定义了一个名为 "user" 的Bean,其类为 "edu.nf.ch06.User"。
- <property name="name" value="user1"/>:为 "user" Bean 的属性 "name" 设置值为 "user1"。
- <property name="age" value="18"/>:为 "user" Bean 的属性 "age" 设置值为 18。
- <property name="address">...</property>:为 "user" Bean 的属性 "address" 设置一个包含两个值的列表。
- <property name="tels">...</property>:为 "user" Bean 的属性 "tels" 设置一个包含两个值的集合。
- <property name="card">...</property>:为 "user" Bean 的属性 "card" 设置一个包含两个键值对的映射。
- </bean>:结束 "user" Bean 的定义。
- </beans>:配置文件的结束。
通过这样的配置文件,我们可以将属性值注入到Bean中,完成对象的创建和初始化。在Spring应用程序中,通常会使用一个容器(如ApplicationContext)来读取和解析这样的配置文件,并管理Bean的生命周期和依赖关系。
5、测试
@Slf4j
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean(User.class);
log.info("姓名:" + user.getName());
log.info("年龄:" + user.getAge());
user.getAddress().forEach(log::info);
user.getTels().forEach(log::info);
user.getCard().forEach((k, v) -> log.info(k + ":" + v));
}
}
测试结果
二、属性值注入的好处
属性值注入具有如下好处:
-
解耦合:通过属性值注入,我们可以将需要注入的对象或配置信息与依赖它们的Bean进行解耦。这样,在修改被注入的对象或配置时,不需要修改依赖它们的Bean,只需修改注入配置即可。这种解耦合的设计使得系统更加灵活和可维护。
-
可配置性:属性值注入使得配置更加灵活和可配置化。我们可以通过外部配置文件(如XML、YAML、属性文件等)来定义需要注入的属性值,而不需要修改Java代码。这样,在不同环境下,我们只需修改配置文件中的属性值,而无需重新编译和部署代码。
-
便于测试:属性值注入使得测试变得更加容易。我们可以在测试环境中使用不同的属性值进行注入,以验证系统在不同情况下的行为。同时,我们也可以通过注入Mock对象来模拟复杂的依赖关系,从而更方便地进行单元测试和集成测试。
-
可扩展性:属性值注入使得系统更易于扩展。当需要添加新的依赖对象时,我们只需在配置文件中添加对应的属性注入配置即可,而不需要修改原有的代码。这种松耦合的设计使得系统更加可维护和可扩展。
总之,属性值注入通过解耦合、可配置性、便于测试和可扩展性等方面的优势,使得系统更加灵活、可维护且易于测试。它是构建松耦合、可配置和可扩展的应用程序的重要方式之一。