【springDay03】IOC、DI

day02

概念

IOC(Inversion Of Controll 控制反转)

  • 什么是IOC:
    对象的依赖关系由容器来建立。

DI(Dependency Injection 依赖注入)

  • 容器通过调用对象提供的set方法或者构造器来建立依赖关系。

注意:IOC时目标,DI 是手段。

注入依赖关系方法

1、set方法注入

属性:

< property name=" " ref=" "/>
若属性name的值为“bt”,那么容器在创建对象时,会调用对象的setBt()方法
nameref
属性指定属性名属性指定属性值(被注入的bean的id)
<bean id="b1" class="ioc.B"/>
	<!-- 
		property元素:表示使用set方法来注入依赖关系。
		其中,name属性指定属性名,
		ref属性指定属性值(被注入的bean的id)
	 -->
	<bean id="a1" class="ioc.A">
	    <property name="b" ref="b1"/>
	</bean>
public class B {
	
	public B() {
		System.out.println("B()");
	}
	
	public void f1() {
		System.out.println("f1()");
	}
	
}

public class A {
	private B b;
	
	public A() {
		System.out.println("A()");
	}
	
	public void setB(B b) {
		System.out.println("setB()");
		this.b=b;
	}
	
	public void execute() {
		System.out.println("execute()");
		b.f1();
	}
	
}
AbstractApplicationContext ac=
				new ClassPathXmlApplicationContext("ioc.xml");
		System.out.println(ac);
		A a=ac.getBean("a1",A.class);
		a.execute();
		ac.close();

结果:
在这里插入图片描述

2、构造器方式注入

标签:

< constructor index=" " ref=" " />
indexref
表示构造器参数的位置,如0、1、2注入 对象的id

代码:

1

  <bean id="b1" class="ioc.B"/>
    	<bean id="a1" class="ioc.A">
    	    <constructor-arg index="0" ref="b1"/>
    	</bean>

2

public class A {
	private B b;
	
	public A() {
		System.out.println("A()");
	}
	
	public A(B b){
		this.b=b;
	}
	public void execute() {
		System.out.println("execute()");
		b.f1();
	}
	
}

3

public class B {
	
	public B() {
		System.out.println("B()");
	}
	
	public void f1() {
		System.out.println("f1()");
	}
	
}

4

	AbstractApplicationContext ac=
				new ClassPathXmlApplicationContext("ioc.xml");
		System.out.println(ac);
		A a=ac.getBean("a1",A.class);
		a.execute();
		ac.close();
3、自动装配(了解)

自动装配,spring容器依据某种规则,自动建立对象之间的依赖关系。
注意:
a、默认情况下,容器不会自动装配
b、可以通过指定autowire属性来来告诉spring容器进行自动装配。(
容器仍然需要通过set方法或者构造器来完成依赖关系的建立)

<bean id=“a1” class=“ioc.A"autowire=” " />

属性值:

byName:
容器依据类中成员变量名在xml中查找id值与之相同的bean,然后把对应该bean的对象通过set方法注入。

<bean id="b1" class="ioc.B"/>

	<bean id="a1" class="ioc.A" autowire="byName" />

public class A {
	private B b1;
	public A() {
		System.out.println("A()");
	}
	
	public void setB1(B b1) {
		this.b1 = b1;
	}

	public void execute() {
		System.out.println("execute()");
		b1.f1();
	}
	
}

注意:

  • 如果找不到对应的bean,将注入null。
  • 不可能找到多个符合条件的bean。

byType:
容器依据成员变量的类型查找与之匹配的bean,然后调用set方法完成注入。

<bean id="b1" class="ioc.B"/>

<bean id="a1" class="ioc.A" autowire="byType" />

注意:

  • 如果找不到对应的bean,将注入null。
  • 可能找到多个符合条件的bean,此时会报错·。

constructor:
与byType类似,不同的是通过构造器。来完成注入。

4、注入基本类型
public class A {
	
	private String name;
	private int age;
	
	public void setName(String name) {
		this.name = name;
		System.out.println(this.name);
	}
	
	public void setAge(int age) {
		this.age = age;
		System.err.println(this.age);
	}
	
	
}

	<bean id="a1" class="ioc.A" >
	    <property name="name" value="java"/>
	    <property name="age" value="1998"/>
	</bean>

5、注入集合类型(Map、Set、List、Property)
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class A {
	private List<String> city;
	private Set<String> interest;
	private Map<String, String> kc;
	private Properties db;
	public void setDb(Properties db) {
		this.db = db;
		System.out.println(this.db);
	}
	public void setKc(Map<String, String> kc) {
		this.kc = kc;
		System.out.println(this.kc);
	}
	public void setInterest(Set<String> interest) {
		this.interest = interest;
		System.out.println(this.interest);
	}

	public void setCity(List<String> city) {
		this.city = city;
		System.out.println(this.city);
	}
	
	
}

<bean id="a1" class="ioc.A" >
		<property name="city">
		    <list>
		        <value>beijing</value>
		        <value>guangzhou</value>
		    </list>
		</property>
		
		<property name="interest">
		    <set>
		        <value>钓鱼</value>
		        <value>学代码</value>
		    </set>
		</property>
		
		<property name="kc">
		    <map>
		        <entry key="english" value="hhf"/>
		        <entry key="math" value="jj"/>
		    </map>
		</property>
		
		<property name="db">
		    <props>
		        <prop key="name">tiger</prop>
		    	<prop key="pwd">123456</prop>
		    </props>
		</property>
	</bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值