bean容器实现重写,原逻辑删除.

This commit is contained in:
aoshiguchen
2022-07-06 13:44:52 +08:00
parent d7c3551b5c
commit 143bc79d0e
32 changed files with 164 additions and 881 deletions
@@ -33,7 +33,7 @@ import java.lang.annotation.Target;
* @date: 2022/6/16
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Lazy {
boolean value() default true;
}
@@ -21,14 +21,12 @@
*/
package fun.asgc.neutrino.core.bean;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.context.LifeCycle;
import fun.asgc.neutrino.core.context.LifeCycleManager;
import fun.asgc.neutrino.core.context.LifeCycleStatus;
import fun.asgc.neutrino.core.exception.BeanException;
import fun.asgc.neutrino.core.util.Assert;
import fun.asgc.neutrino.core.util.CollectionUtil;
import fun.asgc.neutrino.core.util.LockUtil;
import fun.asgc.neutrino.core.util.TypeUtil;
import fun.asgc.neutrino.core.util.*;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
@@ -53,10 +51,6 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
* bean缓存
*/
protected Map<BeanIdentity, BeanWrapper> beanCache;
/**
* 工厂bean缓存
*/
protected Map<BeanIdentity, BeanWrapper> factoryBeanCache;
/**
* 互斥锁
*/
@@ -78,7 +72,6 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
Assert.notNull(name, "工厂名称不能为空");
this.parent = parent;
this.beanCache = new ConcurrentHashMap<>(256);
this.factoryBeanCache = new ConcurrentHashMap<>(256);
this.name = name;
if (null == parent) {
this.mutex = new Object();
@@ -146,6 +139,11 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
return res || doHasBean(type, name);
}
@Override
public boolean hasBean(Class<?> type) {
return hasBean(type, ClassUtil.getBeanName(type));
}
@Override
public int countBean(String name) {
int count = (null != parent) ? parent.countBean(name) : 0;
@@ -190,7 +188,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
@Override
public void registerBean(Class<?> type) throws BeanException {
registerBean(type, TypeUtil.getDefaultVariableName(type));
registerBean(type, ClassUtil.getBeanName(type));
}
@Override
@@ -206,20 +204,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
private <T> T doGetBean(String name, Object... args) throws BeanException {
List<BeanWrapper> beanList = findBeanList(name);
if (CollectionUtil.isEmpty(beanList)) {
// TODO check
List<BeanWrapper> factoryBeanWrapperList = findFactoryBeanListByName(name);
if (CollectionUtil.isEmpty(factoryBeanWrapperList)) {
return null;
} else if (factoryBeanWrapperList.size() > 1) {
throw new BeanException(String.format("Bean[name:%s] 存在多个实例!", name));
}
BeanWrapper factoryBeanWrapper = factoryBeanWrapperList.get(0);
dependencyCheck(factoryBeanWrapperList);
newInstance(factoryBeanWrapperList);
inject(factoryBeanWrapperList);
factoryBeanWrapper.init();
return (T)((FactoryBean)factoryBeanWrapper.getInstance()).getInstance();
return null;
} else if (beanList.size() > 1) {
throw new BeanException(String.format("Bean[name:%s] 存在多个实例!", name));
}
@@ -229,20 +214,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
private <T> T doGetBeanByName(Class<T> type, String name, Object... args) throws BeanException {
List<BeanWrapper> beanList = findBeanList(type, name);
if (CollectionUtil.isEmpty(beanList)) {
// TODO check
List<BeanWrapper> factoryBeanWrapperList = findFactoryBeanListByName(type, name);
if (CollectionUtil.isEmpty(factoryBeanWrapperList)) {
return null;
} else if (factoryBeanWrapperList.size() > 1) {
throw new BeanException(String.format("Bean[name:%s] 存在多个实例!", name));
}
BeanWrapper factoryBeanWrapper = factoryBeanWrapperList.get(0);
dependencyCheck(factoryBeanWrapperList);
newInstance(factoryBeanWrapperList);
inject(factoryBeanWrapperList);
factoryBeanWrapper.init();
return (T)((FactoryBean)factoryBeanWrapper.getInstance()).getInstance();
return null;
} else if (beanList.size() > 1) {
throw new BeanException(String.format("Bean[name:%s] 存在多个实例!", name));
}
@@ -252,20 +224,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
private <T> T doGetBean(Class<T> type, Object... args) throws BeanException {
List<BeanWrapper> beanList = findBeanList(type);
if (CollectionUtil.isEmpty(beanList)) {
// TODO check
List<BeanWrapper> factoryBeanWrapperList = findFactoryBeanListByType(type);
if (CollectionUtil.isEmpty(factoryBeanWrapperList)) {
return null;
} else if (factoryBeanWrapperList.size() > 1) {
throw new BeanException(String.format("Bean[name:%s] 存在多个实例!", name));
}
BeanWrapper factoryBeanWrapper = factoryBeanWrapperList.get(0);
dependencyCheck(factoryBeanWrapperList);
newInstance(factoryBeanWrapperList);
inject(factoryBeanWrapperList);
factoryBeanWrapper.init();
return (T)((FactoryBean)factoryBeanWrapper.getInstance()).getInstance();
return null;
} else if (beanList.size() > 1) {
throw new BeanException(String.format("Bean[type:%s] 存在多个实例!", type));
}
@@ -275,10 +234,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
private <T> T doGetBeanByTypeAndName(Class<T> type, String name, Object... args) throws BeanException {
BeanWrapper bean = findBean(type, name);
if (null == bean) {
BeanWrapper factoryBeanWrapper = findFactoryBean(type, name);
if (null != factoryBeanWrapper) {
return (T)((FactoryBean)factoryBeanWrapper.getInstance()).getInstance();
}
return null;
}
if (null == bean) {
return null;
@@ -378,68 +334,6 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
return beanCache.get(new BeanIdentity(name, type));
}
/**
* 查找工厂bean
* @param type
* @param name
* @return
*/
private BeanWrapper findFactoryBean(Class<?> type, String name) {
Assert.notNull(type, "bean的类型不能为空!");
Assert.notNull(name, "bean的名称不能为空!");
return factoryBeanCache.get(new BeanIdentity(name, type));
}
/**
* 查找工厂bean列表
* @param type
* @param name
* @return
*/
private List<BeanWrapper> findFactoryBeanListByName(Class<?> type, String name) {
Assert.notNull(type, "bean的类型不能为空!");
Assert.notNull(name, "bean的名称不能为空!");
List<BeanWrapper> list = new ArrayList<>();
for (BeanIdentity identity : factoryBeanCache.keySet()) {
if (type.isAssignableFrom(identity.getType()) && identity.getName().equals(name)) {
list.add(factoryBeanCache.get(identity));
}
}
return list;
}
/**
* 查找工厂bean列表
* @param name
* @return
*/
private List<BeanWrapper> findFactoryBeanListByName(String name) {
Assert.notNull(name, "bean的名称不能为空!");
List<BeanWrapper> list = new ArrayList<>();
for (BeanIdentity identity : factoryBeanCache.keySet()) {
if (identity.getName().equals(name)) {
list.add(factoryBeanCache.get(identity));
}
}
return list;
}
/**
* 查找工厂bean列表
* @param type
* @return
*/
private List<BeanWrapper> findFactoryBeanListByType(Class<?> type) {
Assert.notNull(type, "bean的类型不能为空!");
List<BeanWrapper> list = new ArrayList<>();
for (BeanIdentity identity : factoryBeanCache.keySet()) {
if (type.isAssignableFrom(identity.getType())) {
list.add(factoryBeanCache.get(identity));
}
}
return list;
}
/**
* 新增一个bean
* @param bean
@@ -451,37 +345,15 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
newInstance(bean);
// 工厂bean
BeanIdentity identity = ((FactoryBean)bean.getInstance()).getBeanIdentity();
if (factoryBeanCache.containsKey(identity)) {
throw new BeanException(String.format("Bean[type:%s name:%s] 存在多个factoryBean!", bean.getType().getName(), bean.getName()));
}
if (beanCache.containsKey(identity)) {
throw new BeanException(String.format("Bean[type:%s name:%s] 定义与BeanFactory[type:%s name:%s]冲突!", identity.getType().getName(), identity.getName(), bean.getType().getName(), bean.getName()));
}
factoryBeanCache.put(identity, bean);
BeanWrapper targetBeanWrapper = addBean(identity.getType(), identity.getName());
targetBeanWrapper.setFactoryBean(bean);
targetBeanWrapper.setInstantiationMode(BeanInstantiationMode.FACTORY);
}
}
/**
* 获取bean的工厂
* @param bean
* @return
*/
protected FactoryBean getFactory(BeanWrapper bean) throws BeanException {
BeanWrapper factoryBeanWrapper = factoryBeanCache.get(bean.getIdentity());
if (null == factoryBeanWrapper) {
return null;
}
dependencyCheck(factoryBeanWrapper);
newInstance(factoryBeanWrapper);
inject(factoryBeanWrapper);
factoryBeanWrapper.init();
if (BeanStatus.INIT == factoryBeanWrapper.getStatus() || BeanStatus.RUNNING == factoryBeanWrapper.getStatus()) {
return (FactoryBean)factoryBeanWrapper.getInstance();
}
throw new BeanException(String.format("Bean[type:%s name%s] 获取工厂 Beanfactory[type:%s name:%s]异常!", bean.getType().getName(), bean.getName(), factoryBeanWrapper.getType().getName(), factoryBeanWrapper.getName()));
}
@Override
public void init() {
lifeCycleManager.init(() -> {
@@ -562,7 +434,7 @@ public abstract class AbstractBeanFactory implements BeanFactory, BeanRegistry,
* @param type
* @param name
*/
protected abstract void addBean(Class<?> type, String name);
protected abstract BeanWrapper addBean(Class<?> type, String name);
/**
* 获取或创建实例
@@ -19,14 +19,18 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
package fun.asgc.neutrino.core.bean;
/**
* 应用容器
* 用于标识需要beanFactory的组件
* @author: aoshiguchen
* @date: 2022/6/16
* @date: 2022/7/6
*/
public interface ApplicationContainer extends Container {
public interface BeanFactoryAware {
/**
* 设置bean工厂
* @param beanFactory
*/
void setBeanFactory(BeanFactory beanFactory);
}
@@ -68,6 +68,13 @@ public interface BeanRegistry {
*/
boolean hasBean(Class<?> type, String name);
/**
* 判断是否包含此bean
* @param type
* @return
*/
boolean hasBean(Class<?> type);
/**
* 查询bean容器中有多少个叫该名称的bean
* @param name
@@ -23,12 +23,7 @@
package fun.asgc.neutrino.core.bean;
import fun.asgc.neutrino.core.annotation.*;
import fun.asgc.neutrino.core.aop.Aop;
import fun.asgc.neutrino.core.context.LifeCycle;
import fun.asgc.neutrino.core.container.BeanContainer;
import fun.asgc.neutrino.core.context.ApplicationConfig;
import fun.asgc.neutrino.core.context.ApplicationContext;
import fun.asgc.neutrino.core.context.Environment;
import fun.asgc.neutrino.core.util.*;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -57,6 +52,9 @@ public class BeanWrapper implements LifeCycle {
private BeanStatus status;
private boolean isLazy;
private BeanIdentity beanIdentity;
private BeanWrapper factoryBean;
private BeanInstantiationMode instantiationMode;
private Method instantiationMethod;
public boolean hasInstance() {
return null != instance;
@@ -104,113 +102,6 @@ public class BeanWrapper implements LifeCycle {
}
}
public boolean newInstance(ApplicationContext context) {
boolean result = newInstance0();
if (result) {
inject(context);
init();
}
return result;
}
private boolean newInstance0() {
try {
return LockUtil.doubleCheckProcess(() -> !hasInstance(),
this,
() -> {
try {
// 暂时先只支持yml配置
Configuration configuration = type.getAnnotation(Configuration.class);
if (null != configuration) {
instance = ConfigUtil.getYmlConfig(type);
} else if (ClassUtil.isInterface(type)) {
instance = Aop.get(type);
} else {
// 由编码规避没有无参构造器的问题
instance = type.newInstance();
}
} catch (Exception e) {
// ignore
}
},
() -> hasInstance()
);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private void inject(ApplicationContext context) {
Set<Method> methods = ReflectUtil.getMethods(type);
if (CollectionUtil.notEmpty(methods)) {
methods.stream().forEach(method -> {
fun.asgc.neutrino.core.annotation.Bean bean = method.getAnnotation(fun.asgc.neutrino.core.annotation.Bean.class);
if (null == bean) {
return;
}
String name = bean.value();
if (StringUtil.isEmpty(name)) {
name = method.getName();
}
// TODO 方法带参数的情况、class重复的问题,暂时由编码规避
if (method.getParameters().length == 0) {
try {
Object obj = method.invoke(this.instance);
if (null == obj) {
log.error("bean 实例不能为空!");
return;
}
context.getBeanContainer().addBean(new BeanWrapper()
.setType(obj.getClass())
.setBoot(false)
.setComponent(null)
.setInstance(obj)
.setName(name)
.setOrder(Integer.MAX_VALUE)
);
} catch (Exception e) {
log.error(String.format("bean [%s] 实例化失败!", name), e);
}
}
});
}
Set<Field> fieldSet = ReflectUtil.getInheritChainDeclaredFieldSet(type);
if (CollectionUtil.notEmpty(fieldSet)) {
fieldSet.forEach(field -> {
Autowired autowired = field.getAnnotation(Autowired.class);
if (null == autowired) {
return;
}
if (field.getType() == Environment.class) {
ReflectUtil.setFieldValue(field, instance, context.getEnvironment());
} else if(field.getType() == ApplicationConfig.class) {
ReflectUtil.setFieldValue(field, instance, context.getApplicationConfig());
} else if(field.getType() == BeanContainer.class) {
ReflectUtil.setFieldValue(field, instance, context.getBeanContainer());
} else if (field.getType() == ApplicationContext.class) {
ReflectUtil.setFieldValue(field, instance, context);
} else {
Class<?> autowiredType = field.getType();
BeanWrapper autowiredBean = null;
if (StringUtil.isEmpty(autowired.value())) {
autowiredBean = context.getBeanContainer().getBean(autowiredType);
} else {
autowiredBean = context.getBeanContainer().getBean(autowired.value());
}
if (null == autowiredBean) {
throw new RuntimeException(String.format("类 %s 自动装配字段:%s 依赖bean不存在!", type.getName(), field.getName()));
}
if (autowiredBean.isDependOn(type)) {
throw new RuntimeException(String.format("类[%s]与类[%s]存在循环依赖!", type.getName(), field.getType().getName()));
}
autowiredBean.newInstance(context);
ReflectUtil.setFieldValue(field, instance, autowiredBean.getInstance());
}
});
}
}
public boolean isLazy() {
Lazy lazy = ClassUtil.getAnnotation(type, Lazy.class);
return null != lazy;
@@ -52,14 +52,15 @@ public class SimpleBeanFactory extends AbstractBeanFactory {
}
@Override
protected void addBean(Class<?> type, String name) {
protected BeanWrapper addBean(Class<?> type, String name) {
log.debug("addBean[type:{} name:{}]", type.getName(), name);
BeanWrapper beanWrapper = new BeanWrapper()
.setType(type)
.setName(name)
.setLazy(Boolean.FALSE)
.setOrder(Integer.MAX_VALUE)
.setStatus(BeanStatus.REGISTER);
.setStatus(BeanStatus.REGISTER)
.setInstantiationMode(BeanInstantiationMode.DIRECT);
Lazy lazy = ClassUtil.getAnnotation(type, Lazy.class);
if (null != lazy) {
beanWrapper.setLazy(lazy.value());
@@ -69,14 +70,16 @@ public class SimpleBeanFactory extends AbstractBeanFactory {
beanWrapper.setOrder(order.value());
}
addBean(beanWrapper);
registerBeanForMethod(type);
registerBeanForMethod(beanWrapper, type);
return beanWrapper;
}
/**
* 根据method注册bean
* @param factoryBean
* @param type
*/
private void registerBeanForMethod(Class<?> type) {
private void registerBeanForMethod(BeanWrapper factoryBean, Class<?> type) {
Set<Method> methods = ReflectUtil.getMethods(type);
if (CollectionUtil.isEmpty(methods)) {
return;
@@ -94,7 +97,19 @@ public class SimpleBeanFactory extends AbstractBeanFactory {
if (method.getParameters().length > 0) {
throw new BeanException(String.format("Bean[type:%s name:%s] 注册失败,Class:%s method:%s 方法不能带参数!", beanType.getName(), beanName, type.getName(), method.getName()));
}
addBean(beanType, beanName);
BeanWrapper beanWrapper = addBean(beanType, beanName);
beanWrapper.setFactoryBean(factoryBean);
beanWrapper.setInstantiationMode(BeanInstantiationMode.METHOD);
beanWrapper.setInstantiationMethod(method);
Lazy lazy = method.getAnnotation(Lazy.class);
if (null != lazy) {
beanWrapper.setLazy(lazy.value());
}
Order order = method.getAnnotation(Order.class);
if (null != order) {
beanWrapper.setOrder(order.value());
}
}
}
@@ -124,22 +139,40 @@ public class SimpleBeanFactory extends AbstractBeanFactory {
NonIntercept nonIntercept = ClassUtil.getAnnotation(bean.getType(), NonIntercept.class);
boolean isNonIntercept = (null != nonIntercept && nonIntercept.value()) ? true : false;
if (ClassUtil.isInterface(bean.getType())) {
bean.setInstance(Aop.get(bean.getType()));
} else if(bean.getType().isAnnotationPresent(Configuration.class)) {
bean.setInstance(ConfigUtil.getYmlConfig(bean.getType()));
} else {
if (ClassUtil.hasNoArgsConstructor(bean.getType())) {
if (isNonIntercept) {
bean.setInstance(bean.getType().newInstance());
} else {
bean.setInstance(Aop.get(bean.getType()));
}
if (BeanInstantiationMode.DIRECT == bean.getInstantiationMode()) {
// 直接实例化
if (ClassUtil.isInterface(bean.getType())) {
bean.setInstance(Aop.get(bean.getType()));
} else if(bean.getType().isAnnotationPresent(Configuration.class)) {
bean.setInstance(ConfigUtil.getYmlConfig(bean.getType()));
} else {
// TODO 暂不支持有参构造器
throw new BeanException(String.format("Bean[type:%s name:%s] 没有无参构造器,实例化失败!", bean.getType().getName(), bean.getName()));
if (ClassUtil.hasNoArgsConstructor(bean.getType())) {
if (isNonIntercept) {
bean.setInstance(bean.getType().newInstance());
} else {
bean.setInstance(Aop.get(bean.getType()));
}
} else {
// TODO 暂不支持有参构造器
throw new BeanException(String.format("Bean[type:%s name:%s] 没有无参构造器,实例化失败!", bean.getType().getName(), bean.getName()));
}
}
} else if (BeanInstantiationMode.METHOD == bean.getInstantiationMode()) {
// 通过bean方法实例化
BeanWrapper factoryBean = bean.getFactoryBean();
if (!factoryBean.hasInstance()) {
newInstance(factoryBean);
}
bean.setInstance(bean.getInstantiationMethod().invoke(factoryBean.getInstance()));
} else if (BeanInstantiationMode.FACTORY == bean.getInstantiationMode()) {
// 通过FactoryBean实例化
BeanWrapper factoryBean = bean.getFactoryBean();
if (!factoryBean.hasInstance()) {
newInstance(factoryBean);
}
bean.setInstance(((FactoryBean)factoryBean.getInstance()).getInstance());
}
if (null != bean.getInstance()) {
bean.setStatus(BeanStatus.INSTANCE);
}
@@ -1,75 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import fun.asgc.neutrino.core.bean.BeanWrapper;
import java.util.List;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
public interface BeanContainer extends Container {
/**
* 是否存在bean实例
* @param clazz
* @return
*/
boolean hasBean(Class<?> clazz);
/**
* 是否存在bean实例
* @param name
* @return
*/
boolean hasBean(String name);
/**
* 获取bean实例
* @param clazz
* @return
*/
BeanWrapper getBean(Class<?> clazz);
/**
* 获取bean实例
* @param name
* @return
*/
BeanWrapper getBean(String name);
/**
* 获取bean集合
* @return
*/
List<BeanWrapper> beanList();
/**
* 添加bean
* @param bean
*/
void addBean(BeanWrapper bean);
}
@@ -1,53 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import java.util.Set;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
public interface ClassContainer extends Container {
/**
* 判断指定类是否在容器中
* @param clazz
* @return
*/
boolean hasClass(Class<?> clazz);
/**
* 获取容器中所有的类
* @return
*/
Set<Class<?>> getClasses();
/**
* 获取容器中所有的组件
* @return
*/
Set<Class<?>> getComponentClasses();
}
@@ -1,35 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import fun.asgc.neutrino.core.context.LifeCycle;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
public interface Container extends LifeCycle {
}
@@ -1,85 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import fun.asgc.neutrino.core.context.ApplicationContext;
import fun.asgc.neutrino.core.context.Environment;
import fun.asgc.neutrino.core.exception.ContainerInitException;
import fun.asgc.neutrino.core.runner.ApplicationRunner;
import fun.asgc.neutrino.core.util.BeanManager;
import lombok.extern.slf4j.Slf4j;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
@Slf4j
public class DefaultApplicationContainer implements ApplicationContainer {
private Environment environment;
private BeanContainer beanContainer;
private ApplicationContext context;
public DefaultApplicationContainer(Environment environment) {
this.environment = environment;
this.init();
}
@Override
public void init() throws ContainerInitException {
this.beanContainer = new DefaultBeanContainer(environment);
this.context = new ApplicationContext()
.setEnvironment(environment)
.setBeanContainer(beanContainer)
.setApplicationConfig(environment.getConfig());
BeanManager.setContext(this.context);
this.beanContainer.beanList().forEach(bean -> {
if (bean.isBoot() || !bean.isLazy()) {
bean.newInstance(context);
}
});
log.info("应用容器初始化完成");
this.run();
}
private void run() {
this.beanContainer.beanList().forEach(bean -> {
if (bean.isBoot()) {
if (bean.hasInstance()) {
if (ApplicationRunner.class.isAssignableFrom(bean.getType())) {
ApplicationRunner runner = (ApplicationRunner)bean.getInstance();
runner.run(environment.getMainArgs());
}
}
}
});
}
@Override
public void destroy() {
this.beanContainer.destroy();
this.beanContainer.beanList().forEach(bean -> bean.destroy());
log.info("应用容器销毁");
}
}
@@ -1,140 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import com.google.common.collect.Lists;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Order;
import fun.asgc.neutrino.core.bean.BeanWrapper;
import fun.asgc.neutrino.core.cache.Cache;
import fun.asgc.neutrino.core.cache.MemoryCache;
import fun.asgc.neutrino.core.context.Environment;
import fun.asgc.neutrino.core.exception.ContainerInitException;
import fun.asgc.neutrino.core.runner.ApplicationRunner;
import fun.asgc.neutrino.core.util.ClassUtil;
import fun.asgc.neutrino.core.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
@Slf4j
public class DefaultBeanContainer implements BeanContainer {
private Environment environment;
private ClassContainer classContainer;
private Cache<String, BeanWrapper> nameBeanCache;
private Cache<Class<?>, BeanWrapper> classBeanCache;
private List<BeanWrapper> beans;
public DefaultBeanContainer(Environment environment) {
this.environment = environment;
this.nameBeanCache = new MemoryCache<>();
this.classBeanCache = new MemoryCache<>();
this.beans = new ArrayList<>();
this.init();
}
@Override
public boolean hasBean(Class<?> clazz) {
return classBeanCache.containsKey(clazz);
}
@Override
public boolean hasBean(String name) {
return nameBeanCache.containsKey(name);
}
@Override
public BeanWrapper getBean(Class<?> clazz) {
return classBeanCache.get(clazz);
}
@Override
public BeanWrapper getBean(String name) {
return nameBeanCache.get(name);
}
@Override
public void init() throws ContainerInitException {
this.classContainer = new DefaultClassContainer(environment);
this.classContainer.getComponentClasses().forEach(clazz -> {
String name = clazz.getName();
Component component = ClassUtil.getAnnotation(clazz, Component.class);
if (null != component && StringUtil.notEmpty(component.value())) {
name = component.value();
}
Order order = ClassUtil.getAnnotation(clazz, Order.class);
int orderValue = Integer.MAX_VALUE;
if (null != order) {
orderValue = order.value();
}
addBean(new BeanWrapper()
.setType(clazz)
.setName(name)
.setComponent(component)
.setOrder(orderValue)
);
});
if (!classBeanCache.isEmpty()) {
beans = Lists.newArrayList(classBeanCache.values());
Collections.sort(beans, Comparator.comparingInt(BeanWrapper::getOrder));
}
log.info("bean容器初始化完成");
}
@Override
public void destroy() {
this.classContainer.destroy();
log.info("bean容器销毁");
}
@Override
public void addBean(BeanWrapper bean) {
if (null == bean) {
return;
}
// TODO 暂时由编码时规避名字冲突
if (ApplicationRunner.class.isAssignableFrom(bean.getType())) {
bean.setOrder(Integer.MIN_VALUE);
bean.setBoot(true);
}
classBeanCache.set(bean.getType(), bean);
nameBeanCache.set(bean.getName(), bean);
}
@Override
public List<BeanWrapper> beanList() {
return beans;
}
}
@@ -1,89 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.container;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.context.Environment;
import fun.asgc.neutrino.core.exception.ContainerInitException;
import fun.asgc.neutrino.core.util.ClassUtil;
import fun.asgc.neutrino.core.util.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
@Slf4j
public class DefaultClassContainer implements ClassContainer {
private Environment environment;
private Set<Class<?>> classes;
private Set<Class<?>> componentClasses;
public DefaultClassContainer(Environment environment) {
this.environment = environment;
this.classes = Collections.synchronizedSet(new HashSet<>());
this.componentClasses = Collections.synchronizedSet(new HashSet<>());
this.init();
}
@Override
public void init() throws ContainerInitException {
try {
if (CollectionUtil.isEmpty(environment.getScanBasePackages())) {
return;
}
this.classes = ClassUtil.scan(environment.getScanBasePackages());
this.componentClasses = this.classes.stream().filter(item -> ClassUtil.isAnnotateWith(item, Component.class)).collect(Collectors.toSet());
log.info("class容器初始化完成");
} catch (Exception e) {
log.error("class容器初始化异常!");
throw new ContainerInitException(this);
}
}
@Override
public boolean hasClass(Class<?> clazz) {
return classes.contains(clazz);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Class<?>> getComponentClasses() {
return componentClasses;
}
@Override
public void destroy() {
log.info("class容器销毁");
}
}
@@ -27,8 +27,8 @@ import fun.asgc.neutrino.core.aop.interceptor.ExceptionHandler;
import fun.asgc.neutrino.core.aop.interceptor.Filter;
import fun.asgc.neutrino.core.aop.interceptor.Interceptor;
import fun.asgc.neutrino.core.aop.interceptor.ResultAdvice;
import fun.asgc.neutrino.core.bean.BeanFactoryAware;
import fun.asgc.neutrino.core.bean.SimpleBeanFactory;
import fun.asgc.neutrino.core.container.BeanContainer;
import fun.asgc.neutrino.core.runner.ApplicationRunner;
import fun.asgc.neutrino.core.util.*;
import lombok.Data;
@@ -57,10 +57,6 @@ public class ApplicationContext implements LifeCycle {
* 应用配置
*/
private ApplicationConfig applicationConfig;
/**
* bean容器
*/
private BeanContainer beanContainer;
/**
* 根Bean工厂
*/
@@ -74,9 +70,6 @@ public class ApplicationContext implements LifeCycle {
*/
private LifeCycleManager lifeCycleManager = LifeCycleManager.create();
public ApplicationContext() {
}
public ApplicationContext(Environment environment) {
this.environment = environment;
@@ -93,8 +86,6 @@ public class ApplicationContext implements LifeCycle {
this.rootBeanFactory.registerBean(environment.getConfig(), "rootApplicationConfig");
register();
this.applicationBeanFactory.init();
// TODO 后面优化掉这种不安全的BeanManager
BeanManager.setContext(this);
} catch (Exception e) {
log.error("应用上下文初始化异常!", e);
System.exit(-1);
@@ -137,6 +128,9 @@ public class ApplicationContext implements LifeCycle {
}
this.applicationBeanFactory.registerBean(clazz, beanName);
});
if (!applicationBeanFactory.hasBean(BeanManager.class)) {
applicationBeanFactory.registerBean(BeanManager.class);
}
}
/**
@@ -144,12 +138,13 @@ public class ApplicationContext implements LifeCycle {
*/
public void run() {
init();
List<BeanFactoryAware> beanFactoryAwareList = this.applicationBeanFactory.getBeanList(BeanFactoryAware.class);
if (CollectionUtil.notEmpty(beanFactoryAwareList)) {
beanFactoryAwareList.forEach(beanFactoryAware -> beanFactoryAware.setBeanFactory(applicationBeanFactory));
}
List<ApplicationRunner> applicationRunnerList = this.applicationBeanFactory.getBeanList(ApplicationRunner.class);
if (CollectionUtil.notEmpty(applicationRunnerList)) {
applicationRunnerList.forEach(applicationRunner -> applicationRunner.run(this.environment.getMainArgs()));
// for (ApplicationRunner runner : applicationRunnerList) {
// runner.run(this.environment.getMainArgs());
// }
}
}
}
@@ -23,6 +23,7 @@ package fun.asgc.neutrino.core.db.mapper;
import fun.asgc.neutrino.core.annotation.Autowired;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.core.aop.Invocation;
import fun.asgc.neutrino.core.aop.interceptor.Interceptor;
import fun.asgc.neutrino.core.cache.Cache;
@@ -43,6 +44,7 @@ import java.util.Map;
* @author: aoshiguchen
* @date: 2022/6/28
*/
@NonIntercept
@Component
public class SqlMapperInterceptor implements Interceptor {
@@ -1,38 +0,0 @@
/**
* Copyright (c) 2022 aoshiguchen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package fun.asgc.neutrino.core.exception;
import fun.asgc.neutrino.core.container.Container;
/**
*
* @author: aoshiguchen
* @date: 2022/6/16
*/
public class ContainerInitException extends RuntimeException {
public ContainerInitException(Container container) {
super(String.format("容器:[%s] 初始化异常", container.getClass().getName()));
}
}
@@ -25,8 +25,6 @@ package fun.asgc.neutrino.core.launcher;
import com.google.common.collect.Lists;
import fun.asgc.neutrino.core.annotation.NeutrinoApplication;
import fun.asgc.neutrino.core.constant.MetaDataConstant;
import fun.asgc.neutrino.core.container.ApplicationContainer;
import fun.asgc.neutrino.core.container.DefaultApplicationContainer;
import fun.asgc.neutrino.core.context.ApplicationConfig;
import fun.asgc.neutrino.core.context.ApplicationContext;
import fun.asgc.neutrino.core.context.Environment;
@@ -43,7 +41,6 @@ import java.lang.management.ManagementFactory;
@Slf4j
public class NeutrinoLauncher {
private Environment environment;
private ApplicationContainer applicationContainer;
public static SystemUtil.RunContext run(final Class<?> clazz, final String[] args) {
Assert.notNull(clazz, "启动类不能为空!");
@@ -65,11 +62,6 @@ public class NeutrinoLauncher {
stopWatch.start();
environmentInit();
// this.applicationContainer = new DefaultApplicationContainer(environment);
// SystemUtil.RunContext runContext = SystemUtil.waitProcessDestroy(() -> {
// this.applicationContainer.destroy();
// log.info("Application already stop.");
// });
ApplicationContext context = new ApplicationContext(environment);
context.run();
SystemUtil.RunContext runContext = SystemUtil.waitProcessDestroy(() -> {
@@ -22,16 +22,13 @@
package fun.asgc.neutrino.core.util;
import fun.asgc.neutrino.core.container.BeanContainer;
import fun.asgc.neutrino.core.context.ApplicationConfig;
import fun.asgc.neutrino.core.context.ApplicationContext;
import fun.asgc.neutrino.core.bean.BeanWrapper;
import fun.asgc.neutrino.core.context.Environment;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.core.bean.BeanFactory;
import fun.asgc.neutrino.core.bean.BeanFactoryAware;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
@@ -39,65 +36,28 @@ import java.util.stream.Collectors;
* @date: 2022/6/16
*/
@Slf4j
public class BeanManager {
private static volatile ApplicationContext context;
@NonIntercept
@Component
public class BeanManager implements BeanFactoryAware {
private static volatile BeanFactory beanFactory;
public static synchronized void setContext(ApplicationContext ctx) {
Assert.notNull(ctx, "ctx不能为空!");
context = ctx;
log.info("BeanManager初始化完成");
@Override
public void setBeanFactory(BeanFactory beanFactory) {
BeanManager.beanFactory = beanFactory;
}
public static Object getBean(String name) {
if (StringUtil.isEmpty(name)) {
return null;
if (null == beanFactory) {
throw new RuntimeException("Beanfactory尚未初始化");
}
if ("environment".equals(name)) {
return context.getEnvironment();
} else if("applicationConfig".equals(name)) {
return context.getApplicationConfig();
} else if("beanContainer".equals(name)) {
return context.getBeanContainer();
} else if ("applicationContext".equals(name)) {
return context;
} else {
if (null != context.getBeanContainer()) {
BeanWrapper bean = context.getBeanContainer().getBean(name);
if (null != bean) {
if (!bean.hasInstance()) {
bean.newInstance(context);
}
return bean.getInstance();
}
}
}
return null;
return beanFactory.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
if (null == context) {
return null;
if (null == beanFactory) {
throw new RuntimeException("Beanfactory尚未初始化");
}
if (clazz == Environment.class) {
return (T)context.getEnvironment();
} else if(clazz == ApplicationConfig.class) {
return (T)context.getApplicationConfig();
} else if(clazz == BeanContainer.class) {
return (T)context.getBeanContainer();
} else if (clazz == ApplicationContext.class) {
return (T)context;
} else {
if (null != context.getBeanContainer()) {
BeanWrapper bean = context.getBeanContainer().getBean(clazz);
if (null != bean) {
if (!bean.hasInstance()) {
bean.newInstance(context);
}
return (T)bean.getInstance();
}
}
}
return null;
return beanFactory.getBean(clazz);
}
/**
@@ -107,15 +67,10 @@ public class BeanManager {
* @return
*/
public static <T> List<T> getBeanListBySuperClass(Class<T> superClass) {
if (null == context || null == context.getBeanContainer()) {
return null;
if (null == beanFactory) {
throw new RuntimeException("Beanfactory尚未初始化");
}
return context.getBeanContainer().beanList().stream()
.map(BeanWrapper::getType)
.filter(item -> superClass.isAssignableFrom(item))
.map(item -> (T)getBean(item))
.filter(Objects::nonNull)
.collect(Collectors.toList());
return beanFactory.getBeanList(superClass);
}
}
@@ -244,4 +244,18 @@ public class ClassUtil {
public static boolean hasNoArgsConstructor(Class<?> clazz) {
return Stream.of(clazz.getConstructors()).filter(c -> c.getParameterCount() == 0).count() > 0;
}
/**
* 获取bean名称
* @param type
* @return
*/
public static String getBeanName(Class<?> type) {
String name = TypeUtil.getDefaultVariableName(type);
Component component = ClassUtil.getAnnotation(type, Component.class);
if (null != component && StringUtil.notEmpty(component.value())) {
name = component.value();
}
return name;
}
}
@@ -23,12 +23,14 @@ package fun.asgc.neutrino.core.bean.test1;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Init;
import fun.asgc.neutrino.core.annotation.NonIntercept;
/**
*
* @author: aoshiguchen
* @date: 2022/7/4
*/
@NonIntercept
@Component
public class Cat extends Animal {
@@ -22,6 +22,7 @@
package fun.asgc.neutrino.core.bean.test1;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -33,6 +34,7 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
@Data
@Component
@NonIntercept
public class Dog extends Animal {
private String color;
@Override
@@ -54,6 +54,8 @@ public class Launcher {
private Dog dog2;
@Autowired
private Dog dog10;
@Autowired
private Dog dog11;
@Autowired(value = "dog", matchMode = BeanMatchMode.ByName, parameterTypes = Dog.class)
private Object[] dogs1;
@Autowired(matchMode = BeanMatchMode.ByType, parameterTypes = Dog.class)
@@ -79,4 +81,9 @@ public class Launcher {
public static void main(String[] args) {
NeutrinoLauncher.run(Launcher.class, args).sync();
}
@Bean
public Dog dog11() {
return new Dog().setColor("red");
}
}
@@ -26,6 +26,7 @@ import com.alibaba.fastjson.JSONObject;
import fun.asgc.neutrino.core.annotation.Autowired;
import fun.asgc.neutrino.core.annotation.Bean;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.core.runner.ApplicationRunner;
import fun.asgc.neutrino.core.util.CollectionUtil;
import fun.asgc.neutrino.core.util.FileUtil;
@@ -57,6 +58,7 @@ import java.security.KeyStore;
* @date: 2022/6/16
*/
@Slf4j
@NonIntercept
@Component
public class ProxyClientRunner implements ApplicationRunner {
@Autowired
@@ -25,6 +25,7 @@ package fun.asgc.neutrino.proxy.client.handler;
import fun.asgc.neutrino.core.annotation.Autowired;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.client.config.ProxyConfig;
import fun.asgc.neutrino.proxy.client.core.ProxyChannelBorrowListener;
import fun.asgc.neutrino.proxy.client.util.ClientChannelMannager;
@@ -37,6 +38,7 @@ import io.netty.channel.*;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.CONNECT)
@Component
public class ProxyMessageConnectHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.client.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.client.util.ClientChannelMannager;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
@@ -39,6 +40,7 @@ import io.netty.channel.ChannelHandlerContext;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.DISCONNECT)
@Component
public class ProxyMessageDisconnectHandler implements ProxyMessageHandler {
@@ -25,6 +25,7 @@ package fun.asgc.neutrino.proxy.client.handler;
import com.alibaba.fastjson.JSONObject;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.*;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
@@ -35,6 +36,7 @@ import lombok.extern.slf4j.Slf4j;
* @date: 2022/6/16
*/
@Slf4j
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.ERROR)
@Component
public class ProxyMessageErrorHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.client.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
import fun.asgc.neutrino.proxy.core.ProxyMessage;
@@ -37,6 +38,7 @@ import io.netty.channel.ChannelHandlerContext;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.TRANSFER)
@Component
public class ProxyMessageTransferHandler implements ProxyMessageHandler {
@@ -25,6 +25,7 @@ package fun.asgc.neutrino.proxy.server.core;
import fun.asgc.neutrino.core.annotation.Autowired;
import fun.asgc.neutrino.core.annotation.Bean;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.core.runner.ApplicationRunner;
import fun.asgc.neutrino.core.util.FileUtil;
import fun.asgc.neutrino.proxy.core.IdleCheckHandler;
@@ -50,6 +51,7 @@ import java.security.KeyStore;
* @date: 2022/6/16
*/
@Slf4j
@NonIntercept
@Component
public class ProxyServerRunner implements ApplicationRunner {
@Autowired
@@ -26,6 +26,7 @@ import com.alibaba.fastjson.JSONObject;
import fun.asgc.neutrino.core.annotation.Autowired;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.core.util.BeanManager;
import fun.asgc.neutrino.proxy.core.*;
import fun.asgc.neutrino.proxy.server.config.ProxyConfig;
@@ -51,6 +52,7 @@ import java.util.List;
* @date: 2022/6/16
*/
@Slf4j
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.AUTH)
@Component
public class ProxyMessageAuthHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.server.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
import fun.asgc.neutrino.proxy.core.ProxyMessage;
@@ -38,6 +39,7 @@ import io.netty.channel.ChannelOption;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.CONNECT)
@Component
public class ProxyMessageConnectHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.server.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
import fun.asgc.neutrino.proxy.core.ProxyMessage;
@@ -39,6 +40,7 @@ import io.netty.channel.ChannelHandlerContext;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.DISCONNECT)
@Component
public class ProxyMessageDisconnectHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.server.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
import fun.asgc.neutrino.proxy.core.ProxyMessage;
@@ -35,6 +36,7 @@ import io.netty.channel.ChannelHandlerContext;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.HEARTBEAT)
@Component
public class ProxyMessageHeartbeatHandler implements ProxyMessageHandler {
@@ -24,6 +24,7 @@ package fun.asgc.neutrino.proxy.server.handler;
import fun.asgc.neutrino.core.annotation.Component;
import fun.asgc.neutrino.core.annotation.Match;
import fun.asgc.neutrino.core.annotation.NonIntercept;
import fun.asgc.neutrino.proxy.core.Constants;
import fun.asgc.neutrino.proxy.core.ProxyDataTypeEnum;
import fun.asgc.neutrino.proxy.core.ProxyMessage;
@@ -37,6 +38,7 @@ import io.netty.channel.ChannelHandlerContext;
* @author: aoshiguchen
* @date: 2022/6/16
*/
@NonIntercept
@Match(type = Constants.ProxyDataTypeName.TRANSFER)
@Component
public class ProxyMessageTransferHandler implements ProxyMessageHandler {