zoukankan      html  css  js  c++  java
  • 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='小花'}]}
    
    

    最后

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

  • 相关阅读:
    PHP:第四章——PHP数组处理函数
    PHP:第四章——PHP数组array_intersect计算数组交集
    PHP:第四章——PHP数组array_diff计算数组差集
    PHP:第四章——PHP数组查找,替换,过滤,判断相关函数
    GPG入门
    GPG入门教程
    运行gpg --gen-key生成key时出现卡住的问题
    程序员练级攻略(2018) 与我的专栏
    构建一个在线ASCII视频流服务
    Ubuntu 16.04配置国内高速apt-get更新源
  • 原文地址:https://www.cnblogs.com/shilei-ysl/p/11026652.html
Copyright © 2011-2022 走看看