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
浙公网安备 33010602011771号