• 【Spring】 Spring中的IoC(控制反转)


    在这里插入图片描述
    以往在定义业务层实现时,在指定具体地Dao时候需要具体地定义出其实现:

    public class BookServiceImpl implements BookService{
    
    	private BookDao bookDao = new BookDaoImpl();
    	
    	public void save(){
    		bookDao.save()
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class BookDaoImpl implements BookDao {
        public void save(){
            System.out.println("book dao save...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    但是当我们想新定义一个实现方法的时候,例如:

    public class BookDaoImpl2 implements BookDao {
        public void save(){
            System.out.println("book dao save...2");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们就要修改BookServiceImpl类,将里面的private BookDao bookDao = new BookDaoImpl()修改为private BookDao bookDao = new BookDaoImpl2(),这带来如下所示的问题:耦合度偏高,所以想要使用IoC,将对象创建控制权由程序内部转移到外部
    在这里插入图片描述
    从而,在定义BookServiceImpl中的bookDao的时候,就不需要在进行new…进而修改很多的代码
    Spring实现IoC的方式如最上面的图,这里给出一个IoC的案例,手动配置Spring中的IoC,做法如下:

    1. pom.xml中加入dependency,刷新maven:
    <dependency>
    	<groupId>org.springframeworkgroupId>
    	<artifactId>spring-contextartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 在resource下创建Spring config文件配置bean:
    
    <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="bookDao" class="com.example.demo231116.dao.impl.BookDaoImpl" />
    
        <bean id="bookService" class="com.example.demo231116.service.impl.BookServiceImpl" />
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 获取IoC容器和bean:
    public class Demo231116Application2 {
        public static void main(String[] args) {
            // 3. 获取IoC容器
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            // 4. 获取bean
    //        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    //        bookDao.save();
            BookService bookService = (BookService) ctx.getBean("bookService");
            bookService.save();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里getBean()中的参数就是在xml文件中配置的bean的id,配置中直接指向对应的类
    所以自然而然也可以知道,我们不可以定义相同id指向不同的类,这是不合法的

  • 相关阅读:
    【Java SE】第三话·数据类型与变量
    Bika LIMS 开源LIMS集—— SENAITE的安装
    【泛函分析】第一纲集和第二纲集
    电镀含镍废水如何回收镍?电镀废水除镍的工艺方法有哪些?
    ChinaSkills-高职组网络系统管理大赛-WinSer 2019 互联网网卡检测服务笔记
    css3 中选择器间有空格与没空格的区别?
    程序包org.apache.ibatis.mapping不存在 符号找不到
    Springboot 开发 Web Flux
    位运算【算法基础】
    基于SVM的功率分类,基于支持向量机SVM的功率分类识别,Libsvm工具箱详解
  • 原文地址:https://blog.csdn.net/passer__jw767/article/details/134447406