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


相关推荐: 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  JavaScript中的标签模板是什么_它如何扩展字符串功能  Java类加载基本过程详细介绍  iOS中将个别页面强制横屏其他页面竖屏  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  浅析上传头像示例及其注意事项  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  Android滚轮选择时间控件使用详解  网站制作软件有哪些,制图软件有哪些?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在香港免费服务器上快速搭建网站?  如何在IIS管理器中快速创建并配置网站?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  PHP正则匹配日期和时间(时间戳转换)的实例代码  使用豆包 AI 辅助进行简单网页 HTML 结构设计  微信小程序 wx.uploadFile无法上传解决办法  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Laravel如何处理CORS跨域请求?(配置示例)  如何解决hover在ie6中的兼容性问题  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何快速查询网址的建站时间与历史轨迹?  重庆市网站制作公司,重庆招聘网站哪个好?  香港服务器WordPress建站指南:SEO优化与高效部署策略  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  成都网站制作公司哪家好,四川省职工服务网是做什么用?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何使用Collections进行数据处理?(实用方法示例)  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何快速生成凡客建站的专业级图册?  Laravel中的Facade(门面)到底是什么原理  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  轻松掌握MySQL函数中的last_insert_id()  Swift中swift中的switch 语句  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  C++用Dijkstra(迪杰斯特拉)算法求最短路径  JS弹性运动实现方法分析  大连 网站制作,大连天途有线官网?