Spring依赖注入简介与练习

文章目录

  • Spring学习笔记
    • 依赖注入方式:
      • 引导内容:
      • setter注入-引用:
        • 单个注入:
          • 配置文件:
          • 运行结果:
        • 多个注入:
          • 运行结果:
      • setter注入-简单类型:
        • 配置文件:
        • 运行结果:
      • 构造方法注入:
        • 程序入口:
        • bookService实现类
        • 配置文件:
        • 运行结果:
        • 注入多个:
        • 构造方法注入-简单类型
        • 注入方式选择:
      • 依赖自动注入:
        • 按类型:
        • 按名称:
      • Collection注入:

Spring学习笔记

依赖注入方式:

引导内容:

Spring依赖注入简介与练习_第1张图片

setter注入-引用:

Spring依赖注入简介与练习_第2张图片

即配置文件中:

Spring依赖注入简介与练习_第3张图片

单个注入:

配置文件:

Spring依赖注入简介与练习_第4张图片

在BookService中添加需要依赖的Bean通过ref属性添加。

在BookService中注入BookDao

public class BookServiceImpl implements BookService {

    //删除业务层中使用new创建的对象
//    private BookDao bookDao=new BookDaoImpl();
    private BookDao bookDao;
    private UserDao userDao;

   /* public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
*/
    @Override
    public void Save() {
        System.out.println("BookService Save");
        bookDao.Save();
//        userDao.Save();
    }
    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

提供set方法。然后调用。

运行结果:

Spring依赖注入简介与练习_第5张图片

多个注入:

即类似于的那个注入需要几个就添加几个。

运行结果:

Spring依赖注入简介与练习_第6张图片

setter注入-简单类型:

在UserDao中做示例。

package org.wgq.dao.impl;

import org.wgq.UserDao;

public class UserDaoImpl implements UserDao {
    private int connectionNum;
    private String databaseName;

    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }

    @Override
    public void Save(){
        System.out.println("UserDao Save() Is running"+databaseName+connectionNum);
    }
}

两个私有属性,并生成对应的set方法。

配置文件:

<bean id="userDao" class="org.wgq.dao.impl.UserDaoImpl" >
            <property name="connectionNum" value="20"/>
            <property name="databaseName" value="MySQL"/>
        bean>

使用value获取基本类型的值。

运行结果:

Spring依赖注入简介与练习_第7张图片

构造方法注入:

程序入口:

package org.wgq;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForDIconstructor {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.Save();
    }
}

bookService实现类

package org.wgq.service.impl;

import org.wgq.BookDao;
import org.wgq.BookService;
import org.wgq.UserDao;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    //提供BookDao的构造方法
    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    @Override
    public void Save() {
        System.out.println("BookService Save");
        bookDao.Save();
    }
}

配置文件:

<bean id="bookService" name="service " class="org.wgq.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>

bean>

运行结果:

Spring依赖注入简介与练习_第8张图片

注入多个:

需要修改构造方法:

Spring依赖注入简介与练习_第9张图片

配置文件修改:

Spring依赖注入简介与练习_第10张图片

运行结果:

Spring依赖注入简介与练习_第11张图片

构造方法注入-简单类型

给定属性与构造方法:

Spring依赖注入简介与练习_第12张图片

修改配置文件:

Spring依赖注入简介与练习_第13张图片

运行结果:

Spring依赖注入简介与练习_第14张图片

以上配置为标准书写方式,耦合度较高,比如在构造方法中databaseName变更为database,那么配置文件中则无法应用。

为此Spring给出了解决方法。

去掉name属性,换用type。这样就不用担心形参名字改变了。

type表示数据类型,按数据类型进行对应赋值

<bean id="bookDao"  class="org.wgq.dao.impl.BookDaoImpl" >
                <constructor-arg type="java.lang.String" value="Redis"/>
                <constructor-arg type="int" value="10"/>
    bean>

运行结果:

Spring依赖注入简介与练习_第15张图片

但是万一有相同的数据类型怎么办呢?又乱套了。

对此Spring也给出了解决方法。

配置文件:

Spring依赖注入简介与练习_第16张图片

使用index锁定值对应构造方法中的第几个参数。

Spring依赖注入简介与练习_第17张图片

三种方法依照情况而定,各有各的优点与缺点。

注入方式选择:

Spring依赖注入简介与练习_第18张图片

依赖注入方式选择

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
  2. 可选依赖使用setter注入进行,灵活性强
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  6. 自己开发的模块推荐使用setter注入

依赖自动注入:

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

自动装配方式:

按类型( 常用 )

按名称

按构造方法

不启用自动装配

按类型:

set方法与属性依然需要提供。

Spring依赖注入简介与练习_第19张图片

image-20230209190129032

替换之前的 标签按类型自动填入。类型必须唯一

例如:

image-20230209190712543

它已经报错了,所以唯一很重要。

运行结果:

Spring依赖注入简介与练习_第20张图片

按名称:

image-20230209190829715

Spring依赖注入简介与练习_第21张图片

这两个名字需要对应。

注:自动装配不能用于基本数据类型的注入。

Collection注入:

定义属性并提供set方法

public class BookDaoImpl implements BookDao {
    private int []arr;
    private List<String>list;
    private Set<String>set;
    private Map<String,String>map;
    private Properties properties;

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

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

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

    public void save() {
        System.out.println("BookDao Is Save");
        System.out.println("遍历数组:"+ Arrays.toString(arr));
        System.out.println("遍历list: "+list);
        System.out.println("遍历set: "+set);
        System.out.println("遍历map: "+map);
        System.out.println("遍历Properties: "+properties);
    }
}

配置文件:

<bean id="bookDao" class="com.wgq.dao.impl.BookDaoImpl">
        <property name="arr">
            <array>
                <value>100value>
                <value>200value>
                <value>300value>
            array>
        property>
        <property name="list">
            <list>
                <value>WGQvalue>
                <value>ZQJvalue>
                <value>WWvalue>
            list>
        property>
        <property name="set">
            <set>
                <value>WGQvalue>
                <value>WGQvalue>
                <value>ZQJvalue>
            set>
        property>
        <property name="map">
            <map>
                <entry key="man" value="WGQ"/>
                <entry key="woman" value="ZQJ"/>
                <entry key="gender" value="M"/>
            map>
        property>
        <property name="properties">
            <props>
                <prop key="man">WGQprop>
                <prop key="woman">ZQJprop>
            props>
        property>
    bean>

运行结果:

Spring依赖注入简介与练习_第22张图片

你可能感兴趣的:(Spring学习笔记,spring,java,后端)