Spring高阶用法之自定义业务对象组件化
作者:seeing 发布时间:2022-02-18 07:48:55
标签:Spring,业务,对象,组件化
若干年前在使用SpringMVC的时候,发现springMVC可以把HttpSession,HttpRequest组件化注入:
@Autowired
HttpSession session;
@Autowired
HttpRequest httpRequest;
于是花了30分钟追踪了相关的源代码彻底摸清其原理,并且决定将用户(User/Principle)也组件化(尽管当时工作处于极其忙碌的状态,也忍不住去研究)。
方法如下:
1. 定义IPrincipal(IUser)接口
interface IPrincipal extends Serializable {
IPrincipal get()
}
2. 实现PrincipalObjectFactory
class PrincipalObjectFactory implements ObjectFactory<IPrincipal>, Serializable {
@Override
IPrincipal getObject() {
def requestAttr = RequestContextHolder.currentRequestAttributes()
def request = requestAttr.getRequest()
def p = new PrincipalHelper(request).get()
new IPrincipal() {
@Override
IPrincipal get() {
p
}
}
}
}
3. 在spring的上下文中注册依赖处理器
beanFactory.registerResolvableDependency(IPrincipal, new PrincipalObjectFactory())
只需要以上步骤,即可使用@Autowired在业务代码中注入IPrincipal(IUser),并且保证其线程安全。
原理:
阅读spring源码会发现,spring在注入接口时如果发现没有接口的实现类,就会从ResolvableDependency中寻找相关的依赖解决器。
如果注册了相关的依赖解决器,会给此接口注入一个代理类,这个代理类的target就是ObjectFactory#getObject,在这里就可实现你的IPrincipal(IUser)获取了。
总结
1 使用这个方式将IPrincipal(IUser)组件化,而不是通过工具类的方式去获取。这样的方式充分体现了spring的依赖注入的思想,并且系统耦合性也降低不少。
2 即使在spring上下文中注入ObjectFactory,spring并不会自动注册,需要手动注册。
来源:https://segmentfault.com/a/1190000018582772


猜你喜欢
- 它可以做什么?它做的事情当然是生成新类或修改原始的类,比如你遇到这样的情况下就可以使用:反射好慢,曾见过一个大厂大量是Gson,由于Gson
- 利用Java连接MySQL做登陆界面,供大家参考,具体内容如下1、首先需要建立一个类,在这里,我命名为newLoginnewLogin类的代
- 背景在一些业务场景, 往往需要自定义异常来满足特定的业务, 主流用法是在catch里抛出异常, 例如:public void deal()
- 说起EventTrigger事件触发器,它的使用可以说是无处不在,EventTrigger继承了很多的事件接口,这些接口对我们开发是十分有用
- 一、简介(1)、MySQL是一个关系型数据库系统,是如今互联网公司最常用的数据库和最广泛的数据库。为服务端数据库,能承受高并发的访问量。(2
- 来源:https://www.cnblogs.com/fanweisheng/p/11440
- 在我们深入探讨C#序列化和反序列化之前我们先要明白什么是序列化,它又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。序列化就
- Android强制异步转同步方法,供大家参考,具体内容如下Android系统中规定耗时任务需要在异步线程中进行,特别是网络请求必须在异步线程
- 1.传递引用在一个方法中将一个对象的引用传递给另外一个方法,引用指向的对象是同一个public class Person {int age;
- Linq中的排序操作符包括OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse
- 定时任务技术趋势简介:定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报
- Java未被捕获的异常在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的。下面的小程序包括一个故意导致被零除错
- Vector的基本介绍1.:Vector类的定义:public class Vector<E> ext
- oshi查看cpu信息OSHI可以跨平台查看服务器信息,其中cpu负载信息为当前占用CPU的时间。需要在一段时间内获取两次,然后相减得出这段
- mybatis自带对枚举的处理类org.apache.ibatis.type.EnumOrdinalTypeHandler<E>
- 本文介绍为了实现高效并发,虚拟机对 synchronized 做的一系列的锁优化措施高效并发是从 JDK5 升级到 JDK6 后一项重要的改
- 测试代码如下: package swt_jface.demo; import org.eclipse.jface.window.Applic
- 前言:我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键
- 一、分析源码我们学完之前的框架,大概知道静态资源过滤是由mvc处理的,然后在分析自动装配的时候会遇到WebMvcAutoConfigurat
- 最近做了关于在Android设备上外接扫码的项目,在此记录一下关于Android USB扫码枪获取内容的问题首先我这边使用是USB HID的