跟我猜Spring-Boot:bean的创建

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

跟我猜Spring-Boot:bean的创建

葛云飞   2020-03-05 我要评论
## 废话在前 最近几年的技术路子很杂,先是node,然后是php,后来是openresty,再后来转到了java,而接触的框架(Framework),也越发的复杂,从最开始的express/koa,到lumen ,再到spring全家桶,各种切换,也确实一度头疼; 一般而言,学习一种技术下的某种框架当然是去读源码,但开源项目动辙几万十几万行,尤其我又是个懒人,实在是没办法分析了解。于是,我选择了另一种方式,即在使用框架过程中去“猜想“,即去思考他应该去怎么实验的; 其实,不停的猜想,然后写小demo去实现,再到框架源码中针对性的找到机制去阅读,也不失为一种乐趣。 出于这种思维,我在工作中不停的接触过往同事的源码,再从源码中学习到spring各种特性的用法,再去猜想,实现,查看代码去验证,也确实为工作添了些许乐趣。出于这种目的,想把自己这些的猜想做一些整理,与大家分享。z 本系列的文章预谋好久,然而一直不知道该如何开始,不如写一篇算一篇。在这些文章中,我将先去写一个spring的应用特性,然后靠“猜想“去将背后的特性实现出来。 那么本篇,从最基本的入口程序开始吧。 从这个入口程序,我们将看到一个spring bean创建的简单机制。 ## 目标 在本篇文章中,我们要实现一个spring的入口程序,即: **App.java** ```java package com.github.yfge.miniapp; import com.github.yfge.miniboot.autoconfigure.BootApplication; import com.github.yfge.miniboot.autoconfigure.Application; @BootApplication(Name = "Hello") public class App { public static void main(String[] args) { Application.run(com.github.yfge.miniapp.App.class); } } ``` 同时,定义一个简单的`controller`和`service`: **SimpleController.java** ```java package com.github.yfge.miniapp; import com.github.yfge.miniboot.autoconfigure.Autowired; import com.github.yfge.miniboot.autoconfigure.Service; @Service public class SimpleController { @Autowired private SimpleService simpleService; public SimpleController(){ System.out.println("the controller is created!"); } } ``` **SimpleService.java** ```java package com.github.yfge.miniapp; import com.github.yfge.miniboot.autoconfigure.Service; @Service public class SimpleService { public SimpleService(){ System.out.println("the service is created!"); } } ``` 即我们要通过这个入口程序的运行,看到`service`和`controller`被**自动**的创建。 通过这三个文件的import也看到了,**我们没有引用spring-boot**,而是自己写了一些简单的类引用进来,来**模拟**spring-boot 在这种情况下,我们整个项目很自然分成两个module: * mini-app,用来模拟我们的应用 * mini-boot,用来模拟spring-boot框架 ## bean创建的需求分析 > sorry 我实在想不来有什么比需求分析更适合这节标题 :) 如果我们要达到上述的目标,那我们的小框架应该实现如下的功能: 1. 定义相应的annotation 2. 自动扫描相应的类 3. 如果类被标明是service,那么它应该被自动创建 那么下面,就按这三步来实现我们的目标。 ## step 1 定义相应的anotation 从我们的目标程序,可以看到,我们需要有`BootApplication`和`Service`两个annotation 既然没有引用spring-boot,那么只能自己动手了 这里为了与spring-boot对齐 (因为我们是模拟么),直接照搬命名空间和类名。 **BootApplication.java** ```java package com.github.yfge.miniboot.autoconfigure; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface BootApplication { String Value() default ""; String Name() default ""; } ``` **Service.java** ```java package com.github.yfge.miniboot.autoconfigure; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Service { String value() default ""; } ``` 这里要注意一点,**@Retention(RetentionPolicy.RUNTIME)** 这个注解非常重要,因为只有定义为运行时,我们在程序运行的时候才有可能被扫描到。 ## Step3 实现包的类扫描 关于包的类扫描,网上可以到到N种实现,这里不表述了,直接copy一个现成的 (是的,我们都是代码的搬运工

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们