diff --git a/README.md b/README.md index 85ff6588e77cc2a2df81cc03f45495635ca0a5fa..13044c8a7b47bc19b407f95f52331585e65ec335 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # needcoke-ioc +参考文档: https://www.kuangstudy.com/bbs/1438400389824167938 -#### VER-0.2 -1、支持配置文件,.yaml,.yml,.properties后缀的配置文件 -2、并通过@Value注入 -3、优化了ioc容器的加载流程 +使用demo: https://gitee.com/needcoke/needcoke-ioc-demo +#### VER-0.3 +支持无缝集成needcoke-aop #### 介绍 实现类似于Spring的容器管理工具,因为项目中不需要使用很重的Spring,而右希望能够拥有它的IOC,DI @@ -29,7 +29,7 @@ ContextHolder.java 容器 ContextRun.java 容器启动器,只有调用其中的run方法,容器才能够正常启动 #### 安装教程 -下载jar包: https://gitee.com/needcoke/needcoke-ioc/tree/master/jar/VER-0.1 +下载jar包: https://gitee.com/needcoke/needcoke-ioc/tree/master/jar/VER-0.3 下载完成后在IDEA - ProjectSettings - modules中点击+号导入java选择jar包就可以 #### 使用说明 @@ -45,7 +45,6 @@ public class Main { } } ``` - #### 参与贡献 1. Fork 本仓库 diff --git a/jar/VER-0.3/needcoke-ioc.jar b/jar/VER-0.3/needcoke-ioc.jar new file mode 100644 index 0000000000000000000000000000000000000000..65810419395d907e622382024e65b1d3f3871b58 Binary files /dev/null and b/jar/VER-0.3/needcoke-ioc.jar differ diff --git a/pom.xml b/pom.xml index 24712b09caa82c004aef51a31493978b3ab24a26..25ded6ed7233843a56694a3ff649a506c470c652 100644 --- a/pom.xml +++ b/pom.xml @@ -4,9 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - groupId + org.needcoke needcoke-ioc - VER-0.2 + pom + VER-0.3 + 8 @@ -41,4 +43,19 @@ 1.2.57 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + \ No newline at end of file diff --git a/src/main/java/org/needcoke/ioc/ContextRun.java b/src/main/java/org/needcoke/ioc/ContextRun.java index 22f763fada32100f733d0850398c4eb466eed004..6d1754da252080696a0d2b7d2c6a9013bae46326 100644 --- a/src/main/java/org/needcoke/ioc/ContextRun.java +++ b/src/main/java/org/needcoke/ioc/ContextRun.java @@ -2,6 +2,7 @@ package org.needcoke.ioc; import cn.hutool.core.util.StrUtil; import org.needcoke.ioc.annotation.*; +import org.needcoke.ioc.core.ContextBean; import org.needcoke.ioc.core.ContextHolder; import org.needcoke.ioc.handle.*; import org.needcoke.ioc.util.PackageUtil; @@ -15,6 +16,11 @@ public class ContextRun { public static ContextHolder run(Class t, String[] args) { ContextHolder holder = new ContextHolder(); + ContextBean bean = new ContextBean() + .setName("needCokeContext") + .setClz(holder.getClass()) + .setValue(holder); + holder.putBean(bean); BeanScanner annotation = t.getAnnotation(BeanScanner.class); if (null != annotation) { Set> clzFromPkg = new HashSet<>(); @@ -32,6 +38,8 @@ public class ContextRun { Handle beanInjectHandle = null; /* component调用初始化方法 */ Handle componentInitHandle = null; + + List otherHandles = new ArrayList<>(); for (Class aClass : clzFromPkg) { for (Type genericInterface : aClass.getGenericInterfaces()) { if (genericInterface.getTypeName().equals(Handle.class.getTypeName())) { @@ -46,13 +54,15 @@ public class ContextRun { beanInjectHandle = handle; } else if (handle instanceof ComponentInitHandle) { componentInitHandle = handle; + }else{ + otherHandles.add(handle); } } } Map configMap = new HashMap<>(); Object component = null; Component annotationComponent = aClass.getAnnotation(Component.class); - if (null != annotationComponent) { + if (null != annotationComponent && annotationComponent.inject()) { component = ReflectUtil.getBean(aClass); holder.componentBuffer.put(aClass, component); holder.componentNameBuffer.put(aClass, StrUtil.isNotBlank(annotationComponent.name()) ? @@ -103,6 +113,9 @@ public class ContextRun { beanScanHandle.handle(holder); beanInjectHandle.handle(holder); componentInitHandle.handle(holder); + for (Handle otherHandle : otherHandles) { + otherHandle.handle(holder); + } } return holder; } diff --git a/src/main/java/org/needcoke/ioc/annotation/Component.java b/src/main/java/org/needcoke/ioc/annotation/Component.java index a6e815ff4b494b58baf8fa1bd1e123f61395d179..b0686d518191bc662a2f4086a7df75ce5ea9b67c 100644 --- a/src/main/java/org/needcoke/ioc/annotation/Component.java +++ b/src/main/java/org/needcoke/ioc/annotation/Component.java @@ -8,4 +8,6 @@ import java.lang.annotation.*; public @interface Component { @Note("名称") String name() default ""; + + boolean inject() default true; } diff --git a/src/main/java/org/needcoke/ioc/core/ContextBean.java b/src/main/java/org/needcoke/ioc/core/ContextBean.java index 22e580fc6303914d74c63aad00bb6921561bce14..da83d57034e02fe16819f619895b7db59dd8d918 100644 --- a/src/main/java/org/needcoke/ioc/core/ContextBean.java +++ b/src/main/java/org/needcoke/ioc/core/ContextBean.java @@ -18,6 +18,9 @@ public class ContextBean { public String id; + /* 是否是代理的 */ + public Boolean proxy; + public E getValue(){ return (E) value; } diff --git a/src/main/java/org/needcoke/ioc/core/ContextHolder.java b/src/main/java/org/needcoke/ioc/core/ContextHolder.java index 133a4522bf8991f4b2c78629aeb5319d7f97bcc3..7d31160b229fee66afe4915f6be862fbb22b2876 100644 --- a/src/main/java/org/needcoke/ioc/core/ContextHolder.java +++ b/src/main/java/org/needcoke/ioc/core/ContextHolder.java @@ -1,6 +1,7 @@ package org.needcoke.ioc.core; import cn.hutool.core.util.StrUtil; +import org.needcoke.ioc.annotation.Component; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -17,7 +18,8 @@ import java.util.concurrent.atomic.AtomicLong; * @author Gilgamesh * @since VER-0.1 **/ -public class ContextHolder { +@Component(inject = false) +public class ContextHolder implements NeedCokeContext { /** * id计数器 @@ -29,6 +31,11 @@ public class ContextHolder { **/ public Map, Object> componentMap = new ConcurrentHashMap<>(); + /** + * 代理component的bean池 + **/ + public Map, ContextBean> proxyComponentMap = new ConcurrentHashMap<>(); + /** * ioc容器的id索引 **/ @@ -38,43 +45,53 @@ public class ContextHolder { **/ public Map nameBeanContext = new ConcurrentHashMap<>(); + public Map> fullNameBeanContext = new ConcurrentHashMap<>(); + /** * ioc容器的类型索引 **/ public Map, List> typeBeanContext = new ConcurrentHashMap<>(); /** - * properties配置文件缓冲区 - **/ - public Map propertiesBuffer = new HashMap<>(); + * properties配置文件缓冲区 + **/ + public Map propertiesBuffer = new HashMap<>(); /** - * component缓冲区 - **/ - public Map,Object> componentBuffer = new HashMap<>(); + * component缓冲区 + **/ + public Map, Object> componentBuffer = new HashMap<>(); - public Map,String> componentNameBuffer = new HashMap<>(); + public Map, String> componentNameBuffer = new HashMap<>(); /** - * 函数缓存@Bean - **/ - public Map, Map> beanMethodBuffer = new HashMap<>(); + * 函数缓存@Bean + **/ + public Map, Map> beanMethodBuffer = new HashMap<>(); /** - * 函数缓冲@init - **/ - public Map,Method> initMethodBuffer = new HashMap<>(); + * 函数缓冲@init + **/ + public Map, Method> initMethodBuffer = new HashMap<>(); /** - * Autowired 标记的字段 - **/ + * Autowired 标记的字段 + **/ public Map, List> needInjectBeanField = new HashMap<>(); - public Map,Map> needInjectConfigField = new HashMap<>(); + public Map, Map> needInjectConfigField = new HashMap<>(); public List getBean(Class type) { List ts = new ArrayList<>(); + if (!typeBeanContext.containsKey(type)) { + for (ContextBean value : idBeanMap.values()) { + if (type.isInstance(value.value)) { + ts.add((T) value.value); + } + } + return ts; + } List contextBeans = typeBeanContext.get(type); for (ContextBean contextBean : contextBeans) { ts.add((T) contextBean.value); @@ -113,6 +130,12 @@ public class ContextHolder { } idBeanMap.put(bean.id, bean); } + if(bean.clz != null){ + if(!fullNameBeanContext.containsKey(bean.clz.getName())){ + fullNameBeanContext.put(bean.clz.getName(),new ArrayList<>()); + } + fullNameBeanContext.get(bean.clz.getName()).add(bean); + } } /** @@ -127,4 +150,5 @@ public class ContextHolder { putBean(bean); } + } diff --git a/src/main/java/org/needcoke/ioc/core/NeedCokeContext.java b/src/main/java/org/needcoke/ioc/core/NeedCokeContext.java new file mode 100644 index 0000000000000000000000000000000000000000..a22008edea0cfc16a89d0dad83226e698ce6b576 --- /dev/null +++ b/src/main/java/org/needcoke/ioc/core/NeedCokeContext.java @@ -0,0 +1,4 @@ +package org.needcoke.ioc.core; + +public interface NeedCokeContext { +}