今日份学习: Spring - 事实标准
2024-10-21 09:31:38
笔记
Spring IOC
Inverse of Control:控制反转
DI:Dependancy Injections:依赖注入
没有IOC的时候,各种依赖需要逐个按顺序创建。
有了IOC的之后,只要告诉那个依赖那个就可以了,容器会自动装配好依赖
手写一个IOC容器
public class MyIoCContainer {
// 实现一个简单的IoC容器,使得:
// 1. 从beans.properties里加载bean定义
// 2. 自动扫描bean中的@Autowired注解并完成依赖注入
public static void main(String[] args) {
MyIoCContainer container = new MyIoCContainer();
container.start();
OrderService orderService = (OrderService) container.getBean("orderService");
orderService.createOrder();
}
private static Map<String, Object> beans = new HashMap<>();
// 启动该容器
public void start() {
Properties properties = new Properties();
try {
properties.load(MyIoCContainer.class.getResourceAsStream("/beans.properties"));
properties.forEach((beanName, beanClass) -> {
try {
Class<?> klass = Class.forName(String.valueOf(beanClass));
Object beanInstance = klass.getConstructor().newInstance();
beans.put(String.valueOf(beanName), beanInstance);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
beans.forEach((beanName, beanInstance) -> dependencyInject(beanName, beanInstance, beans));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 从容器中获取一个bean
public Object getBean(String beanName) {
return beans.get(beanName);
}
private static void dependencyInject(String beanName, Object beanInstance, Map<String, Object> beans) {
List<Field> fieldsToBeAutowired = Stream.of(beanInstance.getClass().getDeclaredFields())
.filter(field -> field.getAnnotation(Autowired.class) != null)
.collect(Collectors.toList());
fieldsToBeAutowired.forEach(field -> {
try {
String fieldName = field.getName();
Object dependencyBeanInstance = beans.get(fieldName);
field.setAccessible(true); //打破封装性,访问私有成员方法或变量
field.set(beanInstance, dependencyBeanInstance);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
});
}
}
最新文章
- JS正则表达式元字符
- WPF强制更新
- HTML5游戏设计与开发 小白7-9月的动态
- NSUrl的打印
- JS宝典
- 实用图像处理入门 - 2 - Windows平台下编译openCV
- The Reflection And Amplification Attacks &;&; NTP Reply Flood Attack Based On NTP
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页Portal界面拖拽(Ⅵ)
- HDU 1247
- Jexus下配置多个站点
- 一行JavaScript代码获取页面中的所有超链接地址
- SPSS Modeler数据挖掘项目实战(数据挖掘、建模技术)
- 先学习Oracle 11g的Automatic Diagnostic Repository新功能
- Javascript正则表达式完全学习手册
- MFC教程
- MySQL优化 - 索引优化
- 16.C++-初探标准库
- SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
- MS SQMServer2008R2 连接不到远程服务的解决办法
- Docker基础-搭建本地私有仓库