仿写简单IOC

目录

TestController类:

UserService类:

 核心代码SpringIOC:

Autowired和Component注解

SpringIOCTest 类 

​编辑

总结:


TestController类:

@Component
public class TestController {@Autowiredprivate UserService userService;public void test(){userService.addUser("我口袋只剩玫瑰一片","此行又山高路远");}
}

UserService类:

@Component
public class UserService {public void addUser(String a,String b){System.out.println(a);System.out.println(b);}
}

 核心代码SpringIOC:

public class SpringIOC {private List<String> beanNames;private List<String> filePaths;private String basePath;private String basePackage;private Map<String, Object> beans =new HashMap<>();/*** 扫描所有的文件信息信息,存到了 filePaths*/private void scan() throws FileNotFoundException {File file = new File(basePath);filePaths = new ArrayList<>();if(file.exists()){Queue<File> queue = new LinkedList<>();queue.add(file);while(!queue.isEmpty()){File poll = queue.poll();if(poll == null){continue;}if(poll.isDirectory()){File[] files = poll.listFiles();for (File f : files) {queue.add(f);}}else {filePaths.add(poll.getPath());}}}else {throw new FileNotFoundException(basePath+" not found");}//将路径中所有的文件打印出来 filePaths.forEach(e-> System.out.println(e));}/*** 讲所有的.java结尾的 全限定名放到 beanNames*/public void  initBeanNames(){for (String s : filePaths) {String replace = s.replace(basePath, "");if(replace.endsWith(".java")) {replace = replace.substring(0, replace.length()-5);}char[] chars = replace.toCharArray();for (int i = 0; i < chars.length; i++) {if(chars[i]=='\\'){chars[i] = '.';}}beanNames.add(basePackage+"."+new String(chars));}beanNames.forEach(System.out::println);}public void initBeans(){for (String beanName : beanNames) {try {Class<?> aClass = Class.forName(beanName);Annotation[] declaredAnnotations = aClass.getDeclaredAnnotations();for (Annotation declaredAnnotation : declaredAnnotations) {if(declaredAnnotation instanceof Component){//反射:Object o = aClass.newInstance();beans.put(aClass.getName(),o);}}} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}for (Map.Entry<String, Object> entry : beans.entrySet()) {Field[] declaredFields = entry.getValue().getClass().getDeclaredFields();for (Field field : declaredFields) {Annotation[] declaredAnnotations = field.getDeclaredAnnotations();for (Annotation annotation : declaredAnnotations) {if(annotation instanceof Autowired){//field 需要由我们来赋值// 我们所持有的所有对象 在beans中// 根据当前域中的类型的名字:反射String name = field.getType().getName();// 从beans 中获得对应的对象Object o = beans.get(name);field.setAccessible(true);try {field.set(entry.getValue(), o);} catch (IllegalAccessException e) {e.printStackTrace();}}}}}}public Object getInstance(String beanName) {return beans.get(beanName);}private void initPath(){basePath="D:\\imitateIOC\\src\\main\\java\\com\\test\\springioc\\";basePackage="com.test.springioc";}public SpringIOC() {initPath();try {scan();} catch (FileNotFoundException e) {e.printStackTrace();}beanNames= new ArrayList<>();initBeanNames();}
}

Autowired和Component注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
}

SpringIOCTest 类 

public class SpringIOCTest {@Testpublic void testIOC() throws FileNotFoundException {//创建IOC容器SpringIOC springIOC = new SpringIOC();//初始化容器springIOC.initBeans();//从容器中获得TestController对象TestController instance = (TestController) springIOC.getInstance(TestController.class.getName());//调用其方法instance.test();}
}

总结:

整个环境可以归纳为两个阶段:

第一阶段:处理字符串,获得到类权限的名

第二阶段:根据类权限名创建对应的对象(带有@Component的类才会创建对应的对象),然后再遍历访问我们创建好的对象,判断所有的域是否带有@Autowired,如果有就从Bean中取出对应的对象设置进去。

通篇我们没有写new TestController,new UserService这种代码,都是由反射创建的对象设置进来,这就是这篇代码的基本逻辑。

源码已上传gitee平台:

https://gitee.com/dont-live-in-the-past/copy-ioc.git


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC简单仿写

之前我分享过SpringMVC的基本原理与配置&#xff08;原文链接&#xff1a;https://blog.csdn.net/L170311/article/details/129339120&#xff09;,为了更深层次的学习&#xff0c;精益求精&#xff0c;手动仿写了一个MVC原理实现demo&#xff0c;一起学习一下吧 结构目录&…

Netty :仿写微信 IM 即时通讯系统

前言 最近公司要自研聊天系统,开始撸代码… 仿微信IM系统简介 (1)客户端使用Netty程序实现逻辑 解析控制台指令(譬如发送消息或者建立群聊等指令)->基于控制台输入创建指令对象->协议的编码(通过自定义二进制协议将指令对象封装成二进制); 接收服务端数据拆包粘包处理…

python如何仿写文章_tensorflow - RNN学习文章的风格去仿写

1 . 能干什么 在知乎&#xff0c;博客上面会看到有人分享自己的一些有意思的项目&#xff0c;比如下面这些&#xff0c;用rnn学习一个诗歌&#xff0c;散文&#xff0c;党章&#xff0c;小说什么的。然后&#xff0c;在自己生成一些东西。比如&#xff0c;下面的这两个例子。作…

html仿写百度,vue 简单仿写百度搜索

vue .grey{ background: #CCC; height: 25px; } ul,li{ margin: 0; padding: 0; list-style-type:none; margin-left: 65px; width: 306px; } .dialog{ margin-left: 10px; margin-top: 30px; width: 300px; height: 25px; } .note{ margin-left: 130px; } window.οnlοadfunc…

html搜狐热搜列表仿写,GRE高分范文不能看过就算 学会仿写才能带来真正提高

可以说所有的写作都是从模仿开始。GRE作文同样不例外。通过参考他人的好文章&#xff0c;学习别人的写法&#xff0c;最后写出自己的文章是非常实用的作文学习方式。不过&#xff0c;模仿也需要讲究方法&#xff0c;单纯模仿并不会让大家有太多的收获。掌握方法才能有效提升自身…

PHP仿写网站,手机网站仿写0910

最近有点儿忙,这个作业交的有点儿晚了,但这个作业是看了老师讲解后一口气写出来的代码,不像以前的作业要反复的看老师的课件才完成的。通过这一段前端知识的学习我最大的收获就是学会用开发者工具去看一个网站的代码了,可以看懂大多数的网页的静态代码了,会逐步的分析一个…

绕过接口参数签名验证

在一些关键业务接口,系统通常会对请求参数进行签名验证,一旦篡改参数服务端就会提示签名校验失败。在黑盒渗透过程中,如果没办法绕过签名校验,那么就无法进一步深入。 微信小程序的前端代码很容易被反编译,一旦签名加密算法和密钥暴漏,找到参数的排序规则,那么就可以篡改…

在Mac电脑中轻松打开终端程序的快捷方法

命令行窗口实际就是我们常用的终端程序&#xff0c;命令行窗口在高级用户上&#xff0c;是经常用到的&#xff0c;但在Mac电脑中打开终端程序是比较麻烦的&#xff0c;下面分享几个快捷方法可以轻松打开终端程序。 方法一、 1、在Mac键盘上按住commandspace&#xff0c; 2、在…

【mac】关于终端上使用的快捷键

【mac】关于终端上使用的快捷键 清理行&#xff1a;您可以使用Ctrl U清理到开头。清理线路&#xff1a;Ctrl E Ctrl U擦拭终端中的当前线路清理线路&#xff1a;Ctrl A Ctrl K擦拭终端中的当前线路取消当前的命令行/行&#xff1a;Ctrl C。调用已删除的命令&#xff1a;Ctrl Y&…

mac之把打开终端设置快捷键为Ctrl+Alt+T

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、在Automator.app中创建一个AppleScript Finder&#xff0d;>应用程序->Automator打开Automator.app&#xff0c;打开Automator后…

【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

ios13快捷指令怎么设置

在ios13系统中新增了很多值得一提的功能&#xff0c;可以帮助更加简单化的使用iphone手机&#xff0c;而在手机上也可以实现喊一句就能帮你进入该功能&#xff0c;那么ios13快捷指令怎么设置呢&#xff1f;下面就为大家带来ios13快捷指令设置方法&#xff0c;想知道的一起来了解…

IOS中通过快捷捷径打开场所码或者健康码

说明 本文标题其实应该叫“使用快捷捷径打开任意微信小程序页面”&#xff0c;因为本质上这篇文章就是说明如何在获取微信小程序任意界面的页面路径&#xff0c;以及通过Universal link在微信中打开对应页面的方法&#xff08;本文使用“跨时空”APP来达到此目的&#xff09;。…

小度送音箱,这是只属于开发者的福利

人工智能&#xff0c;将带给人们一个新的场景和蓝海市场 2019年的第一天&#xff0c;李彦宏以人工智能领域嘉宾的身份做客央视元旦特别节目《放歌新时代》&#xff0c;与主持人康辉一起展开了一场关于人工智能的对话&#xff1a;对话中李彦宏提到&#xff0c;2019年是人工智能全…

7个月后再测「小度在家」,已然超出音箱属性的未来新物种

作者&#xff5c;震霆 出品&#xff5c;遇见人工智能 公众号&#xff5c;GOwithAI 双十一的节奏你感受到了吗&#xff1f; 虽然离正日子还有6天&#xff0c;就连天猫和京东都还没到高潮&#xff0c;百度却抢先截胡&#xff0c;抛出了个大动作。 有这么一款当红明星AI产…

使用小度音箱+Blinker控制ESP01S Relay继电器模块

一. 使用ESP01S模块&#xff0c;PIN脚定义如下&#xff1a; 管脚功能如下&#xff1a; ESP01S模块原理图&#xff1a; ESP01S模块比ESP01模块做了以下优化&#xff1a; LED灯的管脚发生变化&#xff0c;由ESP01的TXD0变成ESP01s的GPIO2引脚&#xff1b;ESP01s模块的IO0、RST、…

小度智能音箱2红外版测评和拆机

小度智能音箱 2 红外版测评和拆机 买的小度智能音箱今天到货了&#xff0c;哈哈。这个版本支持红外&#xff0c;可以控制家里老家电。之前买过的小爱mini&#xff0c;天猫精灵&#xff0c;白色小度音箱1代&#xff0c;现在基本都在吃灰了&#xff0c;卖二手音箱啦&#xff5e;…

用小爱,小度语音控制家里的灯,无网络时,不影响物理开关

贝壳物联和小度&#xff0c;小爱的完美结合 亮点材料接线注册贝壳物联ArduinoIDE 安装程序编写烧录巴法云微信推送巴法云控制设置微信小程序控制设备小度音箱&#xff0c;小爱绑定和语音控制关于内网穿透和程序的在线更新 亮点 0.支持开关状态推送到微信 1.成本不超过20块&…

小度、天猫精灵、华为哪款智能音箱值得推荐?

随着智能家居的势头比较火热&#xff0c;各大智能厂商纷纷开启抓住了智能音箱市场的第一波红利&#xff0c;迅速入场布局分一杯羹。那么今天我们就来聊一聊&#xff0c;市场上有哪些主流的智能音箱品牌&#xff1f; 目前&#xff0c;大部分智能音箱在语音交互和内容播放上都差…