springboot BeanDefinitionRegistryPostProcessor说明


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

                   

                            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值