Spring 依赖注入
Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。
Spring 基于构造函数的依赖注入
- 配置
<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">
<!-- 构造方法注入
* <constructor-arg> 用于配置构造方法一个参数argument
name :参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean id值
index :参数的索引号,从0开始 。如果只有索引,匹配到了多个构造方法时,默认使用第一个。
type :确定参数类型
例如:使用名称name
<constructor-arg name="username" value="jack"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
例如2:【类型type 和 索引 index】
<constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
<constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
-->
<bean id="userId1" class="com.cc.study.di.User" lazy-init="true">
<constructor-arg type="java.lang.Integer" value="1"></constructor-arg>
<constructor-arg type="java.lang.String" value="bbb"></constructor-arg>
</bean>
<bean id="userId2" class="com.cc.study.di.User" lazy-init="true">
<constructor-arg name="uid" value="1"></constructor-arg>
<constructor-arg name="username" value="bbb"></constructor-arg>
</bean>
<bean id="userId3" class="com.cc.study.di.User" lazy-init="true">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="2"></constructor-arg>
</bean>
</beans>
- User
package com.cc.study.di;
public class User {
private Integer uid;
private String username;
private Integer age;
public User(Integer uid, String username) {
super();
this.uid = uid;
this.username = username;
System.out.println("uid:" + uid + ", username:" + username);
}
public User(String username, Integer age) {
super();
this.username = username;
this.age = age;
System.out.println("username:" + username + ", age:" + age);
}
}
- 测试
@Test
public void demo07(){
String xmlPath = "di4.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
User user = applicationContext.getBean("userId1",User.class);
}
@Test
public void demo08(){
String xmlPath = "di4.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
User user = applicationContext.getBean("userId2",User.class);
}
@Test
public void demo09(){
String xmlPath = "di4.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
User user = applicationContext.getBean("userId3",User.class);
}
Spring 基于setter方法的依赖注入
- 配置
<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">
<!-- setter方法注入
* 普通数据
<property name="" value="值">
等效
<property name="">
<value>值
* 引用数据
<property name="" ref="另一个bean">
等效
<property name="">
<ref bean="另一个bean"/>
-->
<bean id="personId" class="com.cc.study.di.Person">
<property name="pname" value="kevin"></property>
<property name="age">
<value>1234</value>
</property>
<property name="homeAddr" ref="homeAddrId"></property>
<property name="companyAddr">
<ref bean="companyAddrId"/>
</property>
</bean>
<bean id="homeAddrId" class="com.cc.study.di.Address">
<property name="addr" value="广东"></property>
<property name="tel" value="911"></property>
</bean>
<bean id="companyAddrId" class="com.cc.study.di.Address">
<property name="addr" value="北京"></property>
<property name="tel" value="120"></property>
</bean>
</beans>
- Person
public class Person {
private String pname;
private Integer age;
private Address homeAddr;
private Address companyAddr;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getHomeAddr() {
return homeAddr;
}
public void setHomeAddr(Address homeAddr) {
this.homeAddr = homeAddr;
}
public Address getCompanyAddr() {
return companyAddr;
}
public void setCompanyAddr(Address companyAddr) {
this.companyAddr = companyAddr;
}
}
- Address
public class Address {
private String addr;
private String tel;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "Address{" +
"addr='" + addr + '\'' +
", tel='" + tel + '\'' +
'}';
}
}
- 测试
@Test
public void demo10(){
String xmlPath = "di5.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
Person p = applicationContext.getBean("personId",Person.class);
System.out.println(p.getPname());
System.out.println(p.getAge());
System.out.println(p.getCompanyAddr());
System.out.println(p.getHomeAddr());
}
Spring 注入内部 Beans
- 配置格式
<bean id="outerBean" class="...">
<property name="target">
<bean id="innerBean" class="..."/>
</property>
</bean>
- 配置
<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">
<bean id="personId" class="com.cc.study.di.Person">
<property name="pname" value="kevin"></property>
<property name="age">
<value>1234</value>
</property>
<property name="homeAddr">
<bean id="homeAddrId" class="com.cc.study.di.Address">
<property name="addr" value="广东"></property>
<property name="tel" value="911"></property>
</bean>
</property>
<property name="companyAddr">
<bean id="companyAddrId" class="com.cc.study.di.Address">
<property name="addr" value="北京"></property>
<property name="tel" value="120"></property>
</bean>
</property>
</bean>
</beans>
- 测试
@Test
public void demo11(){
String xmlPath = "di6.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
Person p = applicationContext.getBean("personId",Person.class);
System.out.println(p.getPname());
System.out.println(p.getAge());
System.out.println(p.getCompanyAddr());
System.out.println(p.getHomeAddr());
}