Inversion Of Control 控制反转或反向控制
控制反转:改变了对象的获取方式,之前编码方式采用new关键字方式获取对象,IOC中采用容器创建对象之后并注入进来使用,只要修改配置就可以改变对象关系,降低了耦合度。
可以理解为以下两个作用:
1.搭建Spring IOC开发环境
– 引入相关jar文件
–src下创建xml配置文件
2.定义bean
class=“包名.类名”
package org.oracle.test;
public class Computer {
private String cpu;
private String hdd;
private String mainbord;
public void show(){
System.out.println("----电脑配置----");
System.out.println("cpu:"+cpu);
System.out.println("hdd:"+hdd);
System.out.println("mainbord:"+mainbord);
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setHdd(String hdd) {
this.hdd = hdd;
}
public void setMainbord(String mainbord) {
this.mainbord = mainbord;
}
}
package org.oracle.test;
public class Phone {
private String cpu;
private String ram;
public Phone(String cpu,String ram){
this.cpu = cpu;
this.ram = ram;
}
public void show(){
System.out.println("----手机配置---");
System.out.println("cpu:"+cpu);
System.out.println("ram:"+ram);
}
}
package org.oracle.test;
public class Student {
private Computer c;
private Phone p;
public void show(){
c.show();
p.show();
}
public void setC(Computer c) {
this.c = c;
}
public void setP(Phone p) {
this.p = p;
}
}
Spring的配置文件:
<bean id="p1" class="org.oracle.test.Computer">
<!-- 信息set注入 -->
<property name="cpu" value="枭龙"></property>
<property name="hdd" value="索尼"></property>
<property name="mainbord" value="华硕"></property>
</bean>
<bean id="p2" class="org.oracle.test.Phone">
<!-- 构造器注入 -->
<constructor-arg index="0" value="高通"></constructor-arg>
<constructor-arg index="1" value="8G"></constructor-arg>
</bean>
<bean id="s1" class="org.oracle.test.Student">
<!-- set注入 -->
<property name="c" ref="p1"></property>
<property name="p" ref="p2"></property>
</bean>
3.实例化Spring容器(ApplicationContext)
4.使用时ac.getBean(“id值”),尽量不要用强转
package org.oracle.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestComputer {
public static void main(String[] args) {
ApplicationContext ac = new
ClassPathXmlApplicationContext("applicationContext.xml");
Computer c = ac.getBean("p1",Computer.class);
c.show();
}
}
主要有三种方法:构造方法,工厂静态方法和对象工厂方法
package oracle.oracle;
public class test01 {
private String a;
public test01(){
a="构造方法";
}
public void show(){
System.out.println(a);
}
}
package oracle.oracle;
public class test02 {
public static String test(){
String a="静态工厂方法";
return a;
}
}
package oracle.oracle;
public class test03 {
private String name;
private int age;
public test03(String name,int age){
this.name=name;
this.age=age;
}
public String show(){
return name+":"+age;
}
}
Spring的配置文件
<!-- 采用构造方法 -->
<bean id="t1" class="oracle.oracle.test01">
</bean>
<!-- 采用静态工厂方法 -->
<bean id="t2" class="oracle.oracle.test02" factory-method="test">
</bean>
<bean id="t3" class="oracle.oracle.test03">
<constructor-arg index="0" value="张三"></constructor-arg>
<constructor-arg index="1" value="25"></constructor-arg>
</bean>
<!-- 采用对象工厂方法 -->
<bean id="t4" factory-bean="t3" factory-method="show">
</bean>
package oracle.oracle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test04_test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
String a=(String)ac.getBean("t4");
System.out.println(a);
}
}
a.控制对象的创建方式(使用范围)
在元素中使用scope属性控制
scope可以支持singleton和prototype,默认singleton
该组件在Spring容器里只有一个bean对象
该组件在Spring容器里每次ac.getBean时
都会返回一个新对象
b.控制对象的初始化方法
利用元素的init-method指定
当创建对象后自动执行init-method指定的方法
c.指定对象的销毁方法
利用元素的destroy-method指定
满足两个条件才有效:
--组件对象为单例模式
--调用AbstractApplicationContext对象的close方法
d.控制单例对象的创建时机
在默认情况下,单例对象是Spring容器创建时实例化,可以使用
元素的lazy-init="true"属性将创建时机推迟到getBean方法调用时
下一篇整理IOC的注解版,提前祝看到这里的你新年快乐!