Spring DI(依赖注入)

DI依赖注入

  • IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源
  • DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入
  • 站在spring角度就是ioc,站在应用程序角度就是di
  • 可以理解为Spring提供的给对象赋值的功能

IoC与DI的关系:IoCDI是同一件事站在不同角度看待问题

Spring DI(依赖注入)_第1张图片

set注入:

  • 名称:property

  • 类型:标签

  • 归属:bean标签

  • 作用:使用set方法的形式为bean提供资源

格式:

    <bean>
        <property/>
    bean>

基本属性:


<property name="propertyName" value="propertyValue" ref="beanId"/>
  • name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
  • value:设定非引用类型属性对应的值,不能与ref同时使用
  • ref:设定引用类型属性对应bean的id ,不能与value同时使用
  • 注意:一个bean可以有多个property标签
  • Set注入,包装类型也会被看做是普通的数据类型去用,都用value,注入对象用ref,其他用value

演示:

public interface UserDao {
    void save();
}
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("UserDao执行");
    }
}
public class UserServiceImpl implements UserService {
    // 添加引用类型和非引用的变量
    private UserDao userDao;
    private int num;
    private String version;

    // 1、对需要注入的变量添加set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    @Override
    public void save() {
        System.out.println("UserService执行" + num + version);
        userDao.save();
    }
}

<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.xsd">

        
    <bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
        
        
        <property name="userDao" ref="userDao"/>
        <property name="num" value="1998"/>
        <property name="version" value="itzhuzhu"/>
    bean>
    
    <bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/>
beans>

构造器注入

  • 名称:constructor-arg

  • 类型:标签

  • 归属:bean标签

  • 作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作

  • 格式:

<bean>
	<constructor-arg />
bean>
  • 基本属性:
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>
  • ref:设定引用类型构造方法参数对应bean的id ,不能与value同时使用
  • type :设定构造方法参数的类型,用于按类型匹配参数或进行类型校验
  • index :设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数
  • 注意:一个bean可以有多个constructor-arg标签

<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.xsd">
    
     
    <bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
        
        
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="num" value="1998"/>
        <constructor-arg name="version" value="itzhuzhu"/>
    bean>
beans>
public class UserServiceImpl implements UserService {
    // 添加引用类型和非引用的变量
    private UserDao userDao;
    private int num;
    private String version;
    private BookDao bookDao;

    public UserServiceImpl(UserDao userDao, int num, String version, BookDao bookDao) {
        this.userDao = userDao;
        this.num = num;
        this.version = version;
        this.bookDao = bookDao;
    }

    // 1、对需要注入的变量添加set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    @Override
    public void save() {
        System.out.println("UserService执行" + num + version);
        userDao.save();
        bookDao.save();
    }
}

集合类型数据注入:

  • 名称:array,list,set,map,props

  • 类型:标签

  • 归属:property标签 或 constructor-arg标签

  • 作用:注入集合数据类型属性

  • 格式:

<property>
	<list>list>
property>
  1. 集合类型数据注入——list
<property name="al">
    <list>
        <value>itzhuzhuvalue>
        <value>66666value>
    list>
property>
  1. 集合类型数据注入——props
<property name="properties">
    <props>
        <prop key="name">itzhuzhu123prop>
        <prop key="value">666666prop>
    props>
property>
  1. 集合类型数据注入——array
<property name="arr">
    <array>
        <value>123456value>
        <value>66666value>
    array>
property>
  1. 集合类型数据注入——set
 <property name="hs">
     <set>
         <value>itzhuzhuvalue>
         <value>66666value>
     set>
property>
  1. 集合类型数据注入——map
<property name="hm">
    <map>
        <entry key="name" value="itzhuzhu123"/>
        <entry key="value" value="6666666666"/>
    map>
property>

演示:

public class BookDaoImpl implements BookDao {

    private ArrayList al;
    private Properties properties;
    private int[] arr;
    private HashSet hs;
    private HashMap hm ;

    public void setAl(ArrayList al) {
        this.al = al;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void setArr(int[] arr) {
        this.arr = arr;
    }

    public void setHs(HashSet hs) {
        this.hs = hs;
    }

    public void setHm(HashMap hm) {
        this.hm = hm;
    }

    public void save() {
        System.out.println("book dao running...");
        System.out.println("ArrayList:"+al);
        System.out.println("Properties:"+properties);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("HashSet:"+hs);
        System.out.println("HashMap:"+hm);
    }
}

配置文件

    <bean id="userDao" class="com.itzhuzhu.dao.impl.UserDaoImpl"/>

    <bean id="userService" class="com.itzhuzhu.Service.impl.UserServiceImpl" p:bookDao-ref="bookDao" p:userDao-ref="userDao"/>

    <bean id="bookDao" class="com.itzhuzhu.dao.impl.BookDaoImpl">
        <property name="al">
            <list>
                <value>itzhuzhuvalue>
                <value>666666value>
            list>
        property>

        <property name="properties">
            <props>
                <prop key="name">itzhuzhu123prop>
                <prop key="value">666666prop>
            props>
        property>

        <property name="arr">
            <array>
                <value>12345value>
                <value>666666value>
            array>
        property>

        <property name="hs">
            <set>
                <value>itzhuzhuvalue>
                <value>666666value>
            set>
        property>

        <property name="hm">
            <map>
                <entry key="name" value="itzhuzhu123"/>
                <entry key="value" value="666666"/>
            map>
        property>

    bean>

UserServiceImpl调用BookDao的save();

使用p命名空间简化配置

  • 名称:p:propertyName,p:propertyName-ref

  • 类型:属性

  • 归属:bean标签

  • 作用:为bean注入属性值

  • 格式:

    <bean p:propertyName="propertyValue" p:propertyName-ref="beanId"/>
  • 注意:使用p命令空间需要先开启spring对p命令空间的的支持,在beans标签中添加对应空间支持
<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 https://www.springframework.org/schema/beans/spring-beans.xsd">
beans>

演示:

<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl" p:userDao-ref="userDao"p:bookDao-ref="bookDao"/>

C标签代替构造方法

  1. 引入C名称空间

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       
    <bean class="com.itheima.xml.Person" c:_0="3" c:name="Jason3"/>

SpEL

Spring提供了对EL表达式的支持,统一属性注入格式

  • 类型:属性值

  • 归属:value属性值

  • 作用:为bean注入属性值

  • 格式:

<property value="EL">bean>
  • 注意:所有属性值不区分是否引用类型,统一使用value赋值

  • 所有格式统一使用 value=“********”

    • 常量 #{10} #{3.14} #{2e5} #{‘itcast’}

    • 引用bean #{beanId}

    • 引用bean属性 #{beanId.propertyName}

    • 引用bean方法 beanId.methodName().method2()

    • 引用静态方法 T(java.lang.Math).PI

    • 运算符支持 #{3 lt 4 == 4 ge 3}

    • 正则表达式支持 #{user.name matches‘[a-z]{6,}’}

    • 集合支持 #{likes[3]}

演示:

    <bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl">
        <property name="userDao" value="#{userDao}"/>
        <property name="bookDao" value="#{bookDao}"/>
        <property name="num" value="#{666666666}"/>
        <property name="version" value="#{'itzhuzhu'}"/>  字符加单引号
    bean>

properties文件

Spring提供了读取外部properties文件的机制,使用读取到的数据为bean的属性赋值
操作步骤

1.准备外部properties文件

2.开启context命名空间支持

xmlns:context="
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.xds"

3.加载指定的properties文件

<context:property-placeholder location="classpath:filename.properties"/>
<context:property-placeholder location="classpath:*.properties"/>

4.使用加载的数据

    <bean id="userDao" class="com.itzhuzhu.service.impl.UserDaoImpl">
        
        
        <property name="userName" value="${username}"/>
        <property name="password" value="${password}"/>
    bean>
  • 注意:如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件

  • 注意:读取数据使用${propertiesName}格式进行,其中propertiesName指properties文件中的属性名

import导入配置文件

  • 名称:import

  • 类型:标签

  • 归属:beans标签

  • 作用:在当前配置文件中导入其他配置文件中的项

  • 格式:

<beans>
    <import />
beans>

基本属性:

resource:加载的配置文件名

​ resource:加载的配置文件名

  • Spring容器加载多个配置文件
new ClassPathXmlApplicationContext("applicationContext-user.xml","applicationContext-book.xml");
  • Spring容器中的bean定义冲突问题

    • 同id的bean,后定义的覆盖先定义的

    • 导入配置文件可以理解为将导入的配置文件复制粘贴到对应位置

    • 导入配置文件的顺序与位置不同可能会导致最终程序运行结果不同

ApplicationContext

  1. ApplicationContext是一个接口,提供了访问spring容器的API

  2. ClassPathXmlApplicationContext是一个类,实现了上述功能

  3. ApplicationContext的顶层接口是BeanFactory

  4. BeanFactory定义了bean相关的最基本操作

  5. ApplicationContext在BeanFactory基础上追加了若干新功能

对比BeanFactory

  1. BeanFactory创建的bean采用延迟加载形式,使用才创建

  2. ApplicationContext创建的bean默认采用立即加载形式

FileSystemXmlApplicationContext

可以加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件

BeanFactory

Resource res = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(res);
UserService userService = (UserService)bf.getBean("userService");

第三方资源配置

阿里数据源方案Druid

  1. 先在pom加Druid配置
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.2.8version>
        dependency>
  1. 然后再在applicationContext加下面的
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver">property>
    <property name="url" value="jdbc:mysql://localhost:3306/spring_ioc">property>
    <property name="username" value="root">property>
    <property name="password" value="root">property>
bean>

你可能感兴趣的:(Spring,spring,依赖注入,set注入,构造器注入)