spring------ioc理解

IOC概念理解

   ioc:Inversion of control。又名:控制反转。它是一种设计思想。在开发中,ioc意味着将依赖对象交给容器控制,而不是传统的在对象中直接控制。

   在以往的时候,我们使用依赖对象,都是通过new一个对象出来,对象之间进行耦合。随着系统的复杂,对象之间的耦合度越高,系统改造、维护等都会带来一定障碍。而且也与软件设计的低耦合目标不一致。为了解决对象之间耦合度过高的问题,spring的ioc框架出炉了。

   控制反转,是相对于“正”,才有“反”的说法。什么是“正”呢?正是指,对于依赖对象主动的去创建,去控制,什么时候创建、使用,是由程序主动控制的。反则是指,由容器来帮忙创建和注入依赖对象。由原来的主动,变为被动接受,所以是反转。

   控制反转,又名:依赖注入。依赖注入是指程序运行期间,动态的向某个对象提供它所需要的其它对象。控制反转和依赖注入是从不同角度描述的同一件事,那就是:通过引入IOC容器,通过依赖注入的方式,实现对象之间的解耦。

spring注入的三种方式

1. 属性注入
2. 构造方式注入
3. 工厂方式注入
1. 属性注入

   属性注入是通过setter的方法注入到bean对象的属性值中的。使用标签<property>,name指定bean属性名,value指定属性值。属性的注入是通过对象中的set方法注入。如:定义一个Teacher类,有属性name和age,则注入是通过setName()和setAge()两个方法注入的。bean属性,要与对象中的set方法一一对应。

如:

    <bean id = "teacher" class="com.ysl.http.service.Teacher">
        <property name="name" value="王老师"></property>
        <property name="age" value="22"></property>
    </bean>

对应的Teacher对象中:

public class Teacher {
    private String name;
    private String age;

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

对应的测试类:

    @Test
    public void test001(){

        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Teacher teacher = (Teacher) ctx.getBean("teacher");
        System.out.println(teacher);
    }

测试结果为:

Teacher{name='王老师', age='22'}
2. 构造注入

   构造方法注入bean对象的属性值或者依赖对象,可以在实例化后,直接使用,相当于有默认值。

   构造注入使用标签<constructor-arg>,这个标签中没有name,有value,通过value为属性值赋值。其中注入属性的个数一定与构造函数的参数一一对应。在这个标签中,还可以使用type指定参数类型,如遇到特殊字符,可使用<![CDATA[]]>包裹。 如:Dog类的bean配置文件

    <bean id = "dog" class="com.ysl.http.service.Dog">
        <constructor-arg value="小黄"></constructor-arg>
        <constructor-arg type="java.lang.String">
            <value><![CDATA[<白色>]]></value>
        </constructor-arg>
    </bean>

Dog的构造函数

public class Dog {

    private String color;
    private String name;

    public Dog(String name, String color){
        this.name = name;
        this.color = color;
    }

测试类

    @Test
    public void test002(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Dog dog = (Dog) ctx.getBean("dog");
        System.out.println(dog);
    }

执行结果:

Dog{color='<小黄>', name='白色'}

   bean之间还可以使用<property>的ref属性建立bean之间的引用关系。如:为teaher这个bean关联上dog,<property name="dog" ref="dog"></property>。在执行结果中,可以看到:

    <bean id = "teacher" class="com.ysl.http.service.Teacher">
        <property name="name" value="王老师"></property>
        <property name="age" value="22"></property>
        <property name="dog" ref="dog"></property>
    </bean>
Teacher{name='王老师', age='22', dog=Dog{color='<白色>', name='小黄'}}

对list集合的属性注入

    <bean id = "teacher" class="com.ysl.http.service.Teacher">
        <property name="name" value="王老师"></property>
        <property name="age" value="22"></property>
        <property name="dogs">
            <list>
                <ref bean="dog"/>
                <ref bean="dog2"/>
                <ref bean="dog3"/>
            </list>
        </property>
    </bean>

    <bean id = "dog" class="com.ysl.http.service.Dog">
        <constructor-arg value="小黄"></constructor-arg>
        <constructor-arg type="java.lang.String">
            <value><![CDATA[<白色>]]></value>
        </constructor-arg>
    </bean>

    <bean id = "dog2" class="com.ysl.http.service.Dog">
        <constructor-arg value="小黑"></constructor-arg>
        <constructor-arg value="黑色"></constructor-arg>
    </bean>

    <bean id = "dog3" class="com.ysl.http.service.Dog">
        <constructor-arg value="小花"></constructor-arg>
        <constructor-arg value="花色"></constructor-arg>
    </bean>

在对象Teacher中加上private List dogs;的set和get方法。执行以后得到的结果为:

Teacher{name='王老师', age='22', dog=null, dogs=[Dog{color='<白色>', name='小黄'}, Dog{color='黑色', name='小黑'}, Dog{color='花色', name='小花'}]}

最后

我保证我写的都是经过验证的,欢迎关注和交流。

posted @ 2019-06-15 10:15 浪里飞石 阅读(...) 评论(...) 编辑 收藏