手寫簡單 ioc 框架
阿新 • • 發佈:2018-11-19
一套 “想當然” 的 IOC 框架
1 緣起
一直對 java 的自定義註解 還有 spring 的 ioc 理解不深刻, 所以打算實現一個簡單的 ioc 目的是用於學習 自定義註解 和 反射。
2 實現後的效果
2.1 配置 bean
package org.ioc.config;
import org.ioc.annotation.Bean;
import org.ioc.annotation.Config;
import org.ioc.pojo.SqlServerJdbcConfig;
/**
* @Author: huangwenjun
* @Description:
* @Date: Created in 17:03 2018/4/4
**/
@Config
public class DemoConfig {
@Bean
public SqlServerJdbcConfig getSqlServerJdbcConfig() {
return new SqlServerJdbcConfig("root", "123", "url...", "driver...");
}
}
2.2 獲取 beanMap
(beanMap中含有 上面配置的例項)
public static void main(String[] args) throws Exception {
System.out.println(ApplicationContext.getBeanMap());
}
3 思路
// 指定掃包路徑
// 獲取 config 註解的類
// 獲取 bean 註解方法, 並且執行放入 beanMap 中
// 呼叫方法獲取例項
4 包結構圖
org.ioc
-- annotation
-- Bean
-- Config
-- config
-- DemoConfig
-- pojo
-- SqlserverJdbcConfig
-- util
ClassUtil
ReflectionUtil
StringUtil
ApplicaitonContext
5 核心 code
package org.ioc;
import org.ioc.annotation.Bean;
import org.ioc.annotation.Config;
import org.ioc.util.ClassUtil;
import org.ioc.util.ReflectionUtil;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author: huangwenjun
* @Description:
* @Date: Created in 17:00 2018/4/4
**/
public class ApplicationContext {
private static ConcurrentHashMap<String, Object> beanMap = new ConcurrentHashMap<>();
static {
initConfigBeanMap();
}
/**
* 初始化 容器
*/
public static void initConfigBeanMap() {
try {
Set<Class<?>> classSet = ClassUtil.getClassSet("org.ioc.config");
for (Class clazz : classSet) {
if (clazz.isAnnotationPresent(Config.class)) {
Object beanConfig = ReflectionUtil.newInstance(clazz);
// 判斷是否是配置類
Method[] methods = clazz.getMethods();
for(Method method : methods) {
if (method.isAnnotationPresent(Bean.class)) {
// 判斷是否是 獲取 bean 的方法
Object bean = ReflectionUtil.invokeMethod(beanConfig, method, null);
if (bean != null) {
beanMap.put(method.getName(), bean);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static ConcurrentHashMap<String, Object> getBeanMap() {
return beanMap;
}
public static void main(String[] args) throws Exception {
// 指定掃包路徑
// 獲取 config 註解的類
// 獲取 bean 註解方法, 並且執行放入 beanMap 中
// 呼叫方法獲取例項
System.out.println(ApplicationContext.getBeanMap());
}
}