Spring中的IoC(控制反转)容器初探


IoC,翻译成中文有人叫控制反转,听起来很别别扭,其实就是依赖关系的转移,通过XML配置文件由容器来管理类,而不是在类中直接生成Bean的实例。

下面通过一个Hello World的实例来了解一下最基础的IoC

首先MyEclipse5.5新建一个Java工程,工程名上单击右键添加Spring容器能力。

我们先编写一个HelloWorld

qiudawei115.base.HelloWorld.java

package qiudawei115.base;

 

public class HelloWorld {

    String message;

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

}

注意这只是一个简单的Bean,没有任何其他东西。

applicationContext.xml配置qiudawei115.base.HelloWorld(红色字体)

<?xml version="1.0" encoding="UTF-8"?>

<beans

    xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="helloWorld" class="qiudawei115.base.HelloWorld">

    <property name="message" value="Hello World!"></property>

</bean>

</beans>

现在写一个测试类,检验一下qiudawei115.base.HelloWorldMain.java

package qiudawei115.base;

 

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

public class HelloWorldMain {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

//读取配置文件 

ClassPathResource resource=new ClassPathResource("applicationContext.xml");

       BeanFactory beanFactory=new XmlBeanFactory(resource);

//获取HelloWorld实例     

HelloWorld helloWorld=(HelloWorld)beanFactory.getBean("helloWorld");

       System.out.print(helloWorld.getMessage());

    }

}

这样就完成了一个简单的IoC实例。

这里我们的Bean是由xml文件去管理的,我们索要做的就是从xml中获取这个类的实例。

 

依赖注入(DI

IoC的重要功能之一就是进行Bean的管理,维护Bean之间的关联关系,这些工作是通过依赖注入(DI)来实现的(我对依赖注入有个解释就是根据Bean之间的依赖关系来实现向父Bean中注入子Bean,个人看法,不具权威,接受批评)

依赖注入主要有两种方法,就是Constructor注入和Setter注入。

下面将分别介绍这两种注入。

Constructor注入通过带有参数的构造函数(构造器)实现,每个参数代表该对象的依赖Bean。还是看一个简单的例子。

qiudawei115.constructor.FirstBean.java

package qiudawei115.constructor;

 

public class FirstBean {

    String message="I am FirstBean!";

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

   

    @Override

    public String toString() {

       // TODO Auto-generated method stub

       return this.message;

    }

}

 

 

 

 

qiudawei115.constructor. SecondBean.java

package qiudawei115.constructor;

 

public class SecondBean {

    String message="I an SecondBean!";

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

 

    @Override

    public String toString() {

       // TODO Auto-generated method stub

       return this.message;

    }

   

}

qiudawei115.constructor.ConstructorBean.java

package qiudawei115.constructor;

 

public class ConstructorBean {

    FirstBean fb;

    SecondBean sb;

    public ConstructorBean(FirstBean fb, SecondBean sb) {

       super();

       this.fb = fb;

       this.sb = sb;

    }

   

    public void display(){

       System.out.println("Constructor注入结果如下");

       System.out.println(fb);

       System.out.println(sb);

    }

   

}

applicationContext.xml增加对着三个类的管理(红色字体)

 

<?xml version="1.0" encoding="UTF-8"?>

<beans

    xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="helloWorld" class="qiudawei115.base.HelloWorld">

    <property name="message" value="Hello World!"></property>

</bean>

<bean id="fb" class="qiudawei115.constructor.FirstBean"></bean>

<bean id="sb" class="qiudawei115.constructor.SecondBean"></bean>

<bean id="cb" class="qiudawei115.constructor.ConstructorBean">

    <constructor-arg>

       <ref bean="fb"/>

    </constructor-arg>

    <constructor-arg>

       <ref bean="sb"/>

    </constructor-arg>

</bean>

</beans>

测试类:

qiudawei115.constructor.ConstructorMain.java

package qiudawei115.constructor;

 

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

 

public class ConstructorMain {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       ClassPathResource resource=new ClassPathResource("applicationContext.xml");

       BeanFactory beanFactory=new XmlBeanFactory(resource);

       ConstructorBean cb=(ConstructorBean)beanFactory.getBean("cb");

       cb.display();

    }

}

至此,我们就完成了一个Constructor注入的简单实例,是不是很简单!

下面看看Setter注入的实例,在Setter注入中,首先要利用空构造函数构造一个Bean,然后利用该BeanSetter方法完成Bean的注入就OK了。

我们继续通过一个简单的例子来进行了解。

qiudawei115.setter.FirstBean.java

package qiudawei115.setter;

 

public class FirstBean {

    String message="I am FirstBean!";

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

   

    @Override

    public String toString() {

       // TODO Auto-generated method stub

       return this.message;

    }

}

qiudawei115.setter.SecondBean.java

package qiudawei115.setter;

 

public class SecondBean {

    String message="I an SecondBean!";

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

 

    @Override

    public String toString() {

       // TODO Auto-generated method stub

       return this.message;

    }

   

}

 

 

 

qiudawei115.setter.SetterBean

package qiudawei115.setter;

 

public class SetterBean {

    FirstBean sfb;

 

    SecondBean ssb;

 

    public FirstBean getSfb() {

       return sfb;

    }

 

    public void setSfb(FirstBean sfb) {

       this.sfb = sfb;

    }

 

    public SecondBean getSsb() {

       return ssb;

    }

 

    public void setSsb(SecondBean ssb) {

       this.ssb = ssb;

    }

 

    public SetterBean() {

       super();

       // TODO Auto-generated constructor stub

    }

   

    public void display(){

       System.out.println("Setter注入结果如下");

       System.out.println(sfb);

       System.out.println(ssb);

    }

}

配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans

    xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<!-- Hello World! -->

<bean id="helloWorld" class="qiudawei115.base.HelloWorld">

    <property name="message" value="Hello World!"></property>

</bean>

<!-- Constructor DI -->

<bean id="fb" class="qiudawei115.constructor.FirstBean"></bean>

<bean id="sb" class="qiudawei115.constructor.SecondBean"></bean>

<bean id="cb" class="qiudawei115.constructor.ConstructorBean">

    <constructor-arg>

       <ref bean="fb"/>

    </constructor-arg>

    <constructor-arg>

       <ref bean="sb"/>

    </constructor-arg>

</bean>

<!-- Setter DI -->

<bean id="sfb" class="qiudawei115.setter.FirstBean"></bean>

<bean id="ssb" class="qiudawei115.setter.SecondBean"></bean>

<bean id="setterBean" class="qiudawei115.setter.SetterBean">

    <property name="sfb" ref="sfb"></property>

    <property name="ssb" ref="ssb"></property>

</bean>

</beans>

 

测试类

qiudawei115.setter.SetterBeanMain.java

package qiudawei115.setter;

 

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

 

import qiudawei115.constructor.ConstructorBean;

public class SetterBeanMain {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       ClassPathResource resource=new ClassPathResource("applicationContext.xml");

       BeanFactory beanFactory=new XmlBeanFactory(resource);

       SetterBean setterBean=(SetterBean)beanFactory.getBean("setterBean");

       setterBean.display();

    }

 

}

这样,我们也完成了Setter注入的实例。

  如果还有什么问题或需要源程序和我联系qiuyin_1985@126.com
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值