Spring boot实现一个简单的ioc(1)

发布时间 - 2026-01-11 00:53:04    点击率:

前言

跳过废话,直接看正文

之前参与开发的几个spring的项目,用的版本都3.x, 最近忽然发现spring 5 都快上线了,于是赶紧去关注了下spring的最新动态。发现了spring-boot这个好东西(终于可以从各种错综复杂的xml配置文件中解放出来了!)。

在学习了目前最新的1.5.2.RELEASE版spring-boot官方文档之后,我决定仿照spring-boot的项目结构以及部分注解,写一个简单的ioc容器,一方面为了加深自己对ioc的理解,另一方面也为了以后在开发一些个人项目需要简单的使用一些自动装配功能时,可以直接使用这个ioc容器,而不用引入庞大的spring。

正文

在写正式代码之前,先写好测试代码,看看用这个ioc具体该做什么。

测试项目结构

sample 

     SampleApplication.java
     runner
         SampleApplicationRunner.java

    model
        BeanA.java
        BeanB.java
        BeanC.java

SampleApplication

作用

项目的启动入口。

代码

import com.clayoverwind.simpleioc.boot.SimpleIocBootApplication;
import com.clayoverwind.simpleioc.boot.SimpleIocApplication;

@SimpleIocBootApplication
public class SampleApplication{

 public static void main(String[] args) {
  SimpleIocApplication.run(SampleApplication.class, args);
 }
}

说明

这个启动模式是照搬了spring-boot的启动模式,将启动任务委托给SimpleIocApplication来完成。ioc容器将根据注解@SimpleIocBootApplication的相关配置自动扫描相应的package,生成beans并完成自动装配。(如果没有配置,默认扫描SampleApplication所在的package及其子package)

SampleApplicationRunner

作用

ioc容器启动的监听类, 这个类实现了SimpleIocApplicationRunner。因此,在ioc容器自动装配完成后,将自动调用SampleApplicationRunner中的run方法。

代码

import com.clayoverwind.simpleioc.boot.SimpleIocApplicationRunner;
import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleBean;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;
import com.clayoverwind.simpleioc.sample.model.BeanA;
import com.clayoverwind.simpleioc.sample.model.BeanB;
import com.clayoverwind.simpleioc.sample.model.BeanC;

@SimpleComponent
public class SampleApplicationRunner implements SimpleIocApplicationRunner {

 @SimpleAutowired
 private BeanA beanA;

 @SimpleAutowired
 private BeanB beanB;

 @SimpleAutowired("beanC1")
 private BeanC beanC1;

 @SimpleAutowired("beanC2")
 private BeanC beanC2;

 @Override
 public void run(String[] args) throws Exception {
  beanA.print();
  beanB.print();
  System.out.println(beanC1.toString());
  System.out.println(beanC2.toString());
 }

 @SimpleBean("beanC1")
 private BeanC createBeanC1() {
  return new BeanC("I am bean c1!");
 }

 @SimpleBean("beanC2")
 private BeanC createBeanC2() {
  return new BeanC("I am bean c2!");
 }
}

说明

SimpleIocApplicationRunner 参考了Spring-boot中的ApplicationRunner。
@SimpleComponent作用于类,对应spring中的@Component
@SimpleAutowired只能作用于字段(实现相对简单),组合了spring中的@Autowired以及Qualifier的功能
@SimpleBean作用于方法,根据方法返回值来生成一个bean,对应spring中的@Bean

BeanA

说明

一个简单的bean。

代码

import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;

@SimpleComponent
public class BeanA {
 private String content;

 @SimpleAutowired
 private BeanB beanB;

 public BeanA(){}

 public BeanA(String content) {
  this.content = content;
 }

 public void print() {
  System.out.printf("[BeanA].beanB = %s\n", beanB.toString());
 }
}

BeanB

说明

一个简单的bean。在这里可以看到,BeanA依赖BeanB,而BeanB也依赖BeanA,这就产生了一种依赖循环。这种依赖循环比较常见,因此ioc容器要能够解决这种问题。

代码

import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;

@SimpleComponent
public class BeanB {
 private String content;

 @SimpleAutowired
 private BeanA beanA;

 public BeanB(){}

 public BeanB(String content) {
  this.content = content;
 }

 public void print() {
  System.out.printf("[BeanB].beanA = %s\n", beanA.toString());
 }
}

BeanC

说明

BeanC并没有加@SimpleComponent,因此ioc容器不会自动为该类生成一个bean。这个类的主要是用来测试@Bean
(见SampleApplicationRunner 中的createBeanC1()和createBeanC2())。

代码

public class BeanC {
 private String content;

 public BeanC(String content) {
  this.content = content;
 }

 @Override
 public String toString() {
  return "BeanC.content = " + content;
 }

}


后记

有了测试代码,接下来便要开始实现这个简单的ioc容器,详见下一篇博客。
完整代码参考:https://github.com/clayandgithub/simple-ioc。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Spring  # boot  # ioc  # Spring boot实现一个简单的ioc(2)  # Spring Boot如何动态创建Bean示例代码  # JSP 开发之Spring Boot 动态创建Bean  # Spring boot将配置属性注入到bean类中  # 详解Spring Boot 使用Java代码创建Bean并注册到Spring中  # 关于SpringBoot获取IOC容器中注入的Bean(推荐)  # 作用于  # 几个  # 在这里  # 这就  # 如果没有  # 可以看到  # 可以直接  # 错综复杂  # 下一篇  # 来完成  # 便要  # 使用这个  # 跳过  # 写好  # 配置文件  # 大家多多  # 搬了  # 其子  # 返回值  # 该做什么 


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


相关推荐: Swift中循环语句中的转移语句 break 和 continue  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在云主机快速搭建网站站点?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  如何用IIS7快速搭建并优化网站站点?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  无锡营销型网站制作公司,无锡网选车牌流程?  如何用PHP工具快速搭建高效网站?  黑客入侵网站服务器的常见手法有哪些?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  深圳网站制作的公司有哪些,dido官方网站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何基于PHP生成高效IDC网络公司建站源码?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何实现建站之星域名转发设置?  Laravel如何实现多对多模型关联?(Eloquent教程)  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  免费网站制作appp,免费制作app哪个平台好?  HTML 中动态设置元素 name 属性的正确语法详解  Bootstrap CSS布局之列表  JS碰撞运动实现方法详解  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Bootstrap整体框架之CSS12栅格系统  IOS倒计时设置UIButton标题title的抖动问题  Laravel安装步骤详细教程_Laravel环境搭建指南  如何快速启动建站代理加盟业务?  jQuery中的100个技巧汇总  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何在阿里云购买域名并搭建网站?  bootstrap日历插件datetimepicker使用方法  Swift中switch语句区间和元组模式匹配  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何在阿里云服务器自主搭建网站?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  重庆市网站制作公司,重庆招聘网站哪个好?  如何在腾讯云服务器上快速搭建个人网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel如何生成和使用数据填充?(Seeder和Factory示例)