文档章节

谈一谈 Bean的作用域

哈库纳
 哈库纳
发布于 2016/10/01 05:46
字数 659
阅读 63
收藏 0
点赞 0
评论 0

    Hasor 在管理 Bean 的时候支持作用域。一个典型的作用域应用场景就是“单例”,单例作用域的表现是整个应用程序中只保存一份。

    另外一个作用域的例子是用户登录网站之后web应用程序通过 session 保持会话。当然你可以根据应用业务实际场景来决定作用域的用处。

    在例如,在一个应用平台的项目中。每个应用都是一个独立的包,每个应用都有自己的运行信息。这些运行信息彼此隔离在不同的应用中,这种场景就很适合使用作用域。

    好了,有关作用域究竟是个什么东西,已经说的很明白了。现在我们回到最初的问题。Hasor 的 Bean 如何实现不同作用域之间的隔离。

    在 Hasor 中实现中完成作用域需要实现 Scope 接口,这个接口只有一个 scope 方法。下面就以 HttpSession 为作用域范围实现 Scope 接口的例子:

public class SessionScope implements Scope{
    private static final ThreadLocal<HttpSession> session = new ThreadLocal<HttpSession>();

    public <T> Provider<T> scope(Object key, Provider<T> provider) {
        HttpSession httpSession = session.get();
        if (httpSession == null) {
            return provider;
        }
        String keyStr = "session_scope_" + key.toString();
        Object attribute = httpSession.getAttribute(keyStr);
        Provider<T> finalProvider = provider;
        if (attribute == null) {
            httpSession.setAttribute(keyStr, provider);
        } else {
            finalProvider = (Provider<T>) httpSession.getAttribute(keyStr);
        }
        return finalProvider;
    }
}

     在例子中为了避免保存到 Session 中的 Bean 和本身 Session 中的数据 key 出现冲突,我们特意加了一个前缀用于区分。

    现在作用域的功能是有了,但是我们的 HttpSession 对象的还没有做初始化。这次我们来实现 Filter 接口,在每次 request 请求到来的时候把 Session 都更新到 ThreadLocal 中。在访问结束之后再把 ThreadLocal 清理掉。

    下面来看改造了之后的 Scope 代码:

public class SessionScope implements Scope, Filter {
    private static final ThreadLocal<HttpSession> session = new ThreadLocal<HttpSession>();

    public void init(FilterConfig filterConfig) throws ServletException { /**/ }
    public void destroy() { /**/ }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            if (session.get() != null) {
                session.remove();
            }
            session.set(((HttpServletRequest) request).getSession(true));
            chain.doFilter(request, response);
        } finally {
            if (session.get() != null) {
                session.remove();
            }
        }
    }

    public <T> Provider<T> scope(Object key, Provider<T> provider) {
        HttpSession httpSession = session.get();
        if (httpSession == null) {
            return provider;
        }
        String keyStr = "session_scope_" + key.toString();
        Object attribute = httpSession.getAttribute(keyStr);
        Provider<T> finalProvider = provider;
        if (attribute == null) {
            httpSession.setAttribute(keyStr, provider);
        } else {
            finalProvider = (Provider<T>) httpSession.getAttribute(keyStr);
        }
        return finalProvider;
    }
}

    从上面例子代码中看到进入 filter 时做了 Session 的初始化将其保存到 ThreadLocal ,离开之后又把 ThreadLocal 清理掉。

    最后我们在 Hasor 初始化的时候把 Scope 配置到 Hasor 中。

public class StartModule extends WebModule {
    public void loadModule(WebApiBinder apiBinder) throws Throwable {
        ...
        SessionScope scope = new SessionScope();
        apiBinder.filter("/*").through(0, scope);
        apiBinder.registerScope("session", scope);
        ...
    }
}

    接下来使用这个 Scope:

apiBinder.bindType(UserInfo.class).toScope(new SessionScope());
//or
apiBinder.bindType(UserInfo.class).toScope("session");

 

© 著作权归作者所有

共有 人打赏支持
哈库纳

哈库纳

粉丝 955
博文 89
码字总数 149803
作品 4
杭州
后端工程师
Maven配置Shiro使用常见错误

shiro的安全性当然不用说了,这里谈一谈我配置中遇到的问题:由于本地Maven仓库不给力,好多包都不匹配。 1、shiroFilter 错误 bean注入失败,最可能的是缺少jar包: 常见的是: org.apache...

boonya
2012/11/23
0
0
Java工程师面试题整理[社招篇]

http://blog.csdn.net/jackfrued/article/details/44921941 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类...

HD243608836
2017/12/12
0
0
JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠
04/09
0
0
我们谈一谈CocosCreator

作者:不洗碗工作室 - 欣仔 版权归作者所有,转载请注明出处 节点操作 我们创建一个场景时,默认会创建一个Canvas节点,之后我们可以在Canvas下创建子节点或在Canvas同级创建兄弟节点。 在节...

不洗碗工作室
05/02
0
0
用 Hasor 谈一谈MVC设计模式

MVC 是一个老生常谈的东西早已不是什么稀罕物件,不过在这里还是扒一扒到底都有多少种 MVC。 一、经典 MVC 先说最经典的 MVC,一个请求控制器的请求,负责读取数据,然后将数据派发到试图上。...

哈库纳
2016/09/29
168
0
springMvc源码学习之:利用springMVC随时随地获取HttpServletRequest等对象

一、准备工作: 在web.xml中添加 [html]view plain copy org.springframework.web.context.request.RequestContextListener 二、使用方法: 1、方法一:通过代码实现 [java]view plain copy ......

无信不立
2016/09/23
0
0
Vue组件实战

最近看了下Vue组件的相关知识,除了官网也推荐这篇博客http://www.cnblogs.com/keepfool/p/5637834.html,但是这篇博客中用的是v1.0.25,我就用最新的v2.4.4来模仿下文中的例子,也一起谈一谈下...

juexingzhe
2017/12/25
0
0
Spring的作用域以及RequestContextListener作用

一、配置方式 在Spring2.0中除了以前的Singleton和Prototype外又加入了三个新的web作用域,分别为request、session和global session,如果你想让你的容器里的某个bean拥有其中某种新的web作用...

丶Lion
2015/08/29
1K
1
spring之Bean的作用域

一、默认情况下,spring应用上下文中所有bean都是作为以单例的形式创建的。 spring定义了多种作用域,可以基于这些作用域创建bean 1.单例(singleton):在整个应用中,之创建bean的一个实例...

图样图森破
2016/12/19
35
0
Spring框架参考手册_5.0.0_中文版_Part II_3.5

文章作者:Tyan 博客:noahsnail.com 3.5 Bean的作用域 当你创建bean定义时,你创建了一个配方用于创建bean定义中定义的类的实例。bean定义是配方的想法是很重要的,因为这意味着对于一个类,...

Quincuntial
2016/10/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mybaitis 通过Mapping 实现多表查询

1.实体类 1.1 用于做多表查询的类 public class CustomerCard { private Integer id;//主键 private String cardNumber; private Integer customerId;//用户id private String customerName;......

kuchawyz
10分钟前
0
0
Java语言学习(八):集合类框架

Java中提供了各种数据集合类,这些类主要用于保存复杂结构的数据。下面将介绍常用的几种集合类的用法。 ArrayList集合可以看做一个动态的数组,比普通数组更加灵活,更适合保存未知数量的数据...

海岸线的曙光
11分钟前
0
0
SpringBoot下Redis相关配置是如何被初始化的

参考网页 SpringBoot集成Redis的原理 https://blog.csdn.net/hry2015/article/details/74276423 https://blog.csdn.net/hry2015/article/details/75451705 application.yml配置文件中的属性是......

karma123
12分钟前
1
0
数据库事务的四大特性以及事务的隔离级别

本篇讲述数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是...

Java大蜗牛
19分钟前
0
0
Spring Boot 整合 MyBatis/通用Mapper/PageHelper分页插件

整合MyBatis 整合通用Mapper 1. POM依赖配置 <properties><mapper.starter.version>2.0.3-beta1</mapper.starter.version></properties><!-- 通用Mapper --><dependency><groupId>t......

OSC_fly
28分钟前
0
0
CentOS7 双网卡绑定

环境 操作系统 CentOS7.5,禁用 NetworkManager 服务 网卡 eth0 网卡 eth1 绑定网卡 bond0 网卡 eth0 配置 修改 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetBOOTPROTO=noneD......

Colben
29分钟前
0
0
zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
46分钟前
15
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
46分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
49分钟前
6
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
54分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部