IOC—控制反转(依赖注入):一种编程思想

控制:指谁来控制对象的创建 ,传统的应用程序对象的创建是由程序本身来控制的;使用Spring框架后对象的创建由Spring来控制。

反转:正常是由程序主动创建对象,而反转指的是程序被动的接收对象。(主动→被动)

总结:

未使用Spring框架:程序主动创建对象。

使用Spring框架:程序被动接收Spring创建的对象。

IOC的实现是通过IOC容器实现的,IOC容器---BeanFactory。

 

一、使用IOC创建对象的三种方式:

1、通过无参构造函数创建:

调用默认无参构造函数创建。默认情况下,如果类中没有默认无参构造函数,则创建失败,会报异常。(常用)

<!-- 使用默认无参构造函数来创建对象-->
<bean id = "studentService" class="service.impl.StudentServiceImpl" scope="prototype"></bean>

2、使用静态工厂中的方法创建对象:

需要使用bean标签的factory-method属性,指定静态工厂中创建对象的方法。

静态工厂类如下:

public class StaticFactory {
    public static IStudentService getStudentService(){
        return new StudentServiceImpl();
    }
}

配置使用静态工厂创建对象:

<!-- 配置使用静态工厂创建对象-->
<bean id = "staticStudentService" class="factory.StaticFactory" factory-method="getStudentService"></bean>

3、使用实例工厂中的方法创建对象:

需要使用bean标签的factory-bean和factory-method属性,指定静态工厂中创建对象的方法。

实例工厂类如下:

public class InstanceFactory {
    public IStudentService getStudentService(){
        return new StudentServiceImpl();
    }
}

配置使用实例工厂创建对象:

<!-- 配置使用实例工厂创建对象-->
<bean id = "instanceFactory" class="factory.InstanceFactory"></bean>
<bean id = "instanceStudentService" factory-bean="instanceFactory" factory-method="getStudentService"></bean>

二、配置文件

1、Bean的配置:

(1)id是bean的标识符,必须唯一,如果没有配置id,name默认为标识符;如果既配置了id又配置了name,那么name是别名(别名可以有多个,分隔符可以是空格、逗号、分号等)。如果不配置id和name,那么可以根据applicationContext.getBean(Class)来获取对象。

(2)class是bean的全限定名,包括包名+类名。

2、团队合作使用Import来实现:

<!--引用其他文件-->
<import resource="bean.xml"/>

三、依赖注入(dependency injection)

依赖:指bean对象创建依赖于容器。Bean对象的依赖资源。

注入:指bean对象依赖的资源由容器设置和配置。

1、构造函数注入:

(1)涉及的标签:constructor-arg

(2)标签的属性:

         type: 指定参数的类型。

         index:指定参数的索引位置,从0开始

         name:指定参数的名称(常用)

         value:指定基本数据类型或String类型的数据

         ref:指定其他bean 类型数据

(3)标签出现的位置:写在bean标签内部

<bean id= "studentService" class="service.impl.StudentServiceImpl">
    <constructor-arg name="driver" value="com.mysql.jdbc.Driver"></constructor-arg>
    <constructor-arg name="port" value="3306"></constructor-arg>
    <constructor-arg name="today" ref="now"></constructor-arg>
</bean>
<bean id = "now" class="java.util.Date"></bean>

2、set方法注入:

(1)涉及的标签:property

(2)标签的属性:

          name:指定参数的set方法名称

          value:指定基本数据类型或string类型的数据

          ref:指定其他bean类型数据

          array:数组类型数据;list:list类型数据;set:set类型数据;Properties:Properties类型数据。

          p命名空间注入:要求有对应属性的set方法,需要在文件头加入

xmlns:p="http://www.springframework.org/schema/p"

          c命名空间注入:要求有对应参数的构造方法,需要在文件头加入

xmlns:c="http://www.springframework.org/schema/c"

(3)标签出现的位置:写在bean标签内部

<bean id= "studentService" class="service.impl.StudentServiceImpl">
    <!--常量注入-->
    <property name="driver" value="com.mysql.jdbc.Driver"></property>
    <!--常量注入-->
    <property name="port" value="3306"></property>
    <!--bean注入-->
    <property name="today" ref="now"></property>
    <!--数组注入-->
    <property name="myStr">
        <array>
            <value>java</value>
            <value>python</value>
        </array>
    </property>
    <!--list注入-->
    <property name="myList">
        <list>
            <value>java</value>
            <value>python</value>
        </list>
    </property>
    <!--map注入-->
    <property name="myMap">
        <map>
            <entry key="中国银行" value="123456"></entry>
            <entry>
                <key><value>招商银行</value></key>
                <value>8888888</value>
            </entry>
        </map>
    </property>
    <!--set注入-->
    <property name="mySet">
        <set>
            <value>足球</value>
            <value>篮球</value>
        </set>
    </property>
    <!--Properties注入-->
    <property name="myProps">
        <props>
            <prop key="学号">20200101</prop>
        </props>
    </property>
    <!--null注入-->
    <property name="salary"><null/></property>
</bean>
<!--p命名空间注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" p:driver="ppp"/>-->
<!--c命名空间注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" c:driver="ppp"/>-->
<bean id = "now" class="java.util.Date"></bean>

四、bean的作用范围

(1)可以通过配置的方式来调整作用范围

(2)配置的属性:bean标签的scope属性。

(3)属性的取值:

1)singleton:单例的(默认)

2)prototype:多例的(当我们让spring接管struts2的action创建时,action必须配置此值

3)request:作用范围是一次请求 ,和当前请求的转发(因为请求转发是一次请求)。

4)session:作用范围是一次会话。

5)globalsession:作用范围时一次全局会话。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值