protected <T> BeanDefinitionBase createBeanDefinition(Class<T> type){ return createBeanDefinition(type, null); }
protected <T> BeanDefinitionBase createBeanDefinition(Class<T> type, T bean, boolean primary){ return createBeanDefinition(type, bean, null, primary); }
@Override public <T> T createBean(Class<T> cls) throws BeanException { return (T)doCreateBean(createBeanDefinition(cls)); }
@Override public <T> void addBean(Class<T> type, T bean, boolean primary) { addBeanDefinition(createBeanDefinition(type, bean, primary)); }
@Override public <T> void addBean(Class<T> type, T bean, String name, boolean primary) { addBeanDefinition(createBeanDefinition(type, bean, name, primary)); }
final Map<T, BeanDefinition> finalBeans = beans; map.forEach((name, bean) -> { finalBeans.put(bean, createBeanDefinition(type, bean, name, false)); });
@Override public <T> T getOrAddBean(Class<T> type) throws BeanException { T bean = tryGetBean(type); if(null == bean) { //add bean definition and try again. addBeanDefinition(createBeanDefinition(type)); bean = tryGetBean(type); } return bean; }
@Override public <T> T getOrAddBean(Class<T> type, String name) throws BeanException { T bean = tryGetBean(type, name); if(null == bean){ //add bean definition and try again. addBeanDefinition(createBeanDefinition(type, name)); bean = tryGetBean(type, name); } return bean; }
@Override public Object resolveInjectValue(Class<?> type, Type genericType, String name) { SimpleReflectValued v = new SimpleReflectValued(type, genericType); BeanDefinitionBase bd = this.createBeanDefinition(MockBean.class, name); return resolveInjectValue(bd, mockBean, BeanType.of(MockBean.class), v, true, name); }
@Override public <T> T inject(T bean) throws BeanException { try { BeanDefinitionBase bd = createBeanDefinition(bean.getClass()); this.doBeanAware(bd, bean); this.doBeanConfigure(bd, bean); this.doBeanInjection(bd, bean); } catch (Throwable e) { if(e instanceof BeanException){ throw (BeanException)e; } throw new BeanException("Error injecting the bean '" + bean.getClass().getName() + "' : " + e.getMessage(),e); } //Validates validateFields(null, bean); return bean; }
@Override public void injectStatic(Class<?> cls) throws BeanException { BeanDefinitionBase bd = createBeanDefinition(cls); ReflectClass rc = ReflectClass.of(cls); BeanFactory factory = null != beanFactory ? beanFactory : this; for (ReflectField rf : rc.getFields()) { if (rf.isStatic() && rf.isAnnotationPresent(Inject.class)) { try { //skip when bean value already set. if (null != rf.getValue(null)) { continue; } Object injectedBean = resolveInjectValue(factory, bd, rf.getName(), rf.getType(), rf.getGenericType(), rf.getAnnotations()); if (null != injectedBean) { rf.setValue(null, injectedBean); } } catch (Exception e) { log.error("Error injecting static field '{}' in class '{}' : {}", rf.getName(), cls.getName(), e.getMessage()); throw e; } } } }