传统的代码书写方式的耦合度偏高,是主动在程序中使用new来产生对象。而运用IoC(Inversion of Control)控制反转的编程思想可以解决这一问题。


IoC的编程思想,是将对象创建的控制权由程序内部转移到外部。在Spring技术的帮助下,这个编程思想得到了实现。
1、创建对象时不主动使用new来创建对象,而是由IoC容器(Spring容器)来提供。
2、IoC容器负责创建对象、并且将它初始化,被创建被管理的对象就称之为Bean。

当然,光有IoC容器是不够的,你的代码又不知道谁和谁有关系,所以这时候还需要进行DI(Dependency Injection)依赖注入,在容器中建立bean与bean之间的关系。

实现一个简单的程序来感受一下。

传统的代码书写:
1、创建一个BookDao接口与它的实现类BookDaoImpl

package pers.happyfan.dao;

public interface BookDao {
    void borrowBook();
    void returnBook();
}

package pers.happyfan.dao.impl;

import pers.happyfan.dao.BookDao;

public class BookDaoImpl implements BookDao {

    @Override
    public void borrowBook() {
        System.out.println("书籍A被借阅");
    }

    @Override
    public void returnBook() {
        System.out.println("书籍A已归还");
    }
}

2、创建一个BookService接口与它的实现类BookServiceImpl

package pers.happyfan.service;

public interface BookService {
    void borrowBook();
    void returnBook();
}
package pers.happyfan.service.impl;

import pers.happyfan.dao.BookDao;
import pers.happyfan.dao.impl.BookDaoImpl;
import pers.happyfan.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();

    @Override
    public void borrowBook() {
        System.out.println("书籍B已借阅");
        bookDao.borrowBook();

    }

    @Override
    public void returnBook() {
        System.out.println("书籍B已归还");
        bookDao.returnBook();
    }
}

3、再创建一个入口类ApplicationDemo

package pers.happyfan;

import pers.happyfan.service.BookService;
import pers.happyfan.service.impl.BookServiceImpl;

public class ApplicationDemo {
    public static void main(String[] args) {
        BookService bookService = new BookServiceImpl();
        bookService.borrowBook();
        bookService.returnBook();
    }
}

执行!

可以看到,程序已经执行成功了。在传统的代码写法中,必须通过使用new来创建对象,才能实现对应类中的方法,接下来我们就使用Sprnig框架下的注解开发来运用IoC思想,实现这个功能。

1、在pom.xml文件中引入相关坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.4</version>
        </dependency>
    </dependencies>
</project>

2、添加SpringConfig类作为配置类

package pers.happyfan;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("pers.happyfan")
public class SpringConfig {
    
}

其中@Configuration是告诉IoC这个类是配置类,@ComponentScan("pers.happyfan")是告诉IoC要扫描这个路径下的所有的bean

3、修改BookDao的实现类BookDaoImpl

package pers.happyfan.dao.impl;

import org.springframework.stereotype.Service;
import pers.happyfan.dao.BookDao;

@Service
public class BookDaoImpl implements BookDao {

    @Override
    public void borrowBook() {
        System.out.println("书籍A被借阅");
    }

    @Override
    public void returnBook() {
        System.out.println("书籍A已归还");
    }
}

其中@Service注解是告诉IoC将这个类初始化成一个bean,交给IoC容器来管理。

4、修改BookService的实现类BookServiceImpl

package pers.happyfan.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pers.happyfan.dao.BookDao;
import pers.happyfan.service.BookService;

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao ;

    @Override
    public void borrowBook() {
        System.out.println("书籍B已借阅");
        bookDao.borrowBook();

    }

    @Override
    public void returnBook() {
        System.out.println("书籍B已归还");
        bookDao.returnBook();
    }
}

其中,@Autowired注解是自动装配的意思,自动的将BookDao的依赖注入到这个类当中,再通过@Service注解将这个类初始化成bean,交给IoC容器来管理。可以看到,这个类中已经不再出现主动使用new的方式来创建对象了。

5、修改入口类

package pers.happyfan;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import pers.happyfan.service.BookService;

public class ApplicationDemo {

    public static void main(String[] args) {
        //读取SpringConfig配置类
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        //获取BookService类的bean
        BookService bookService = ctx.getBean(BookService.class);
        bookService.borrowBook();
        bookService.returnBook();
    }
}

执行!

可以看到,程序执行成功了

总结

使用IoC容器来管理接口与类
1、通过@Configuration注解告知IoC这个类是配置类。
2、通过注解(@Service,@Controller,@Repository)告知IoC要管理的对象。
3、通过@ComponentScan注解将被管理的对象交给IoC容器。
4、通过@Autowired注解注入类与接口的依赖关系,从IoC容器中获取bean。


爱摇头的电风扇
7 声望2 粉丝