利用 imporBeanDefinitionRegistrar 得到 registrar
回归主题
场景如下:
一个 Service 中 @Autowried 了一个 接口 Dao,
- 将 Dao 接口变为对象 --> 动态代理
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
System.out.println(" in register....");
// 得到 bd
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CarDao.class);
GenericBeanDefinition beanDefinition = (GenericBeanDefinition) builder.getBeanDefinition();
registry.registerBeanDefinition("CarDao",beanDefinition);
}
}
这样做会报Failed to instantiate的错误,因为在 genericBeanDefinition()方法中传入的是一个接口,无法实例化
此时,借助 FactoryBean,得到一个 object,(动态代理接口后的对象 ):
@Component
public class MyFactroyBean implements FactoryBean<CarDao>{
@Override
public CarDao getObject() throws Exception {
Class<?>[]classes = new Class<?>[]{CarDao.class};
CarDao proxy = (CarDao) Proxy.newProxyInstance(this.getClass().getClassLoader(),classes,new myInvocationHandler());
return proxy;
}
@Override
public Class<?> getObjectType() {
return CarDao.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
// myInvocationHandler() 可以做一些事情,此处只是打印了一下
用一个配置类扫描
@Configuration
@ComponentScan("com.wxt.*")
@Import(MyImportBeanDefinitionRegistrar.class)
public class appConfig {
}
main函数
public class test3 {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext =
new AnnotationConfigApplicationContext(appConfig.class);
CarDao dao = (CarDao) annotationConfigApplicationContext.getBean("CarDao");
dao.selectList();
}
}