package com.hand.bean;
import com.hand.MyLog;
import com.hand.anno.Bean;
import com.hand.anno.Di;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class AnnoApplicationContext implements ApplicationContext {
private String rootPath = null;
private Map<Class, Object> beanFactory = new HashMap<>();
@Override
public Object getBean(Class clazz) {
return beanFactory.get(clazz);
}
public AnnoApplicationContext(String packageStr) {
try {
String packagePath = packageStr.replaceAll("\\.", "\\\\");
Enumeration<URL> resources = Thread.currentThread().getContextClassLoader().getResources(packagePath);
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
String filePath = URLDecoder.decode(url.getFile(), "utf-8");
// MyLog.logger.info(filePath);
rootPath = filePath.substring(0, filePath.length() - packagePath.length());
loadBean(new File(filePath));
}
} catch (Exception e) {
e.printStackTrace();
}
loadDi();
}
/**
* 对象加入容器
*/
private void loadBean(File file) throws Exception {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
if (childFiles == null || childFiles.length == 0) {
return;
}
for (File childFile : childFiles) {
if (childFile.isDirectory()) {
loadBean(childFile);
continue;
}
String pathWhitClass = childFile.getAbsolutePath().substring(rootPath.length() - 1);
if (!pathWhitClass.contains(".class")) {
continue;
}
String allName = pathWhitClass.replaceAll("\\\\", ".").replace(".class", "");
MyLog.logger.info("类:" + allName);
Class<?> clazz = Class.forName(allName);
if (clazz.isInterface()) {
continue;
}
Bean bean = clazz.getAnnotation(Bean.class);
if (bean != null) {
Object instance = clazz.getConstructor().newInstance();
if (clazz.getInterfaces().length > 0) {
beanFactory.put(clazz.getInterfaces()[0], instance);
} else {
beanFactory.put(clazz, instance);
}
}
}
}
}
/**
* 依赖注入
*/
private void loadDi() {
for (Object obj : beanFactory.values()) {
Class<?> clazz = obj.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
Di di = field.getAnnotation(Di.class);
if (di == null) {
continue;
}
field.setAccessible(true);
try {
field.set(obj, beanFactory.get(field.getType()));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
手写IOC项目,学习理解Spring IOC原理
共22个文件
java:13个
xml:7个
iml:1个
需积分: 0 0 下载量 90 浏览量
2023-09-21
22:10:41
上传
评论
收藏 15KB ZIP 举报
温馨提示
我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,必须掌握反射的实践方法。Java反射机制是在运行状态中,对于任意类,都能够知道这个类的属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的方式称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。想要解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关应用程序接口(1)`java.lang.Class`(2)`java.lang.reflect`,所以,Class对象是反射的根源。 IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。
资源推荐
资源详情
资源评论
收起资源包目录
ioc.zip (22个子文件)
ioc
pom.xml 991B
src
test
java
log
TestMyLog.java 432B
main
resources
logback.xml 576B
java
com
hand
MyLog.java 202B
reflex
user
UserTest.java 3KB
User.java 818B
Ioc.java 378B
dao
UserDao.java 73B
impl
UserDaoImpl.java 261B
anno
Di.java 285B
Bean.java 286B
service
UserService.java 81B
impl
UserServiceImpl.java 408B
bean
AnnoApplicationContext.java 3KB
ApplicationContext.java 102B
.idea
jarRepositories.xml 880B
uiDesigner.xml 9KB
workspace.xml 9KB
misc.xml 538B
compiler.xml 536B
.gitignore 184B
ioc.iml 81B
共 22 条
- 1
资源评论
逍遥Sean
- 粉丝: 257
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功