1、通过注解@Import导入方式创建
a、新建MyImportBeanDefinitionRegistrar注册中心
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; import web0.services.Myservice; public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { protected String BEAN_NAME = "myservice"; public void dynamicConfiguration() throws Exception { } @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(BEAN_NAME)) { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(Myservice.class); beanDefinition.setSynthetic(true); registry.registerBeanDefinition(BEAN_NAME, beanDefinition); } } }
b、在配置类上加@Import引入上面的类
@Import(MyImportBeanDefinitionRegistrar.class) public class TestConfig{ }
c、这样操作后就可以使用spring的方式获取该bean了
d、使用自定义工厂创建bean
public class JdbcPlusBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AnnotationAttributes annoAttrs = AnnotationAttributes .fromMap(importingClassMetadata.getAnnotationAttributes(JdbcMapperScan.class.getName())); FastClasspathScanner scanner = new FastClasspathScanner(annoAttrs.getStringArray("value")); List<String> classes = scanner.scan().getNamesOfAllClasses(); for (String className : classes) { Class<?> clazz = MethodHandler.initClass(className); if (null != clazz) { String simpleName = clazz.getSimpleName(); String beanName = StringUtils.substring(simpleName, 0, 1).toLowerCase() + StringUtils.substring(simpleName, 1); if (!registry.containsBeanDefinition(beanName)) { RootBeanDefinition definition = new RootBeanDefinition( ); /*JdbcPlusFactoryBean是spring工厂*/ definition.setBeanClass( JdbcPlusFactoryBean.class ); ConstructorArgumentValues argumentValues = new ConstructorArgumentValues(); /*clazz 是要实例化的类*/ argumentValues.addGenericArgumentValue( clazz ); definition.setConstructorArgumentValues(argumentValues); definition.setRole( BeanDefinition.ROLE_INFRASTRUCTURE ); registry.registerBeanDefinition(beanName, definition); } } } } }
jdbcplus工厂:
public class JdbcPlusFactoryBean<T> implements FactoryBean<T> { protected Class<T> mapperInterface; public JdbcPlusFactoryBean() { } public JdbcPlusFactoryBean(Class<T> mapperInterface) { this.mapperInterface = mapperInterface; } @Override public T getObject() throws Exception { return MethodProxy.newInstance(mapperInterface) ; } @Override public Class<?> getObjectType() { return mapperInterface; } @Override public boolean isSingleton() { return true; } }