@Autowired动态代理Bean

 

1. 问题引出

    

    如上图,之前的逻辑是项目只有一个mongodb,应用通过mongodbTemplate对mongodb进行操作。

    但是,后来业务发生了变化,需要按照租户(tenant)分成两组(group1,group2),将两组不同租户的相关数据存入到两个不同的mongodb中,如下图所示。

 

2. 解决方案

2.1 分发器模式

    弄一个mongodb操作的分发器,根据tenant和dispatcherSelector选择不同的mongoTemplate对mongodb进行操作。但是现状是现有的项目中mongodbTemplate分散在各业务层,改动大。

    放弃!!!

2.2 postprocessor动态代理

2.2.1 注入bean

    /**
     * 使用时,注入这个bean,它将会被代理,根据请求的不同选择daoTemplate01或daoTemplate02
     **/

    @Bean
    @Primary
    public DaoTemplate daoTemplate() {
        //可以随意写一个,防止注入失败,最后该bean会被动态代理
        return new DaoTemplate01();
    }

    @Bean
    public DaoTemplate daoTemplate01() {
        return new DaoTemplate01();
    }

    @Bean
    public DaoTemplate daoTemplate02() {
        return new DaoTemplate02();
    }

2.2.2 动态代理

@Slf4j
@Component
public class DaoTemplateProxy implements BeanPostProcessor {

    @Autowired
    @Qualifier("daoTemplate01")
    private DaoTemplate daoTemplate01;

    @Autowired
    @Qualifier("daoTemplate02")
    private DaoTemplate daoTemplate02;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //只代理daoTemplate
        if (bean instanceof DaoTemplate && "daoTemplate".equals(beanName)) {
            bean = getProxyBean(bean);
        }
        return bean;
    }

    private Object getProxyBean(Object bean) {
   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过使用@Autowired注解和@Bean(name)注解,可以将bean注入到类中。@Autowired注解用于将对象自动装配到类中,根据类型和beanName获取对应的实例集合。而@Bean(name)注解可以在@Configuration类中定义bean,并指定bean的名称。这样,在需要使用该bean的地方可以通过@Autowired注解将其注入进来。需要注意的是,使用@Autowired注解时,如果有多个匹配的bean,则需要使用@Qualifier指定具体的bean名称。 例子: ``` @Configuration public class AppConfig { @Bean(name = "myBean") public MyBean createMyBean() { return new MyBean(); } } @Service public class MyService { @Autowired @Qualifier("myBean") private MyBean myBean; // ... } ``` 在上面的例子中,通过在@Configuration类中使用@Bean(name)注解将MyBean定义为一个bean,并指定其名称为"myBean"。然后在MyService类中使用@Autowired注解将myBean注入进来,并通过@Qualifier指定了具体的bean名称。这样就可以在MyService类中使用myBean对象了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [通过@Autowired注解注入bean的顺序,以及@bean注入.rar](https://download.csdn.net/download/weixin_43812522/13104892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [@Autowired动态代理Bean](https://blog.csdn.net/besthezhaowen/article/details/116127970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值