Spring之IOC详解

发布时间 - 2026-01-11 00:15:26    点击率:

学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。本篇我们通过一个实例和大家简单分析一下Spring中IOC的原理,以便我们可以更好的理解Spring。

简单描述一下我们的场景,添加新用户到数据库,这里我们采用分层的方式,进行功能的实现,我们知道,开发程序一定要注意程序的可移植性,所以这里简单为大家介绍一下面向接口编程,面向接口编程就是面向抽象编程、面向规范编程,它带来的最大的好处便是解耦、增强扩展性、屏蔽变化。

好了下面我们开始我的业务实现,首先我们需要创建一个Model--UserDO.java

public class UserDO {
 private String name;
 private String password;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}

有了我们的用户对象,下面我们开始创建Selvect类,Selvect我们知道,使用了接收用户请求的对象,这里因为我们只是为了方便大家理解,所以我们在Selvect中模拟收到用户请求后进行相关业务逻辑处理:

public class UserSelvect {
 public static void main(String[] args) {
  UserDO userDO = new UserDO();
  BeanFactory beanFactory = new ClassPathXmlApplicationContext();//创建我们的Bean工厂
  UserService userService = (UserService) beanFactory.getBean("userService");//通过类名来获得类对象
  userService.add(userDO);//完成业务逻辑
 }
}

一般我们的业务逻辑会放在Service层进行操作,所以我能先来看一下我们的Service对象:

public class UserService {
 private UserDao userDao;//实例DAO对象
 public UserDao getUserDao() {
  return userDao;
 }
 //用于Bean工厂中进行DAO动态绑定
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
 //用于Selvect对象调用,进行业务逻辑处理
 public void add(User u){
  userDao.add(u);
 }
}

下面就是我们的DAO层的实现了,这里就要说明了,为了最大化提高程序的可移植性,接下来将采用接口编程的实现进行设计:

/**
 * DAO类只有方法定义
 * 从而减低程序直接的耦合
 */
public interface UserDao {
 public void add(User u);
}

既然是面向接口编程,就一定需要实现接口的类:

public class UserDaoImpl implements UserDao{
 public void add(User u){
  System.out.println("保存一个学生对象");
 }
}

好了到这里我们的基本框架已经完成,接下来就要开始重点的内容了,首先我们需要先了解一些关于xml解析的知识,在之前的博客中已经为大家介绍了过一种方式:Jdom读取XML文件,不了解的小伙伴可以先移步简单查看一下,这样接下来的内容,你才不至于感到吃力。下面我们进行我们的这个Demo的设计,首先在src目录下添加一个Spring.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
 <bean id="userDao" class="com.manyiaby.daoimpl.UserDaoImpl"></bean>
 <bean id="userService" class="com.manyiaby.service.UserService">
  <property name="userDao" bean="userDao"></property>
 </bean>
</beans>

下面我们定义一个Bean工程对象,用来读取我们的Spring.xml文件,从而完成对象实例的创建,一便接下来的业务操作:

public interface BeanFactory {
 public Object getBean(String className);
}

大家是不是发现我们的Bean工场也是采用接口编程的思想,接下来看一下我们的工场实现类:

public class ClassPathXmlApplicationContext implements BeanFactory{
 private Map<String, Object> beanMap = new HashMap<String, Object>();//用来存配置文件中的类对象
 public ClassPathXmlApplicationContext(){
  try {
   SAXBuilder saxBulder = new SAXBuilder();
   Document doc = saxBulder.build(ClassPathXmlApplicationContext.class
     .getClassLoader().getResourceAsStream("spring.xml"));
   Element root = doc.getRootElement();//获取根元素
   List<Element> list = root.getChildren("bean");
   for (Element element : list) {
    String id = element.getAttributeValue("id");//得到beanId
    String className = element.getAttributeValue("class");//得到Bean的类名地址
    System.out.println(className);
    Object object = Class.forName(className).newInstance();
    beanMap.put(id, object);
    if (null != element.getChild("property")) {
     Element property = element.getChild("property");
     String name = property.getAttributeValue("name");
     String beanId = property.getAttributeValue("bean");
     Object beanObject = beanMap.get(beanId);//UserDaoImpl
     String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);//setUserDao
     System.out.println(methodName);
     Method m = object.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//UserService的SetUserDao()方法,接收的参数为UserDao接口类
     m.invoke(object, beanObject);//调用UserService的SetUserDao()方法,传入UserDaoImpl
    }
   }
  } catch (Exception e) {
   System.out.println("" + e);
  }
 }
 //用于类调用
 @Override
 public Object getBean(String className) {
  return beanMap.get(className);
 }
}

简单为大家介绍一下,我们通过beanMap将我们在Spring中配置的对象,通过反射机制拿到,然后放置于beanMap对象中,通过getBean方法,共外部类调用。

上面简单模拟了一下Spring中IOC的一些内容,下面咱们一起来看一下,如何通过Spring完成上面的操作,首先我们需要下载spring.jar,有了这个jar还不够,spring还依赖commons-logging.jar,好了将这两个jar包导入到我们的工程中,然后我们就来看一下如何实现使用:

public class UserSelvect {
 public void main() {
  UserDO userDO = new UserDO();
  BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
  UserService userService = (UserService) beanFactory.getBean("userService");
  //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
  //UserService userService = (UserService) context.getBean("userService");
  userService.add(userDO);
 }
}

其他不用修改,是不是很简单,好了,关于Spring的内容为大家介绍到这里。

希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# spring  # ioc  # 基于SpringIOC创建对象的四种方式总结  # SpringIOC框架的简单实现步骤  # 详解Spring框架---IOC装配Bean  # Spring(二):Spring通过IOC来创建对象  # Spring框架开发IOC两种创建工厂方法详解  # 好了  # 看一下  # 介绍一下  # 小伙伴  # 是一个  # 放在  # 我们可以  # 这两个  # 我能  # 很简单  # 不了解  # 就来  # 说明了  # 还不够  # 你才  # 学过  # 绑定  # 先来  # 创建一个  # 配置文件 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Session怎么存储_Laravel Session驱动配置详解  专业商城网站制作公司有哪些,pi商城官网是哪个?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  JS去除重复并统计数量的实现方法  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  微信小程序 闭包写法详细介绍  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何在阿里云高效完成企业建站全流程?  如何在局域网内绑定自建网站域名?  如何快速搭建个人网站并优化SEO?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  JavaScript Ajax实现异步通信  进行网站优化必须要坚持的四大原则  香港服务器如何优化才能显著提升网站加载速度?  IOS倒计时设置UIButton标题title的抖动问题  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  java ZXing生成二维码及条码实例分享  javascript读取文本节点方法小结  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel如何优化应用性能?(缓存和优化命令)  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  音响网站制作视频教程,隆霸音响官方网站?  Android okhttputils现在进度显示实例代码  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  高端建站如何打造兼具美学与转化的品牌官网?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何用腾讯建站主机快速创建免费网站?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  网站建设整体流程解析,建站其实很容易!  Android GridView 滑动条设置一直显示状态(推荐)  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在IIS中新建站点并解决端口绑定冲突?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南