DI(Dependency Injection)依赖注入, 说简单一点就将类里面的属性在创建类的过程中给属性赋值, 即将对象依赖属性 (简单值, 集合, 对象) 通过配置设值给该对象.
属性注入的方式
构造方法的方式
set 方法的方式
工厂方法注入
主要学习前两种方式
构造方法的方式
当是构造方法时注入 Bean 的属性值(简单值, 集合, 对象)
利用 < constructor-arg > 标签进行属性的注入
name: 被设置属性的名
value: 被设置属性的值
编写用构造方法的 pojo
- package spring_test1.pojo;
- public class UserConstructor {
- private String name;
- private int id;
- public UserConstructor(String name, int id) {
- super();
- this.name = name;
- this.id = id;
- }
- @Override
- public String toString() {
- return "User_constructor [name=" + name + ", id=" + id + "]";
- }
- }
xml 配置编写
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:p="http://www.springframework.org/schema/p"
- 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">
- <!-- Spring 构造方法注入 -->
- <bean name="user_cons" class="spring_test1.pojo.UserConstructor">
- <constructor-arg name="name" value="Roy"/>
- <constructor-arg name="id" value="1001"/>
- </bean>
- </beans>
编写测试类
- package spring_test1.test;
- import static org.junit.Assert.*;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import spring_test1.pojo.UserConstructor;
- public class UserConstructorTest {
- @Test
- public void test() {
- // 创建 Spring 的工厂
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- // 得到 User 对象
- UserConstructor userConstructor = (UserConstructor) applicationContext.getBean("user_cons");
- System.out.println(userConstructor);
- }
- }
运行结果
set 方法的方式
我在 Spring:(一)那一篇中的第一个 Spring 程序便是 set 方法时的属性注入方式
利用 < property > 标签
name: 被设置属性的名
value: 被设置属性的值
标准 xml 格式
编写 pojo
- package spring_test1.pojo;
- /**
- * @author jyroy
- *
- */
- public class User {
- private String name;
- private int id;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- @Override
- public String toString() {
- return "User [name=" + name + ", id=" + id + "]";
- }
- }
编写 xml 配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:p="http://www.springframework.org/schema/p"
- 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">
- <!--Spring 的 set 方法的属性注入 -->
- <bean name="user" class="spring_test1.pojo.User">
- <property name="name" value="李东"/>
- <property name="id" value="1007" />
- </bean>
- </beans>
编写测试类
- package spring_test1.test;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import spring_test1.pojo.User;
- public class UserTest {
- @Test
- public void demo1() {
- // 创建 Spring 的工厂
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- // 得到 User 对象
- User user = (User) applicationContext.getBean("user");
- System.out.println(user);
- }
- }
运行结果
p 命名空间的方式
看上面的 xml 配置, 似乎用 < property/>标签还是比较臃肿.
于是从 2.0 开始, Spring 支持使用名称空间的可扩展配置格式. 这些名称空间都是基于一种 xml Schema 定义. p 命名空间就可以用 bean 元素的属性代替 < property/>元素.
还需要在使用 p 命名空间时先声明使用对应的命名空间, 即在 bean 元素上添加 xmlns:p="http://www.springframework.org/schema/p"
- <!-- p 命名空间的方式 -->
- <bean id="user" class="spring_test1.pojo.User" p:name="Roy" p:id="1004"></bean>
c 命名空间的方式
C 命名空间与 p 命名空间类似, 但是使用 c 命名空间可以用内联的构造参数代替嵌套的 constructor-arg 元素
同样先声明使用对应的命名空间, 即在 bean 元素上添加 xmlns:c="http://www.springframework.org/schema/c"
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:c="http://www.springframework.org/schema/c"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-- 标准 XML 格式 -->
- <bean id="foo" class="x.y.Foo">
- <constructor-arg name="bar" ref="bar"/>
- <constructor-arg name="baz" ref="baz"/>
- <constructor-arg name="email" value="foo@bar.com"/>
- </bean>
- <!-- c 命名空间格式 -->
- <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/>
- <!-- 还可以使用 c 命名空间的参数索引格式 -->
- <bean id="foo" class="x.y.Foo" c:_0-ref="bar" c:_1-ref="baz" c:_2="foo@bar.com"/>
- </beans>
SpEL 表达式方式
Spring 表达式语言 (Spring Expression Language), 打算整理完整的一篇
集合类型属性注入
- <bean id="collectionBean" class="com.roy.spring.demo5.CollectionBean">
- <!-- 数组类型 -->
- <property name="arrs">
- <list>
- <value > 数组一</value>
- <value > 数组二</value>
- </list>
- </property>
- <!-- 注入 list 集合类型 -->
- <property name="list">
- <list>
- <value>list 一</value>
- <value>list 二</value>
- </list>
- </property>
- <!-- 注入 set 集合类型 -->
- <property name="set">
- <set>
- <value>set 一</value>
- <value>set 二</value>
- </set>
- </property>
- <!-- 注入 Map 集合 -->
- <property name="map">
- <map>
- <entry key="aaa" value="111"></entry>
- <entry key="bbb" value="222"></entry>
- <entry key="ccc" value="333"></entry>
- </map>
- </property>
- <!-- 注入 property 集合 -->
- <property name="properties">
- <props>
- <prop key="key1">value1</prop>
- <prop key="key2">value2</prop>
- <prop key="key3">value3</prop>
- </props>
- </property>
- </bean>
来源: https://www.cnblogs.com/jyroy/p/10304533.html