依赖注入的四种方式:
set 注入
赋值,默认使用的是set() 方法,依赖注入底层是通过反射实现的
<bean id="student" class="cust.zaw.entity.Student">
<property name="stuName" value="lc"></property>
</bean>
构造器注入
使用构造方法注入
<bean id="student" class="cust.zaw.entity.Student">
参数顺序相同的话,可以不写index
<constructor-arg value=""></constructor-arg>
参数顺序不同的话,写index或者name或者type
<constructor-arg value="" index=“0”></constructor-arg>
<constructor-arg value="" index=“1”></constructor-arg>
<constructor-arg value="" name=“”></constructor-arg>
<constructor-arg value="" type=“”></constructor-arg>
</bean>
p命名空间注入
引入命名空间
就是加一句话:xmlns:p=“http://www.springframework.org/schema/p”
也可以这样引入,它会自动引入命名空间
引入命名空间后,就可以这样以这样的方式实现依赖注入
<bean id="student" class="cust.zaw.entity.Student" p:stuAge="" p:stuName="" p:stuNO-ref="">
</bean>
- 注意:
无论是String 还是int / short / long ,在赋值时都是value=“值”,
因此建议 配合type / name 进行区分 - IOC 容器赋值:
简单类型,value=“”
对象类型(当一个类中有其他类 类型,为其赋值时使用),ref=“需要引用的id值”
注入各种集合数据类型
List Set Map properties
- 写一个实体类
package cust.zaw.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class AllCollectionType {
private List<String> list;
private String[] array;
private Set<String> set;
private Map<String,String> map;
private Properties props;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
}
@Override
public String toString() {
String strContent=null;
for(String str : array) {
strContent +=str + ",";
}
return "AllCollectionType [getList()=" + getList() + ", getArray()=" + Arrays.toString(getArray())
+ ", getSet()=" + getSet() + ", getMap()=" + getMap() + ", getProps()=" + getProps() + "]"+strContent;
}
}
- 编写配置文件
<bean id="collectionDemo" class="cust.zaw.entity.AllCollectionType">
<property name="list">
<list>
<value>足球</value>
<value>篮球</value>
<value>乒乓球</value>
</list>
</property>
<property name="array">
<array>
<value>足球1</value>
<value>篮球1</value>
<value>乒乓球1</value>
</array>
</property>
<property name="set">
<set>
<value>足球2</value>
<value>篮球2</value>
<value>乒乓球2</value>
</set>
</property>
<property name="map">
<map>
<entry>
<key>
<value>football3</value>
</key>
<value>足球3</value>
</entry>
<entry>
<key>
<value>basketball3</value>
</key>
<value>篮球3</value>
</entry>
<entry>
<key>
<value>ppq3</value>
</key>
<value>乒乓球3</value>
</entry>
</map>
</property>
<property name="props">
<props>
<prop key="football4">足球4</prop>
<prop key="baskball4">篮球4</prop>
<prop key="pp4">乒乓球4</prop>
</props>
</property>
</bean>
- 获取输出
public static void collectionDemp() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
AllCollectionType type=(AllCollectionType)context.getBean("collectionDemo");
System.out.println(type);
}
- 给对象类型赋值null:
<!-- 注意没有<value> -->
<property name="name">
<null/>
</property>
- 赋空值
<property name="name">
<value></value>
</property>
自动装配注入(只适用于 ref 类型):
约定优于配置
- byName:自动寻找:其他bean的id值 = 该Course类的属性名
- byType:其他类型(class)是否与该Course类的ref 属性类型一致
(必须满足当前ioc容器只有一个bean满足) - constructor:其他bean的类型(class)是否与该Course 类的构造方法参数 的类型一致;
<!--
autowire="byName"
Course类中有一个ref属性teacher(属性名),并且该ioc容器中恰好有一个 bean的id也是teacher
bean的id=类的属性名
-->
<bean id="student" class="cust.zaw.entity.Student" autowire="byName">
<property name="stuNO" value="2"></property>
<property name="stuName" value="lc"></property>
<property name="stuAge" value="24"></property>
<!-- <property name="teacher" ref="teacher"></property>-->
</bean>
- 可以在头文件中,一次性将ioc容器的所有bean 统一设置成自动装配
自动装配虽然可以减少代码量,但是会降低程序可读性
<beans xmlns="http://www.springframework.org/schema/beans"
....
default-autowire="byName">