Spring之IoC

      学习Spring,首先当然是需要了解Spring平台的核心之一IoC。

 

      一、控制反转(IoC = Inversion of Control)和依赖注入(DI = Dependency Injection)

      IoC,通俗说法就是由容器控制程序之间的关系,而非由代码直接控制;也就是控制权由程序代码转移到了外部容器,控制权的转移,即所谓的反转。

      DI,即组件之间的依赖关系由容器在运行时来决定,形象的说就是由容器动态的将依赖关系注入到组件之中。依赖注入的目标并非为系统带来更多的功能,而是提升组件的复用行和可扩展性。

 

      二、依赖注入的实现类型

      1.接口注入,预先在配置文件中设定实现类的类名,动态加载实现类;

      2.构造子注入,通过构造函数完成依赖关系的设定;

      3.设值注入,通过setter方法完成依赖关系的设定。

      接口注入模式因为具有侵略性,它要求组件与特定的接口相关联,使用被限制。而构造子注入和设值注入没有以上劣势而被广泛应用。

 

      三、Spring Bean的封装机制

      1.Bean Wrapper,它的功能很简单,就是提供一个设置JavaBean的通用方法。如:

Object obj = Class.forName("com.china.bean.User").newInstance();
BeanWrapper bw = new BeanWrapperImpl(obj);	
bw.setPropertyValue("name", "CJTL");
System.out.println(bw.getPropertyValue("name"));

      这样做的好处是无需在编码时指定JavaBean的实现类和属性的值,而是在配置文件中设定,就可以在运行期间动态的创建和设定其属性的值。

      2.Bean Factory,负责根据配置文件创建并维护Bean实例。如一个比较完整的配置:

      Boy类:

package com.csh.bean;

public class Boy {

	private String name;

	private int age;

	private Girl myGirl;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Girl getMyGirl() {
		return myGirl;
	}

	public void setMyGirl(Girl myGirl) {
		this.myGirl = myGirl;
	}

	public void born() {
		System.out.println("born...");
	}

	public void die() {
		System.out.println("die...");
	}
} 

      Girl类:

 

package com.csh.bean;

public class Girl {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

      applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
	<bean id="wxb"
		  class="com.csh.bean.Boy"
		  singleton="true"
		  init-method="born"
		  destroy-method="die"
		  depends-on=""
	>
		<property name="name">
			<value>xb</value>
		</property>
		<property name="age">
			<value>22</value>
		</property>
		<property name="myGirl">
			<ref local="ake"/>
		</property>
	</bean>
	
	<bean id="ake"
		  class="com.csh.bean.Girl"	  
	>
		<property name="name">
			<value>kk</value>
		</property>
	</bean>

</beans>

      测试类:

 

package com.csh.test;


import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

import com.csh.bean.Boy;


public class Test {
	
	public static void main(String[] args) throws Exception {
		BeanFactory factory = new XmlBeanFactory(
						new FileSystemResource("src/applicationContext.xml"));
		Boy boy = (Boy) factory.getBean("wxb");
		System.out.println(boy.getName() + boy.getAge() + boy.getMyGirl().getName());
	}
}

      这样即能创建Boy类的实例,并根据配置文件进行初始化和属性值的设定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值