IOC英文是Inversion of Control中文理解为控制反转,是Spring框架的一种设计思想。表示创建或者控制对象的权利由应用程序转换到Spring容器,如下将通过new关键字准确获取UserServiceImpl、UserMapperImpl类的权利交给BeanFactory,所谓的容器是指程序运行之后,装有多个实例化Bean的组件。
程序的耦合:
耦合:程序间的依赖关系
包括:
类之间的依赖
方法之间的依赖
解耦:
降低程序间的依赖关系
实际开发中:
应该做到:编译期不依赖,运行时才依赖
解耦思路:举例jdbc
第一步:使用反射来创建对象,而避免使用new关键字。
第二步:通过配置文件来获取要创建的对象权限定类名。
bean.properties配置文件
userMapper = com.example.demo.mapper.impl.UserMapperImpl
userService = com.example.demo.service.impl.UserServiceImpl
工厂类:
package com.example.demo.learning;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 一个创建的Bean(可重复组件)对象工厂
*
* JavaBean: 用java语言编写的可重复组件。
* javabean > 实体类
* 创建service层及dao层对象。
* 第一:需要一个配置文件来配置service和dao
* 配置内容:唯一标识 = 全限定类名(key = value)
* 第二:通过读取配置文件中配置的内容,反射创建对象
* 配置文件可是:xml或者properties
*/
public class BeanFactory {
//定义一个Properties对象
private static Properties props;
//定义一个Map对象,用于存放我们要创建的对象,称之为容器。
private static Map beans;
//使用静态代码块为Properties对象赋值
static {
try {
//实例对象
props = new Properties();
//获取Properties文件的流对象
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
System.out.println(in);
props.load(in);
//实例化容器
beans = new HashMap();
//取出配置文件中的所有key
Enumeration keys = props.keys();
//遍历枚举
while(keys.hasMoreElements()){
//取出每个key
String key = keys.nextElement().toString();
//根据key获取value
String beanPath = props.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入容器
beans.put(key,value);
}
}catch (Exception e){
throw new ExceptionInInitializerError("初始化Properties失败!");
}
}
/**
* 根据bean名称获取对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
service层
package com.example.demo.service;
public interface UserService {
String getUserName();
}
service实现类
package com.example.demo.service.impl;
import com.example.demo.learning.BeanFactory;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public String getUserName() {
UserMapper userMapper = (UserMapper) BeanFactory.getBean("userMapper");
return userMapper.getUserName();
}
}
dao层
package com.example.demo.mapper;
public interface UserMapper {
String getUserName();
}
dao实现层
package com.example.demo.mapper.impl;
import com.example.demo.mapper.UserMapper;
public class UserMapperImpl implements UserMapper {
@Override
public String getUserName() {
return "验证成功!";
}
}
模拟客户端
package com.example.demo.learning;
import com.example.demo.service.UserService;
public class Client {
public static void main(String[] args) {
UserService userService = (UserService) BeanFactory.getBean("userService");
System.out.println(userService.getUserName());
}
}