实践彻底理解IOC思想

Lark ·
更新时间:2024-09-20
· 963 次阅读

Spring IOC(控制反转)

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()); } }
作者:哲哥BLOG



ioc

需要 登录 后方可回复, 如果你还没有账号请 注册新账号