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
  • asp之家 软件编程 m.aspxhome.com