ImportBeanDefinitionRegistrar的使用(注册一个bean到spring的bean工厂)

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(IndexDao.class);
        GenericBeanDefinition gbd = (GenericBeanDefinition)bdb.getBeanDefinition();
        System.out.println(gbd.getBeanClassName());
        gbd.getConstructorArgumentValues().addGenericArgumentValue("com.lipan.entity.IndexDao");
        gbd.setBeanClass(MyFactoryBean.class);
        registry.registerBeanDefinition("indexDao",gbd);
    }
}
public class MyFactoryBean implements FactoryBean, InvocationHandler {
    Class t;

    public MyFactoryBean(Class t) {
        this.t = t;
    }

    @Override
    public Object getObject() throws Exception {
        Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{t}, new MyFactoryBean(t));
        return o;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println("proxy");
        Method method1 = o.getClass().getInterfaces()[0].getMethod(method.getName(), String.class);
        Select select = method1.getDeclaredAnnotation(Select.class);
        System.out.println(select.value()[0]);
        return null;
    }
}
@Configuration
@ComponentScan("com.lipan")
@Import(MyImportBeanDefinitionRegistrar.class)
public class MyConfig {
}
public interface IndexDao {
    @Select("Select * from tt")
    public String getStr(String str);
}
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
        IndexDao indexDao = (IndexDao)app.getBean("indexDao");
        indexDao.getStr("cdd");
    }
}
输出结果:

com.lipan.entity.IndexDao
proxy
Select * from tt

 

posted @ 2022-01-16 21:27  乖~摸摸头  阅读(163)  评论(0)    收藏  举报