package org.test4j.module.spring.strategy.register; import java.util.LinkedList; import java.util.Queue; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.test4j.module.spring.annotations.AutoBeanInject; import org.test4j.module.spring.exception.FindBeanImplClassException; import org.test4j.module.spring.strategy.ImplementorFinder; import org.test4j.module.spring.strategy.register.types.PropertiesRegister; import org.test4j.tools.commons.AnnotationHelper; import org.test4j.tools.commons.StringHelper; /** * 动态配置spring context的bean @AutoBeanInject<br> * * @author darui.wudr * */ @SuppressWarnings({ "rawtypes" }) public class RegisterDynamicBean { Queue<Class> beanFields = new LinkedList<Class>(); /** * 动态注册@SpringBeanByName,@SpringBeanByType和@SpringBeanFor等注解定义的bean * * @param beanFactory * @param testedClazz */ public static void dynamicRegisterBeanDefinition(final DefaultListableBeanFactory beanFactory, final Class testedClazz) { RegisterDynamicBean dynamicBean = new RegisterDynamicBean(beanFactory, testedClazz); try { dynamicBean.registerSpringBean(); } catch (FindBeanImplClassException e) { throw new RuntimeException(e); } } private final DefaultListableBeanFactory beanFactory; private final Class testedClazz; private final RegisterBeanDefinition definitionRegister; RegisterDynamicBean(final DefaultListableBeanFactory beanFactory, final Class testedClazz) { if (testedClazz == null) { throw new RuntimeException("Current thread hasn't registered tested class!"); } this.beanFactory = beanFactory; this.testedClazz = testedClazz; AutoBeanInject autoBeanInject = AnnotationHelper.getClassLevelAnnotation(AutoBeanInject.class, testedClazz); this.definitionRegister = new RegisterBeanDefinition(this.beanFactory, autoBeanInject); } static final SpringBeanRegister byNameRegister = new SpringBeanByNameRegister(); static final SpringBeanRegister byTypeRegister = new SpringBeanByTypeRegister(); /** * 注册@SpringBeanByName、@SpringBean和@SpringBeanFor 定义的spring bean对象 * * @param beanFactory * @param testedClazz * @throws FindBeanImplClassException */ protected final void registerSpringBean() throws FindBeanImplClassException { // o1 注册@SpringBeanByName注释的spring bean byNameRegister.register(testedClazz, beanFields, definitionRegister); // o2 注册@SpringBeanByType注释的spring bean byTypeRegister.register(testedClazz, beanFields, definitionRegister); if (this.definitionRegister.allowAutoInject() == false) { return; } /** * 属性的注入放到所有的@SpringBean和@SpringBeanByName注入完毕后开始 */ Class clazz = beanFields.poll(); while (clazz != null) { if (clazz != null) { PropertiesRegister.registerPropertiesBean(clazz, definitionRegister, this.beanFields); } clazz = beanFields.poll(); } } /** * 返回普通方式定义的BeanDefinition * * @param beanName * @param implClazz * @param initMethod * @param isLazy * @return */ public static RootBeanDefinition getRootBeanDefinition(String beanName, Class implClazz, String initMethod, boolean isLazy) { RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.setBeanClassName(implClazz.getName()); beanDefinition.setScope("singleton"); beanDefinition.setAutowireCandidate(true); beanDefinition.setLazyInit(isLazy); beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME); String init_method = initMethod; if (StringHelper.isBlankOrNull(initMethod)) { init_method = ImplementorFinder.findInitMethodName(implClazz); } if (StringHelper.isBlankOrNull(init_method) == false) { beanDefinition.setInitMethodName(init_method); } return beanDefinition; } }