类Spring IoC容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介:

在构建Tiny框架之初,想着是不是不要强依赖Spring?于是就写了一个类Spring的依赖注入容器,基本实现了Spring的依赖注入部分的功能,工作情况也良好,配置规范也是采用的Spring的规范。在前面一直是没有问题的,但是在做数据库业务的时候,出现问题了。做数据库,必须要考虑事务问题,而当时我的设计目标是对各种开源的ORMapping方案都不拒绝,这个时候就引入一个问题,要么自己再实现一套AOP,要么就复用Spring。当时预想的另外一个方案是核心框架采用非直接依赖Spring的方案,数据库相关的采用Spring依赖的方式。但是实际上,业务层面的Bean会依赖系统层面的Bean,这又涉及到两个容器之间的协作,这个时候,我意识到,是应该做一个取舍了。

所以果断放弃自己来做IOC和AOP方面的工作,而采用强依赖Spring来实现的方案,毕竟在现在的应用场景下,拒绝Spring就等于让别人拒绝自己。

但是,不管怎么样,在实现这个容器的过程中,还是让我对依赖注入方面有了更深的了解,因此,这两天的投入还是值得的。

下面展示一下,它实现的功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<beans>
     <bean id= "user" name= "user,user1,user2" scope= "singleton"
         class = "org.tinygroup.factory.config.User" >
         <property name= "name" >
             <value>aa</value>
         </property>
         <property name= "age" >
             <value> 12 </value>
         </property>
         <property name= "cat" >
             <ref id= "cat" />
         </property>
         <property name= "cats" >
             <list>
                 <ref id= "cat" />
             </list>
         </property>
         <property name= "catSet" >
             <list>
                 <ref id= "cat" />
             </list>
         </property>
         <property name= "catMap" >
             <map>
                 <entry key= "aa" value-ref= "cat" ></entry>
             </map>
         </property>
     </bean>
     <bean id= "cat" scope= "singleton" class = "org.tinygroup.factory.config.Cat" />
     <bean id= "cat1" scope= "prototype" class = "org.tinygroup.factory.config.Cat" />
     <bean id= "aaa1" scope= "singleton" class = "org.tinygroup.factory.config.Aaa" >
         <property name= "name" >
             <value>aaa1</value>
         </property>
     </bean>
     <bean id= "aaa" scope= "singleton" class = "org.tinygroup.factory.config.Aaa" >
         <property name= "name" >
             <value>aaa</value>
         </property>
     </bean>
     <bean id= "bbb" scope= "singleton" class = "org.tinygroup.factory.config.Bbb"
         autowire= "byType" />
     <bean id= "ccc" scope= "singleton" class = "org.tinygroup.factory.config.Ccc"
         autowire= "byName" />
     <bean id= "user2" name= "user,user1,user2" scope= "prototype"
         class = "org.tinygroup.factory.config.User" >
         <property name= "name" >
             <value>aa1</value>
         </property>
         <property name= "age" >
             <value> 121 </value>
         </property>
         <property name= "cat" >
             <ref id= "cat1" />
         </property>
     </bean>
</beans>
可以看到,配置与Spring是兼容的。

下面是一些测试用例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<span></span> public void testAutoAssemble() {
  assertNotNull(factory.getBean( "aaa" ));
  Bbb bbb = factory.getBean( "bbb" );
  assertEquals( "aaa" , bbb.getAaa().getName());
  bbb = factory.getBean( "bbb" );
  assertEquals( "aaa" , bbb.getAaa().getName());
  Ccc ccc = factory.getBean( "ccc" );
  assertEquals( "aaa1" , ccc.getAaa1().getName());
  ccc = factory.getBean( "ccc" );
  assertEquals( "aaa1" , ccc.getAaa1().getName());
  }
 
 
  public void testInitComparePrototype() {
  Cat cat = factory.getBean( "cat1" );
  Cat cat1 = factory.getBean( "cat1" );
  assertEquals( false , cat == cat1);
  }
 
 
  public void testInitComparePrototype1() {
  User user = factory.getBean( "user2" );
  User user2 = factory.getBean( "user2" );
  assertEquals( false , user == user2);
  assertEquals( false , user.getCatMap() == user2.getCat());
  }
小结:确实,现在要脱离Spring自己再实现一个容器,越来越不合适了,毕竟Spring的用户群在那里,大家都已经熟悉适用的东西,不管是从学习成本各方面都不会选择一个新东西。

OK,虽然是一个失败的实践,但是自己实现与看Spring源码的差别还是有的,就当是一次学习吧。当然,如果是在嵌入式系统或者受限制使用的环境中,只想使用IoC,还是有用处的,毕竟 20K大小的容量还是相当诱人的。

相关文章
|
23天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
14天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
28 0
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
32 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
67 0
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
48 0
|
XML 前端开发 Java
Spring 最常用的 7 大类注解,史上最强整理!
随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
167 2
|
13天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
26 2
 SpringBoot入门(7)- 配置热部署devtools工具
下一篇
无影云桌面