1 构造器注入(与构造器有直接关系)
-
默认无参构造
-
3种构造方式:通过
<contructor-arg>
调用类中的构造器-
下标
<bean id="userService" class="com.guan.service.UserServiceImpl"> <constructor-arg index="0" ref="apple"></constructor-arg> </bean>
-
类型
<bean id="userService" class="com.guan.service.UserServiceImpl"> <constructor-arg type="com.guan.dao.Fruit" ref="apple"></constructor-arg> </bean>
-
参数名(推荐使用)
<bean id="userService" class="com.guan.service.UserServiceImpl"> <constructor-arg name="fruit" ref="apple"></constructor-arg> </bean>
-
-
总结:
(1).所有实例在配置文件加载时完成初始化
(2).一个类在一个容器中只有一个实例(默认是单例模式)
2 set注入(重点,与set方法有直接关系)
-
依赖注入的概念:
- 依赖: bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器注入
-
测试环境搭建
public class Teacher {
private String name;
private int age;
}
```java
public class Student {
private String name;
private Teacher teacher;
private int age;
private String wife;
private Properties info;
private List<String> bookList;
private String[] friends;
private Set<String> things;//compared to list collection,the item of set can't be repeat.
private Map<String,Object> eductationHistory;
}
几个集合的区别:
(1).list和数组:list是动态伸缩的,而数组不是
(2).list和set:set不能重复,list可以重复
-
使用配置文件进行配置
<bean id="teacher" class="com.guan.bean.Teacher"> <property name="name" value="蔡老师"></property> <property name="age" value="5"></property> </bean> <bean id="student" class="com.guan.bean.Student"> <property name="name" value="小明"></property> <!-- 1.class--> <property name="teacher" ref="teacher"></property> <property name="age" value="23"></property> <!-- 2.null--> <property name="wife"><null></null></property> <!-- 3.properties--> <property name="info"> <props> <prop key="喜欢的歌手">许嵩</prop> <prop key="可能喜欢的事">写代码</prop> </props> </property> <!-- 4.List--> <property name="bookList"> <list> <value>飘</value> <value>百年孤独(最近在看)</value> </list> </property> <!-- 5.array--> <property name="friends"> <array> <value>小王</value> <value>小红</value> <value>小火</value> </array> </property> <!-- 6.set--> <property name="things"> <set> <value>敲代码</value> <value>敲代码</value> <value>敲代码</value> </set> </property> <!-- 7.Map--> <property name="eductationHistory"> <map> <entry key="小学" value="五里屯"></entry> <entry key="初中" value="张家口"></entry> <entry key="高中" value="三门星"></entry> </map> </property> </bean>
注意:
(1).空值是通过标签
<null/>
(2).properties是通过标签
<props/>
和<prop>
组合在一起配置的(3),map的value值写在
<entry>
标签间
3 其他方式
- p命名空间(property):可以直接在
<bean>
的像id一样赋值(通过set方法) - c命名空间(construct):同上,只是使用的函数方式不同(通过construct方法)
注意:需要先导入命名空间
4 bean的作用域
-
单例模式(singletion):每次取得的都是同一个实例,一般用于单线程(默认)
<bean id="teacher" class="com.guan.bean.Teacher" scope="singleton"> <property name="name" value="蔡老师"></property> <property name="age" value="5"></property> </bean>
-
原型模式(prototype):每次get都会取得不同的实例,一般用于多线程
<bean id="teacher" class="com.guan.bean.Teacher" scope="prototype"> <property name="name" value="蔡老师"></property> <property name="age" value="5"></property> </bean>
-
其余的request,session,application只能在web开发中使用