Spring高阶用法之自定义业务对象组件化
作者:seeing 时间:2022-02-18 07:48:55
若干年前在使用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
标签:Spring,业务,对象,组件化
0
投稿
猜你喜欢
Java继承方法重写实现原理及解析
2021-12-31 16:35:54
C++实现哈夫曼编码
2022-07-20 20:39:01
基于Java实现Json文件转换为Excel文件
2022-08-04 23:53:15
dialog dismiss时键盘不消失的问题浅析及解决办法
2021-09-18 10:06:30
Java线程同步、同步方法实例详解
2023-10-16 07:10:53
Java中HashMap与String字符串互转的问题解决
2023-12-21 11:11:28
基于Java代码实现支付充值的通用流程
2021-09-04 00:48:45
Mybatis-Plus设置全局或者局部ID自增的实现
2021-11-27 00:30:03
spring cloud gateway中如何读取请求参数
2021-08-19 16:19:02
Java实现word/pdf转html并在线预览
2022-09-09 09:16:49
Netty分布式高性能工具类FastThreadLocal和Recycler分析
2023-03-20 09:13:09
Spring Boot热加载jar实现动态插件的思路
2021-09-25 16:37:55
记一次springboot服务凌晨无故宕机问题的解决
2023-07-25 04:50:23
c# 钩子学习笔记
2023-03-31 20:54:22
基于WPF实现用户头像选择器的示例代码
2022-07-07 16:48:18
Spring @Import注解的使用
2022-03-26 16:38:43
分析JVM源码之Thread.interrupt系统级别线程打断
2023-07-31 17:15:23
Android Studio打包jar及aar包的方法
2023-06-18 15:59:53
深入学习Java 热部署的知识
2023-10-16 18:23:24
seata springcloud整合教程与遇到的坑
2023-09-19 03:11:06