概述

  依赖注入: 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护
  IoC的作用: 降低程序间的耦合(依赖关系)

注入方式

  1. 构造函数注入
    使用的标签:constructor-arg 标签出现的位置:bean标签的内部
    标签中的属性:

属性

属性值

type

根据数据的数据类型进行赋值(当有多个相同数据类型,不方便)

index

根据构造函数中指定索引位置的参数赋值。索引的位置是从0开始(不知晓,某个索引的数据类型是什么)

name

根据构造函数中指定名称的参数赋值(更加精确、无误)

value

给所定参数赋值 (包含基本数据类型、String数据类型)

ref

给所定参数赋值(指定其他的bean类型)

  优势:
   在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
  弊端:
   在创建对象时,必须依次提供该标签下的所有数据类型,如果不想提供则需书写其他<bean>标签 使其开发更加困难。因此,在这样一个问题下,有了第二种方法set方法注入。
  例子:

<!--  创建有参的构造函数  -->
	<!--  如果想要重载构造函数,又必须命名id,很麻烦。因此诞生了,第二种注入方法  -->
    <bean id="usercountmoney_4" class="service.impl.UserCountMoney_1">
        <constructor-arg name="name" value="你是猪"></constructor-arg>
        <constructor-arg name="password" value="123456"></constructor-arg>
        <constructor-arg name="id" value="12"></constructor-arg>
        <constructor-arg name="date" ref="now"></constructor-arg>
    </bean>

    <bean id="now" class="java.util.Date"></bean>
  1. 使用set方法注入 (常用)
    使用的标签:property 标签出现的位置:bean标签的内部
    标签中的属性:

属性

属性值

name

用于指定注入时所调用的set方法名称

value

给所定set方法传参赋值 (包含基本数据类型、String数据类型)

ref

给所定set方法传参赋值(指定其他的bean类型)

  优势:
   创建对象时,没有明确的限制,可以直接使用默认的构造函数。
  弊端:
   成员变量必须有值,否则获取对象时set方法没有执行。
  例子:

<!--  根据set方法注入  -->
    <bean id="usercountmoney_5" class="service.impl.UserCountMoney_1">
        <property name="name" value="憨批"></property>
        <property name="password" value="9999"></property>
        <property name="id" value="23"></property>
        <property name="date" ref="now"></property>
    </bean>

  注入集合数据

   1. 用于给List结构集合注入的标签:List、array、set

   2. 用于给Map结构集合注入的标签:map、props

   3. 特殊地: 结构相同、标签可互换

  例子:

<!--  注入集合数据  -->
	<!-- 结构相同、标签可互换 -->
	<!-- 便于记忆,只需要记住:List集合、Map集合即可。-->
	<!-- 但如果是学习的话。还是尽量相互对应 -->
	<!-- 数组对应:array  list集合对应:list set集合对应:set -->
	<!-- map集合对应:map  properties配置文件对应:props-->
    <bean id="usercountmoney_6" class="service.impl.UserCountMoney_2">
        <property name="myArray">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="myList">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="mySet">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="myMap">
            <map>
                <entry key="A" value="111"></entry>
                <entry key="B" value="222"></entry>
                <entry key="C" value="333"></entry>
            </map>
        </property>

        <property name="myProp">
            <map>
                <entry key="A" value="111"></entry>
                <entry key="B" value="222"></entry>
                <entry key="C" value="333"></entry>
            </map>
        </property>

    </bean>
  1. 使用注解方法注入
  1. 创建对象
    他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的。写在类上面
    前提: 必须在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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    
    <!--告知spring在创建容器时要扫描的包.配置所需要的标签不是在beans的约束中.而是一个名称为context名称空间和约束中-->
    <!--这样就可以不用写 <bean> 标签了  -->
    <context:component-scan base-package="service"></context:component-scan>

</beans>

注解

属性

含义

@Component

value

默认值:类名的首字母小写

@Controller

value

默认值:类名的首字母小写。一般用在表现层

@Service

value

默认值:类名的首字母小写 。一般用在业务层

@Repository

value

默认值:类名的首字母小写 。一般用在持久层

    2. 注入数据
     他们的作用就和在XML配置文件中的<bean>标签中写一个<property>标签的作用是一样的。写在数据类型上面
     特殊地: 对于<bean>和`基本数据类型、String数据类型可用注解。但对于集合数据类型使用xml配置文件更好一点。

注解

属性

含义

@Autowired

自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功

如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。

@Qualifier

value

当容器中有多个bean对象类型和要注入的变量类型匹配。用于指定<bean>的id

@Resourse

name

上面两者的综合,用于指定<bean>的id

@Value

value

给基本数据类型、String数据类型赋值

    3. 作用范围
     他们的作用就和在XML配置文件中的<bean>标签中使用scope属性实现的功能是一样的。写在类上面

注解

属性

含义

@Scope

value

prototype:多例模式

singleton:单例模式(默认)

    4. 生命周期
     他们的作用就和在XML配置文件中的<bean>标签中实现init-methoddestroy-method的作用是一样的。写在方法上面

注解

含义

@PostConstruct

创建对象,初始化方法

@PreDestroy

对象销毁,销毁方法