本文主要是对于spring ioc简单入门做一些介绍,并不深入了解,只接触表面,对一些较复杂的内容也不过多描述。如文中有错误之处,望不吝赐教,谢谢~
一、IoC简介
IoC作为spring的核心概念之一,很有必要好好学习学习。
IoC 全称为Inversion of Control,意为 “控制反转”,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中控制指的是ioc容器控制对象,反转指的是对象获取由原先的主动获取变为被动接收。
ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度(耦合度)。
在ioc中,最常见的方式叫做依赖注入Dependency Injection),即对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。
二、Spring IoC的简单使用
(1)新建一个maven项目,并引入spring依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
(2)本实例的研究对象是用户(user)相应的处理代码如下所示:
IUserDao
package com.example.dao;
public interface IuserDao {
/**
* 模拟保存用户
*/
void saveUser();
}
UserDaoImpl
package com.example.dao.impl;
import com.example.dao.IuserDao;
public class UserDaoImpl implements IuserDao {
/**
* 模拟保存用户
*/
public void saveUser() {
System.out.println("保存了用户");
}
}
IUserService
package com.example.service;
public interface IUserService {
/**
* 模拟保存用户
*/
public void saveUser();
}
UserServiceImpl
package com.example.service.impl;
import com.example.dao.IuserDao;
import com.example.dao.impl.UserDaoImpl;
import com.example.service.IUserService;
public class UserServiceImpl implements IUserService {
private IuserDao userDao=new UserDaoImpl();
public void saveUser(){
userDao.saveUser();
}
}
Client
package com.example.ui;
import com.example.service.IUserService;
import com.example.service.impl.UserServiceImpl;
public class Client {
public static void main(String[] args) {
IUserService userService=new UserServiceImpl();
userService.saveUser();
}
}
(3)在resources目录下创建bean的配置文件bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--把对象的创建交给spring来管理-->
<bean id="userService" class="com.example.service.impl.UserServiceImpl"/>
<bean id="userDao" class="com.example.dao.impl.UserDaoImpl"/>
</beans>
(4)在Client里面获取spring ioc容器和bean对象
Client
package com.example.ui;
import com.example.dao.IuserDao;
import com.example.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
/**
* 获取spring ioc容器
* @param args
*/
public static void main(String[] args) {
//获取ioc容器对象
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
//获取bean对象
IuserDao userDao= (IuserDao) applicationContext.getBean("userDao");
IUserService userService= (IUserService) applicationContext.getBean("userService");
//测试
System.out.println("userDao对象:" +userDao);
System.out.println("userService对象:" +userService);
}
}
运行main函数得到如下结果,说明通过ioc管理对象成功
三、总结
在上面的实例当中,我们在创建IUserDao对象时,并没有像常规那样使用构造函数去创建对象,而是借助spring的applicationContext去获取对象,这就体现了ioc的核心思想:资源不由使用资源的双方管理,而由不使用资源的第三方管理,这里的第三方即是ioc容器。
关于ioc的内容很复杂,对于初学者而言,我们只需要知道其可以降低程序的耦合性,在创建一些对象时可以通过编写一些配置文件和使用spring的相关方法来创建对象即可,对于更细致的理解需要不断实践才可知悉,因为ioc所涉及的内容还是比较的抽象和繁杂。
2020.03.17