传统的代码书写方式的耦合度偏高,是主动在程序中使用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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。