欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring(二.Spring DI)

程序员文章站 2022-04-02 11:23:56
一 IOC(DI) - 控制反转(依赖注入)所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由Spring框架提供,这个由spring框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过称之为依赖注入,也即DI。基于set方法注入通常的javabean属性都会私有化,而对外暴露的setXxx()getXx...

一 IOC(DI) - 控制反转(依赖注入)

所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由Spring框架提供,这个由spring框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过称之为依赖注入,也即DI。

基于set方法注入

通常的javabean属性都会私有化,而对外暴露的setXxx()getXxx()方法,此时spring可以通过这样的setXxx()方法将属性的值注入对象。

  • Spring普通属性注入:
<!--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-3.2.xsd"
        >
        <bean id="hero" class="cn.xxx.beans.Hero">
                <property name="id" value="123"></property>
                <property name="name" value="亚瑟 "></property>
                <property name="jobs">
                        <list>
                                <value>上单</value>
                                <value>打野</value>
                                <value>辅助</value>
                                <value>中单</value>
                        </list>
                </property>
                <property name="set">
                        <set>
                                <value>aaa</value>
                                <value>bbb</value>
                                <value>ccc</value>
                                <value>aaa</value>
                        </set>
                </property>
                <property name="map">
                        <map>
                                 <entry key="addr" value="王者荣耀"></entry>
                                 <entry key="addr" value="英雄联盟"></entry>
                                 <entry key="skill" value="风火轮"></entry>
                                 <entry key="age" value="19"></entry>
                        </map>
                </property>
                <property name="prop">
                        <props>
                                <prop key="k1">v1</prop>
                                <prop key="k2">v2</prop>
                                <prop key="k3">v3</prop>
                                <prop key="k4">v4</prop>
                        </props>
                </property>
        </bean>
</beans>
  • 自定义bean的注入:
<!--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-3.2.xsd"
        >
        <bean id="dog" class="cn.xxx.beans.Dog"></bean>
        <bean id="cat" class="cn.xxx.beans.Cat"></bean>
</beans>

自动装配

在Spring的set方式实现的注入过程中,支持自动装配机制,所谓自动装配机制,会根据要设置的javabean属性的名字 或 类型 到spring中自动寻找对应id 或 类型的进行注入设置,从而 省去依次配置的过程,简化了配置。

  • 为指定开启自动装配:
<!--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-3.2.xsd"
        >
        <!-- 
                autowire设定自动装配:
                        byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性 
                        byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
                        **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
         -->
        <bean id="teacher" class="cn.xxx.beans.Teacher" autowire="byType"></bean>
        <bean id="dog" class="cn.xxx.beans.Dog"></bean>
        <bean id="cat" class="cn.xxx.beans.Cat"></bean>
</beans>
  • 为全局配置自动装配:
<!--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-3.2.xsd"
        default-autowire="byName"
        >
        <!-- 
                autowire设定自动装配:
                        byName:根据javabean中需要注入的属性的名字 ,在spring容器中找对应id的<bean>将该<bean>的对象复制给 当前的属性 
                        byType:根据javabean中需要注入的属性的类型,在spring容器中找对应class类型的<bean>将该<bean>的对象复制给 当前的属性
                        **byType方式 根据类型进行匹配,可能匹配到多个<bean>,此时会抛出异常。而byName是通过id来寻找<bean>,id没有重复,不会有这方面的问题,所以推荐使用byName方式
         -->
        <bean id="teacher" class="cn.xxx.beans.Teacher"></bean>
        <bean id="dog" class="cn.xxx.beans.Dog"></bean>
        <bean id="cat" class="cn.xxx.beans.Cat"></bean>
</beans>

本文地址:https://blog.csdn.net/weixin_43942037/article/details/109260482

相关标签: spring java