IOC和DI
ioc:inverse of control 控制反转
我们将创建对象的方式反转了
以前创建对象是我们自己开发人员维护,包括依赖关系也是自己注入.
使用spring之后,对象以及依赖关系是由spring创建和注入
反转控制就是反转了对象的创建方式,从我们自己的创建反转给了程序
DI:Depenency injection 依赖注入
实现IOC实现需要DI做支持
注入的方式:
set和get方式注入
构造注入
字段注入
注入类型:
值注入(8大数据基本类型)
引用类型注入(将依赖对象注入)
spring创建对象的三种方式
1.空参构造创建(最常用的方式)
<!-- bean标签
class属性:被管理对象的完整类名
name属性:给被管理的对象起的名字,根据该名字获取对象
可以重复,可以使用特殊字符
id属性:和name属性一样
注意:尽量使用name属性
-->
<bean name="user" class="cn.zzu.entity.User"></bean>
2.静态工厂创建(方法有static方法,直接调用方法)
public class UserFactory {
public static User createUser() {
System.out.println("静态工厂创建");
return new User();
}
}
<!-- 静态工厂创建
通过调用UserFactory类的createUser方法
-->
<!-- name属性:创建的对象的名称,随便填写
class属性:类的路径
factory-method属性;调用的方法名
-->
<bean name="user2" class="cn.zzu.factory.UserFactory" factory-method="createUser" scope="singleton"></bean>
3.实例工厂创建(创建对象的方法不带static,需要创建对象,然后对象调用方法)
//实例工厂创建对象
@Test
public User createUser() { //不是静态方法
System.out.println("实例工厂");
return new User();
}
<!-- 实例工厂创建对象 -->
<!-- 1.先创建BeanUserFactory对象 -->
<bean name="beanuserfactory" class="cn.zzu.Factory.BeanUserFactory"> </bean>
<!-- 2.根据创建的对象调用方法 -->
<bean name="user3" factory-bean="beanuserfactory" factory-method="createUser"></bean>
bean标签的其他属性
scope属性:
singleton,单例对象,被表示为丹丽的对象只会在spring中创建一个
prototype,多例原型,被标记的对象,每回使用的时候才会创建对象,每次都是新的对象,注意,:在整合struts的时 候,action必须为多例
request:在web程序中使用,每次http请求都会返回一个全新的对象
session:在web程序中,每次http请求都会返回一个全新的对象
global session:在web程序中,全局的session,上下文只有一个session
生命周期属性:
配置一个方法为初始化方法,spring会在对象创建之后,立即调用
init-method
配置一个方法作为生命周期的销毁方法,spring在容器关闭销毁对象之前调用
destroy=method
<bean name="user" class="com.sjtu.bean.User" scope="singleton" init-method="init" destroy-method="destroy"></bean>
//并在User中实现此方法
public void init() {
System.out.println("初始化");
}
public void destroy() {
System.out.println("销毁");
}
主配置文件引入其他的配置文件:
//在主配置文件中做如下配置
<import resource="com/sjtu/b_create/applicationContext.xml"/>
属性注入
set方法注入(****)(前提是在实体类中提供set方法)
package cn.zzu.entity;
public class Car {
private String name;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Car() {
super();
// TODO Auto-generated constructor stub
}
public Car(String name, String color) {
super();
this.name = name;
this.color = color;
}
}
<bean name="user" class="cn.zzu.entity.User" >
<!--值类型注入:为User对象中名为name的属性注入tom作为值-->
<property name="name" value="tom"></property>
<property name="id" value="18"></property>
<!--引用类型注入:为car属性注入下方配置的car对象 car是user中一个对象-->
<property name="car" ref="car"></property>
</bean>
<!--将car对象配置到容器中 -->
<bean name="car" class="cn.zzu.entity.Car">
<property name="name" value="兰博基尼"></property>
<property name="color" value="黄色"></property>
</bean>
有参构造方法注入前提(前提是实体类中得有有参构造函数)
<!-- 构造函数的注入 -->
<bean name="user2" class="cn.zzu.entity.User">
<!--
name属性:构造函数参数名
index属性:构造函数索引
type属性:构造函数参数类型
注意:上面的属性不必要全部出现
-->
<constructor-arg name="name" value="tom" index="0" type="java.lang.String"></constructor-arg>
<constructor-arg name="id" value="1" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="car" ref="car"></constructor-arg>
</bean>
<bean name="car" class="cn.zzu.entity.Car">
<constructor-arg name="name" value="大众"></constructor-arg>
<constructor-arg name="color" value="红色"></constructor-arg>
</bean>
p名称空间注入(了解,实际上是set注入)
<!--
p空间注入 走set注入
1.导入p空间名称 xmlns:p="http://www.springframework.org/schema/p"
2.使用p:完成属性注入
-->
<bean name="user3" class="cn.zzu.entity.User" p:name="张三" p:id="12" p:car-ref="car">
</bean>
<!-- car对象的创建 -->
<bean name="car" class="cn.zzu.entity.Car">
<property name="name" value="奥迪"></property>
<property name="color" value="黑色"></property>
</bean>
spel注入(了解)
<!-- spel注入:spring expression language spring表达式 -->
<bean name="user4" class="User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user.age}"></property>
<property name="car" ref="car"></property>
</bean>
复杂类型的注入:
数组注入:
<!-- 向数组中注入值 -->
<bean name="collection" class="cn.zzu.entity.Collection">
<property name="arr" >
<array>
<value>tom</value>
<value>jack</value>
</array>
</property>
</bean>
list注入:
<!-- 向list中注入值 -->
<property name="list">
<list>
<value>tom</value>
<value>jack</value>
</list>
</property>
map注入:
<!-- 向map中注入值 -->
<property name="map">
<map>
<entry key="1" value="zhangsan"></entry>
<entry key="2" value="lisi"></entry>
</map>
</property>
prop注入:
<!-- 向prop中注入值 -->
<property name="prop">
<props>
<prop key="1">张三</prop>
<prop key="2">李四</prop>
<prop key="3">王五</prop>
</props>
</property>
<bean name="collection" class="cn.zzu.entity.Collection">
<!-- 向数组中注入值 -->
<property name="arr" >
<array>
<value>tom</value>
<value>jack</value>
</array>
</property>
<!-- 向list中注入值 -->
<property name="list">
<list>
<value>tom</value>
<value>jack</value>
</list>
</property>
<!-- 向map中注入值 -->
<property name="map">
<map>
<entry key="1" value="zhangsan"></entry>
<entry key="2" value="lisi"></entry>
</map>
</property>
<!-- 向prop中注入值 -->
<property name="prop">
<props>
<prop key="1">张三</prop>
<prop key="2">李四</prop>
<prop key="3">王五</prop>
</props>
</property>
</bean>