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 {
+}