接前一篇文章
Java动态代理实战(一):在Spring中实现代理接口无实现类注入
自动注册到spring容器代码
//注意需要配置让Spring能扫描到此路径
@Component
public class ProxyDaoRegister implements ApplicationContextAware, BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 需要被代理的接口
Class<?> cls = UserTestDao.class;
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(cls);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
//这里是相当于调用BaseDaoProxyFactory中的setInterfaceClass()方法,详细的可以了解spring相关资料
definition.getPropertyValues().add("interfaceClass", definition.getBeanClassName());
// FactoryBean是一种特殊的Bean,这里的BeanClass是生成Bean实例的工厂,不是Bean本身。其返回的是该工厂Bean的getObject方法所返回的对象。
definition.setBeanClass(BaseDaoProxyFactory.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
// 注册dao
registry.registerBeanDefinition("userTestDao", definition);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
}
}
使用方式:直接使用@Autowired注入就可以
@Service("userTestService")
public class UserTestServiceImpl {
@Autowired
private UserTestDao testDao;
public void test() {
testDao.delete(1l);
}
}