IOC DI

发布时间:2022-06-29 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了IOC DI脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

IOC

IOC—Inversion of Control,即控制反转,这不是一项技术,而是一种设计思想。在java开发中,ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接开控制。

Dl

DI—Dependency Injection,即依赖注入,组件之间依赖关系由容器运行决定,形象的说,即由容器动态的将某个依赖关系注入到组件中。

DI好处:

  1. 动态替换Bean依赖对象,程序更灵活。
  2. 更好实践优先使用对象组合,而不是类继承。
  3. 采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成。
  4. 增加Bean可复用性
  5. 降低Bean之间的耦合性
  6. 代码结构更清晰

DI的三种注入类型

  1. 构造器注入

    使用构造器注入通过配置构造器参数实现,构造器参数就是依赖。

    传统实例化方式:

    Tao t=new Tao(18,"钟文涛");
    

    通过容器构造器依赖注入实例化

    <bean name="tao" class="....Tao">
    <constructor-arg name="name" value="钟文涛" />
    <constructor-arg name="age" value="18" />
    </bean>
    
  2. setter注入

    setter注入,是通过在通过构造器实例好bean后,通过调用bean类的setter方法进入注入依赖。

    传统setter方法

    Tao t=new Tao();
    t.setName("钟文涛");
    t.setAge(18);
    

    通过容器setter注入

    <bean>
    <property name="name" value="钟文涛" />
    <property name="age" value="18" />    
    </bean>
    

    setter注入注意点:

    1. 该类必须要有公共的无参构造器
    2. 属性为private访问级别,不建议public
    3. 属性必要时通过一组setter和getter方法来访问
    4. setter方法,以set开头,后跟首字母大写的属性名,如setAge,简单属性一般只有一个方法参数,方法返回值通常为void
    5. getter方法,一般属性以get开头,对于Boolean类型一般以is开头,后跟着首字母大写的属性名,如getAge,isOk

DI注入类型

  1. 注入常量

    <property name="message" value="Hello World!"/>
    或
    <property name="index">
        <value>1</value>
    </property>
    
  2. 注入List集合类型

    <bean>
    <property name="hobby">
        <list value-type="数据类型,不写默认为String" merge="default 不写默认为true 用于父子bean 是否合并还是覆盖">
            <value>1</value>
            <value>2</value>
        </list>
    </property>
    </bean>
    list集合配置引用类型
    <bean>
    <property name="hobby">
        <list>
          <ref bean="tao"/>
          <ref bean="tao2"/>
        </list>
    </property>
    </bean>
    
  3. 注入Set集合类型

    <!--需要使用<set>标签来配置注入,其配置参数及含义和<lsit>标签完全一样-->
    <bean>
    	<property name="hobby">
    				    <set>
            				<value>1</value>
                            <value>2</value>
            			</set>
        </property>
    </bean>
    
  4. 注入数组类型

    <!--一维数组-->
    <bean>
    <propert name="ywsz">
        <array value-type="" merge="" 跟list一样>
        	<value>1</value>
            <value>2</value>
            <value>3</value>
        </array>
    </propert>
    </bean>
    <!--二维数组-->
    <bean>
    <propert name="ewsz">
        <array>
            <array value-type="" merge="" 跟list一样>
        	<value>1</value>
            <value>2</value>
            <value>3</value>
        </array>
          <array value-type="" merge="" 跟list一样>
        	<value>4</value>
            <value>5</value>
            <value>6</value>
        </array>
        </array>
    </propert>
    </bean>
    
  5. 注入Map类型

    <bean>
    <property name="map">
    	   <map key-type="key数据类型" value-type="value数据类型">
               	<entry key="1" value="钟文涛"/>
        	</map>
    </property>
    </bean>
    
  6. 注入Properties

    Spring能注入java.util.Properties类型数据,需要使用标签来配置注入,键和值类型必须是String,不能变,子标签来指定键值对。

    <bean>
     <property name="properties">
                <props value-type="int">虽然这里指定了int类型,但是不起作用,因为它键和值就是String
                    <prop key="a">aaaa</prop>
                    <prop key="b">bbbb</prop>
                </props>
     </property>
    </bean>
    
    

引用其他Bean

  1. 构造器注入方式

    <bean name="bean1" class="...." />
    <bean name="bean2" class="....">
    <constructor-arg index="0" ref="bean1"/>
    </bean>
    或
    <bean name="bean1" class="...." />
    <bean name="bean2" class="....">
    	<constructor-arg index="0">
    		<ref bean="bean1"/> 
        </constructor-arg>
    </bean>
    
  2. setter注入方式

    <bean name="bean1" class="...." />
    <bean name="bean2" class="....">
    <property name="setter" ref="bean1"/>
    </bean>
    或
    <bean name="bean1" class="...." />
    <bean name="bean2" class="....">
    	<property name="setter">
        	<ref bean="bean1"/>
        </property>
    </bean>
    
  3. 处理null值

    <bean>
    <property name="message"><null/></property>
    </bean>
    
  4. 使用p命名空间简化setter注入

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="dept" class="com.trkj.pojo.Dept" p:dname="111"/>
    </beans>
    

零配置注入依赖

  1. @Autowired

    在零配置中,通过使用@Autowired来实现引用依赖注入

    在自动扫描模式下自动装配

    @Component("名字"),如果没有指定名字,会将类名首字母小写,然后当成名字。
    public class Studen{
        @Autowired(required默认为true,可以设置为false,代表必须给值)
        private int id;
        private String name;
    }
    
    
  2. @Qualifier

    • @Autowired按优先类型自动装配(byType方式进行匹配)

    • 当Spring容器中存在多个匹配类型(父子类)时,则建议使用@Qualifier按名称进行装配(byName方式进行匹配),使用@Qualifier,必须和@Autowired一起使用。

    • 如果不使用@Qualifier时,也可利用属性名与类名来进行匹配,此时属性名为首字母小写后的类名

        @Autowired
        @Qualifier("od")
        private  Order order;//订单对象
      
  3. Resource

    在自动扫描模式下也可使用@Resource注解,但该注解由J2EE提供,需要导入包javax.annotation.Resource

    1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

    2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

    3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

    4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(属性名匹配name);如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。 @Autowired可以为空,@Resource不能为空

        	@Resource(name = "od")
          private  Order order;
      

脚本宝典总结

以上是脚本宝典为你收集整理的IOC DI全部内容,希望文章能够帮你解决IOC DI所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: