package org.test4j.module.spring.strategy.register.types; import java.util.Queue; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.test4j.module.spring.exception.FindBeanImplClassException; import org.test4j.module.spring.strategy.register.RegisterBeanDefinition; import org.test4j.module.spring.strategy.register.RegisterDynamicBean; import org.test4j.tools.commons.ClazzConst; import org.test4j.tools.commons.ClazzHelper; /** * 属性依赖注册 * * @author darui.wudr * */ @SuppressWarnings("rawtypes") public abstract class PropertiesRegister { protected final Class ownerClazz; protected final RegisterBeanDefinition definitionRegister; protected PropertiesRegister(final Class ownerClazz, final RegisterBeanDefinition definitionRegister) { this.ownerClazz = ownerClazz; this.definitionRegister = definitionRegister; } public abstract void registerProperties(final Queue<Class> registedBeanClazz); /** * 注册ownerClazz的属性bean * * @param ownerClazz * @param definitionRegister * @param registedBeanClazz * 以注册的spring bean实现类列表 */ public static void registerPropertiesBean(final Class ownerClazz, final RegisterBeanDefinition definitionRegister, final Queue<Class> registedBeanClazz) { new MethodPropertiesRegister(ownerClazz, definitionRegister).registerProperties(registedBeanClazz); boolean isResourceAvailable = ClazzHelper.isClassAvailable(ClazzConst.Javax_Resource_Annotation); if (isResourceAvailable) { new ResourcePropertiesRegister(ownerClazz, definitionRegister).registerProperties(registedBeanClazz); } boolean isAutowiredAvailable = ClazzHelper.isClassAvailable(ClazzConst.Spring_Autowired_Annotation); if (isAutowiredAvailable) { new AutowiredPropertiesRegister(ownerClazz, definitionRegister).registerProperties(registedBeanClazz); } } protected void registerBean(final String beanName, final Class propClazz, final Queue<Class> registedBeanClazz) { try { boolean doesRegisted = definitionRegister.doesHaveRegisted(beanName); if (doesRegisted) { return; } Class impl = definitionRegister.findImplementClass(ownerClazz, beanName, propClazz); if (impl == null) { return; } // AbstractBeanDefinition beanDefinition = // SpringBeanRegister.getAnnotatedGenericBeanDefinition(beanName, // impl, true); AbstractBeanDefinition beanDefinition = RegisterDynamicBean .getRootBeanDefinition(beanName, impl, null, true); definitionRegister.register(beanName, beanDefinition); registedBeanClazz.offer(impl); } catch (FindBeanImplClassException e) { definitionRegister.ignoreNotFoundException(e); } } }