DI 依赖注入
1. 构造器注入
2. Set方式注入(重点)
- 依赖注入:Set注入
- 依赖:bean 对象的创建依赖于容器
- 注入:bean 对象的所有属性由容器注入
搭建环境
-
复杂类型
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
-
测试对象
import java.util.*; public class Student { private String name; private Address address; private String[] books; private List<String> hobbys; private Map<String,String> card; private Set<String> games; private String wife; private Properties info; }
-
applicationContext.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="com.yl.pojo.Student"> <!--基本类型注入 value--> <property name="name" value="杨杨"/> </bean> </beans>
-
测试
import com.yl.pojo.Student; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = (Student)context.getBean("student"); System.out.println(student.getAddress()); }
注入信息
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.yl.pojo.Address">
<property name="address" value="北京"/>
</bean>
<bean id="student" class="com.yl.pojo.Student">
<!--基本类型注入 value-->
<property name="name" value="杨杨"/>
<!--bean 注入 ref-->
<property name="address" ref="address"/>
<!--数组-->
<property name="books">
<array>
<value>数学分析</value>
<value>高等代数</value>
<value>离散数学</value>
<value>程序设计</value>
</array>
</property>
<!--List-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>看书</value>
<value>打豆豆</value>
</list>
</property>
<!--Map-->
<property name="card">
<map>
<entry key="学生证" value="190101211"/>
<entry key="身份证" value="65274824724724270"/>
</map>
</property>
<!--Set-->
<property name="games">
<set>
<value>英雄联盟</value>
<value>飞车</value>
<value>糖豆人</value>
</set>
</property>
<!--null-->
<property name="wife">
<null/>
</property>
<!-- <property name="wife" value=""/>-->
<!--properties-->
<property name="info">
<props>
<prop key="年龄">22</prop>
<prop key="城市">南京</prop>
</props>
</property>
</bean>
</beans>
3. 拓展方式注入
p命名空间与c命名空间
-
导入 xml 约束
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
userbeans.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--p命名空间注入 可直接注入属性的值 xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="user" class="com.yl.pojo.User" p:name="杨洋" p:age="31" p:admin="true"/>
<!--c命名空间注入 xmlns:c="http://www.springframework.org/schema/c"-->
<bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true"/>
</beans>
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
User user = context.getBean("user2", User.class);
System.out.println(user);
}
4. bean的作用域
Scope | Description |
---|---|
singleton | (默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。 |
prototype | 将单个 bean 定义限定为任意数量的对象实例。 |
request | 将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在 Web 感知 Spring 的上下文中有效ApplicationContext 。 |
session | 将单个 bean 定义限定为 HTTP 的生命周期Session 。仅在 Web 感知 Spring 的上下文中有效ApplicationContext 。 |
application | 将单个 bean 定义限定为ServletContext . 仅在 Web 感知 Spring 的上下文中有效ApplicationContext 。 |
websocket | 将单个 bean 定义限定为WebSocket . 仅在 Web 感知 Spring 的上下文中有效ApplicationContext 。 |
-
单例模式(Spring默认机制)
<bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true" scope="singleton"/>
@Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml"); User user = context.getBean("user2", User.class); User user2 = context.getBean("user2", User.class); System.out.println(user.hashCode()); System.out.println(user2.hashCode()); System.out.println(user==user2); }
-
原型模式(每次从容器获取时,都会产生一个新对象)
<bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true" scope="prototype"/>
@Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml"); User user = context.getBean("user2", User.class); User user2 = context.getBean("user2", User.class); System.out.println(user.hashCode()); System.out.println(user2.hashCode()); System.out.println(user==user2); }
- request、session、application,只在web开发中使用