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;
}
}