自定义实现Spring Scope扩展

本文详细介绍了如何在Spring中扩展自定义Scope,以`TenantScope`为例,展示了其实现过程和注册到Spring容器的方法。通过创建`TenantScope`类并实现`Scope`接口,然后在`TenantBeanFactoryPostProcessor`中注册该Scope。在测试示例中,创建了两个`TenantBean`的实例,证明了自定义Scope的有效性。
摘要由CSDN通过智能技术生成

自定义实现Spring Scope扩展

本文简单介绍实现Scope扩展的方法,其实很简单只要实现Scope接口,并通过beanfactory的registerScope将自定义scope 注册到Spring容器。

Spring Scope

Scope描述
singleton默认spring 容器管理的bean 都是单例
prototype定义任意数量的对象实例
request只有web容器才有,一个http 请求对应一个对象实例
session只有web容器才有,每一个http session 对应一个对象实例.
application只有web容器才有, ServletContext 对应个对象实例.
websocket只有web容器才有,将单个 Bean 定义的范围限定为 WebSocket 的生命周期

自定义TenantScope --实现Scope 类

public class TenantScope implements Scope {

    private Map<String, Object> scopedObjects = Collections.synchronizedMap(new HashMap<String, Object>());
    private Map<String, Runnable> destructionCallbacks = Collections.synchronizedMap(new HashMap<String, Runnable>());

    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        if (!scopedObjects.containsKey(name)) {
            scopedObjects.put(name, objectFactory.getObject());
        }
        return scopedObjects.get(name);
    }
    @Override
    public Object remove(String name) {
        destructionCallbacks.remove(name);
        return scopedObjects.remove(name);
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        destructionCallbacks.put(name, callback);
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }

    @Override
    public String getConversationId() {
        return "tenant";
    }
}

实现注册到容器

public class TenantBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
        factory.registerScope("tenant", new TenantScope());
    }
}

编写测试demo

  • 定义tenantBean
public class TenantBean {

    private final String name;

    public TenantBean(String name) {
        this.name = name;
    }
    public void pringName() {
        System.out.println(String.format("Tenant from %s of type %s", this.name, this.getClass().getName()));
    }
}
  • 配置TenantBeanFactoryPostProcessor
@Configuration
public class TenantScopeConfig {

    @Bean
    public static BeanFactoryPostProcessor beanFactoryPostProcessor() {
        return new TenantBeanFactoryPostProcessor();
    }
}
  • 定义两个TenantBean的实例
@Configuration
public class TenantBeansConfig {

    @Scope(scopeName = "tenant")
    @Bean
    public TenantBean foo() {
        return new TenantBean("foo");
    }

    @Scope(scopeName = "tenant")
    @Bean
    public TenantBean bar() {
        return new TenantBean("bar");
    }
}
  • 运行springboot 项目,并获取TenantBean对应实例化的两个bean,并调用printName方法
@SpringBootApplication
public class SpringbootScopeDemoApplication {
    public static void main(String[] args) {
        
            ConfigurableApplicationContext ctx= SpringApplication.run(SpringbootScopeDemoApplication .class, args);
                 TenantBean foo = (TenantBean) ctx.getBean("foo", TenantBean.class);
            foo.pringName();
            TenantBean bar = (TenantBean) ctx.getBean("bar", TenantBean.class);
            bar.pringName();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值