什么是ioc 和Di
1Ioc
1.1 Ioc :ioc是控制反转(Inversion of control)所完成的事情就是原先由程序员主动通过new 去进行实例化对象的事情,交给了spring 去负责。
控制:控制的是类的对象
反转:交给spring负责
1.2 ioc的作用:主要就是进行解耦,那么解什么耦呢,就是程序员不需要去进行管理对象了,解除了对象管理和程序员之间的耦合。
2 DI
2.1 Di :是依赖注入
Di和Ioc 实质上是一样的,当一个类A中需要另外的一个类B的时候,我们把B赋值给类A的过程就叫依赖注入。
3 spring 框架创建对象的三种方式
1 通过构造方法进行创建
无参构造创建:
在类中提供构造方法
public class People {
private int id;
private String name;
public People() {
System.out.println("默认无参创建对象");
}
}
在applicationContext.xml 文件中 配置信息
<bean id="peo" class="com.wang.model.People"></bean>
id :表示从class这个类中取到对象的唯一标识
class:表示从那个类中创建对象
name:给取到的对象起别名
测试
//首先加载applicationContext.xml文件到applicationContext 容器中
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过调方法来进行创建people 对象;peo指的就是id即就是xml 文件里的id 对象的唯一标识;people.class 指的是返回值类型
People bean = ac.getBean("peo", People.class);
System.out.println(bean);
有参构造:
在类中提供有参的构造方法
public class People {
private int id;
private String name;
public People() {
System.out.println("默认无参创建对象");
}
public People(int id, String name) {
System.out.println("有参构造");
this.id = id;
this.name = name;
}
public People(String name, int id) {
System.out.println("有参构造2222");
this.id = id;
this.name = name;
}
}
xml文件的配置
<bean id="peo" class="com.wang.model.People">
<constructor-arg index="0" type="int" name="id" value="1234"/>
<constructor-arg index="1" type="java.lang.String" name="name" value="王"/>
</bean>
index:指的是people实体类中的第一个成员变量的索引
type:成员变量的类型
name:成员变量的变量名
value:赋给变量的值
测试在控制台输出
有参构造
People [id=1234, name=王端]
注意:有参构造的时候,如果我们有相同的有参构造方法,只是传入参数的前后的顺序不同,而且我们在xml文件中没有使用index 或者 type 来进行明确的标记的话,那么创建对象的时候走构造方法时,默认是从下往上进行找的。
2 实例公厂创建
首先必须要有一个公厂,来进行生产对象:
public class PeopleFactory {
public People inStance() {
return new People(1,"杜兰特");
}
}
我们需要先去创建公厂对象然后再去进行创建实体类的对象
我们之前都是这么进行写的
PeopleFactory factory = new PeopleFactory();
People people = factory.instance();
现在我们需要在xml文件中进行配置
// id:工厂对象的唯一表示 class:从工厂类中
<bean id="factory" class="com.wang.model.PeopleFactory"/>
//id:对象的唯一标识 factory-bean:从那个工厂中 factory-method :工厂的哪一个方法
<bean id="peo1" factory-bean="factory" factory-method="inStance"/>
3 静态公厂
静态工厂即就是我们把工厂里的方法进行static
public static People newInStance() {
return new People(2,"杜兰特");
}
然后进行配置
//即就是从那个类中的那个方法进行创建对象 对象的唯一标识是 id
<bean id="peo2" class="com.wang.model.PeopleFactory" factory-method="newInStance"/>
4 给bean 的属性进行赋值(注入)
1 使用构造进行注入
2 使用类中的set 方法进行注入
如果是简单的基本数据类型或者是String时
<property name="id">
<value>223</value>
</property>
<property name="name">
<value>你大爷</value>
</property>
如果是set<?>时
<property name="sets">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
如果时list时
property name="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
如果 list 中就只有一个值
<property name="list" value="1">
</property>
如果是map时
<property name="map">
<map>
<entry key="1">
<value>2</value>
</entry>
<entry key="2">
<value>3</value>
</entry>
</map>
如果是数组时
<property name="str">
<array>
<value>1</value>
<value>3</value>
<value>4</value>
</array>
</property>
如果数组也只有一个值的时候也可以通过value 来直接进行赋值
如果属性 Properties 类型
<property name="demo">
<props>
<prop key="key">value</prop>
<prop key="key1">value1</prop>
</props>
</property>
对象的依赖注入
//ref:返回值desk 引用的时另外的一个bean 即就是另外的一个对象进行注入
<bean id="peo1" class="com.wang.model.People">
<property name="desk" ref="desk"/>
</bean>
<bean id="desk" class="com.wang.model.Desk">
<property name="id" value="1"/>
<property name="price" value="12"/>
</bean>