栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自定义实现Spring Scope扩展

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义实现Spring Scope扩展

自定义实现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 scopedObjects = Collections.synchronizedMap(new HashMap());
    private Map destructionCallbacks = Collections.synchronizedMap(new HashMap());

    @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();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862080.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号