谈谈我对spring的理解
spring是一个功能强大的框架
spring帮助我们开发者解决了很多问题,比如对象创建,方法功能增强,事务的处理等等一系列问题。
一谈到spring,免不了说他的IOC和AOP。IOC翻译成中文叫控制反转。网上对这个词实在是解释的晦涩难懂。我总结一句话:IOC帮我们创建功能强大的对象并且管理对象。
我们想一个问题,为什么我们要创建对象,因为我们调用方法需要对象。而且对象中可能还有些属性,并且我们还有可能在new完对象后执行这个对象的某个方法。甚至有时候
为了某些目的,我们还要创建代理对象。而且很多情况下我们创建的对象仅仅需要一个实例而已,也就是单利的对象。如果这些事情交给我们程序员来做,不是不可以,而是
太繁琐了,我们还要很重要的crud要去做呢。于是乎我们就把创建对象的任务交给了spring,这就是IOC。
不管我的理解对不对吧,IOC容器就是创建管理bean对象的。而且spring确实可以帮我们创建功能强大的bean对象,比如像上面提到的在属性填充完以后还可以进行方法的回调。
我想这对于拥有10年开发经验的java工程师来说应该不难处理吧。
spring创建的bean对象有多强大呢?比方说你想创建一个代理对象,并且原始对象的属性还要填充完毕,并且执行相关的生命周期方法,这些spring都可以帮我们做到。所以你说
spring牛不牛逼。这就是IOC。
那么对于aop就是要实现某个bean对象方法的增强。这种实现方式很多。spring选择了基于动态代理来进行方法的增强,当然spring也有个备选的方案,就是aspectj,这个比较繁琐
需要用到aspect编译器对java源码进行编译时候的增强,用的很少。spring用了cglib或者动态代理来创建对象,以前是这样做的,但是现在统一由cglib来创建代理对象。从而实现
aop功能。
当然还有个声明式事务功能,太好用了。这也是基于aop实现的
再谈谈spring的设计理念
也就是实现原理,当然不能把源码一行一行给你们解读。
我们先看我们实际开发干了什么?不就是想尽一切办法将数据插入到数据库中吗?(我这里只是说用到最多的业务情况啊)可是在插入之前,还要对数据的合法性进行校验,
还有可能先查询数据库,然后判断我们插入的数据是不是跟查询出来的数据有冲突,有冲突就不能插入。总之在插入或者修改或者删除数据库之前,要做各种各样的if else 判断
再把数据落实到对应的中间件中。数据落盘以后,还有可能要做一些操作。比方说,员工迟到这个数据记录在数据库中后,可能还会发一封邮件通知员工。哎,你想想,就为了
crud,我们怎么这么难啊。
其实如果仔细想一下,这何尝不是一种设计呢?就是在对我们的insert into或者updat,delete进行疯狂的拦截,最终达到我们的目的,不就是这样吗?
spring的设计理念就是把拦截理念发扬光大。比方说BeanPostProcessor接口,BeanFactoryPostProcessor接口,这些都是非常重要的拦截功能。
比方说bean的生命周期很多都是由BeanPostProcessor来拦截然后进行处理的。实例化前执行方法,实例化后执行方法,初始化前执行方法,初始化执行方法。
我们的aop实现就是在初始化后。包括属性的填充,@PostConstruct,@Value等相关注解的执行也是由BeanPostProcessor处理的。
还有各种aware接口的回调都是由BeanPostProcessor这个接口完成的。
前面说了BeanPostProcessor是对bean对象的一个拦截,或者说对bean对象的一个增强。那么BeanFactoryPostProcessor是对我们bean工厂对象的功能的增强,比如说
扫描到我们配置的bean生成BeanDefinition。还可以对BeanDefinition对象的修改。至于对BeanDefinition的详解包括spring源码的详解,以后再写吧,大家可以持续关注我。
我会一直输出,直到世界的尽头。。。。
再谈谈spring的扩展功能
spring给我们提供了很多扩展功能,比如上面提到的那两个拦截器,BeanPostProcessor,BeanFactoryPostProcessor。还有很多啊,但是切记啊,如果你不了解这些扩展机制的
执行过程或者说原理,使用不当可能造成不可预估的后果。实际开发中我们一般会实现InitializingBean这个接口做一些初始化操作,或者实现ApplicationContextAware接口来保存
ApplicationContext对象。其实ApplicationContext对象也可以进行依赖注入功能。spring的扩展点在第三方框架跟spring整合的时候有非常大的用处,比如经常使用FactoryBean,
ImportBeanDefinitionRegistrar,@Import注解等等很多扩展功能。包括spring的事件发布,我们知道spring内部有个refresh模板方法,在这个模板方法最后会执行这个方法finishRefresh
这个方法就发布了一个事件,springmvc就是处理了这个事件完成了springmvc组件的初始化(HandlerMapping,HandlerAdapter...),这一点很多教学视频都说错了。
我们程序员也可以写一个事件监听器来处理这个事件。
总之spring的扩展功能非常多,要慎用。不能过度依赖扩展功能,以免跟我们项目耦合非常严重。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?