springboot BeanDefinitionRegistryPostProcessor说明
***********************
相关类与接口
BeanDefinitionRegistryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}
BeanDefinitionRegistry
public interface BeanDefinitionRegistry extends AliasRegistry {
void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException;
void removeBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
boolean containsBeanDefinition(String var1);
boolean isBeanNameInUse(String var1);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
}
AliasRegistry
public interface AliasRegistry {
void registerAlias(String var1, String var2);
void removeAlias(String var1);
boolean isAlias(String var1);
String[] getAliases(String var1);
}
***********************
示例:模拟dao层接口实现
*****************
dao 层
QueryDao
public interface QueryDao {
@Select("select id,name,age from user where id=#{id}")
String select(Integer id);
}
*****************
myannotation 层
Select
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Select {
String value();
}
*****************
config 层
CustomFactoryBean
public class CustomFactoryBean<T> implements FactoryBean<T> {
private final Class<T> mapper;
@Resource
private CustomJDBCTemplate jdbcTemplate;
public CustomFactoryBean(Class<T> mapper){
this.mapper=mapper;
}
@Override
public Class<?> getObjectType() {
return mapper;
}
@Override
@SuppressWarnings("unchecked")
public T getObject() throws Exception {
return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{mapper}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Select select=method.getAnnotation(Select.class);
String value=select.value();
value=value.replace("#{id}",args[0].toString());
return jdbcTemplate.execute(value);
}
});
}
}
CustomBeanDefinitionRegistryPostProcessor
@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
GenericBeanDefinition beanDefinition=new GenericBeanDefinition();
beanDefinition.setBeanClass(CustomFactoryBean.class);
beanDefinition.setScope("singleton");
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(QueryDao.class);
beanDefinitionRegistry.registerBeanDefinition("queryDao",beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
CustomJDBCTemplate
@Component
public class CustomJDBCTemplate {
public String execute(String value){
System.out.println("CustomJDBCTemplate:"+value);
return value;
}
}
*****************
controller 层
HelloController
@RestController
public class HelloController {
@Resource
private QueryDao queryDao;
@RequestMapping("/hello")
public String hello(){
return queryDao.select(1);
}
}
***********************
使用测试
localhost:8080/hello,控制台输出:
2021-08-08 10:27:38.098 INFO 11608 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-08-08 10:27:38.110 INFO 11608 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 12 ms
CustomJDBCTemplate:select id,name,age from user where id=1