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

    技术2022-05-11  34

    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)