当前位置: 首页 > 科技观察

为什么项目中一定要用Spring?Spring的四大策略是什么?

时间:2023-03-16 23:58:56 科技观察

相信每个Java开发人员在工作和学习中都知道如何使用Spring,但是对于一个初级开发工程师来说,仅仅了解如何使用并能够通过Spring快速完成任务应该就足够了,但是,如果你还想更上一层楼,系统的学习和掌握它的基本原理是必不可少的。大家在面试的时候,Spring应该是逃不掉的关卡。熟练使用它并不难。了解其基本原理是超越其他人的一步。本文将简单说说Spring的一些知识,希望能在面试的路上对你有所帮助。Spring是一个开源框架,最初是为了解决企业级应用开发的复杂性而创建的。Spring不限于服务器端开发,任何java应用程序都可以变得更简单、更可测试,并且与Spring松散耦合更好。为了降低Java开发的复杂度,Spring采用了四大关键策略:基于POJO的轻量级微创编程;通过依赖注入和面向接口实现松散耦合;基于方面和约定的声明式编程;通过方面和模板减少样板代码。Spring所做的一切几乎都是围绕以上四种策略实现的,其核心是:简化java开发。1、在轻量级POJO的日常开发过程中,大部分人可能会觉得很多框架会强制应用程序继承它们的类或者实现它们的接口,这会导致程序和框架的绑定。说到这里,我们现在的框架是这样的。每个模块,包括DAO和Service,都会强行继承框架中的类,应用和框架紧密绑定。Spring尽量避免因为它自己的API而弄乱你的应用程序代码,Spring不会强迫你去实现它的接口或者继承它的类。最严重的是一个矿会用到Spring注解。Spring的非侵入式编程意味着这个类在Spring应用程序中扮演的角色与在非Spring应用程序中一样。2.依赖注入任何有意义的应用程序都必须由多个类组成。在没有Spring的情况下,每个对象都负责管理与自己协作的对象的引用,这会导致耦合度高,测试困难。代码。publicclassTrainimplementsTransport{privateWaterwater;publicTrain(){water=newWater();}publicvoidcatchGoods(){water.waterSomthing();}}可以看到上面的代码,Train在自己的构造函数中创建Water对象,导致没有紧耦合这两个对象中,这列火车可以运水灌溉农田,但如果这列火车用来运煤取暖,就未必合适了。在单元测试的时候,我们需要保证在catchGoods方法执行的时候waterSomthing也能执行。如果我们这样做,则无法执行单元测试。耦合有两个方面。一方面,紧耦合的代码很难测试、使用和理解。修改一个地方可能会导致其他的bug(记得我刚去公??司的时候,讲开发规范,一个接口尽可能多。只做一件事,不要用一个接口同时为多个地方提供服务同时),另一方面,完全解耦的代码什么也做不了。使用Spring,对象依赖关系由负责协调每个对象的第三方组件完成。对象不需要自己创建。依赖注入会自动将依赖关系交给目标对象,而不是让对象自己获取。publicclassTrainimplementsTransport{privateWaterwater;publicTrain(Waterwater){this.water=water;}publicvoidcatchGoods(){water.waterSomthing();}}经过我们的改动,上面不再是Train自己创建的,而是作为构造函数参数传入的,这也是依赖注入的一种方式:构造函数注入。这样也实现了松耦合。在应用程序组件之间创建协作的行为通常称为组装。Spring有多种组装bean的方式,XML是一种常用的方式。在上面的xml文件中,有两个对象在Spring中被声明为一个bean。在Train中,对Water的引用在构造期间作为构造函数参数传入。@ConfigurationpublicclassTrainConfig{@BeanpublicTransporttrain(){returnnewTrain(water());}@BeanpublicWaterwater(){returnnewWater();}}以上是基于java的配置,两种配置效果相同。Spring通过应用程序上下文加载bean定义并组装它们。Spring应用程序上下文单独负责对象的创建和组装。Spring有多个上下文实现。它们之间的主要区别在于如何加载配置。publicclassapplication{publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("classpath:application_example.xml");Trainbean=context.getBean(Train.class);bean.catchGoods();}}这里的主要方法是基于application_example.xml创建一个Spring应用上下文,然后就可以得到一个实例对象,直接调用方法即可。3、面向方面的编程系统是由不同的组件组成的,这些组件不仅实现了自己的核心功能,还承担着其他的职责。比如日志记录、事务管理、安全性通常贯穿于整个项目中的各个组件。如果这部分没有系统地处理,那么你的代码就会包含很多重复的代码。如果将这些单独抽象成一个模块,其他模块只是调用它的方法,方法调用仍然会出现在各个模块中。AOP会将这些服务模块化,以声明的方式应用到它们需要影响的模块中,这样其他模块就只关注自己的业务,不需要了解这些服务的相关逻辑和代码。看到上图,我们可以把切面想象成一个外壳,覆盖了很多组件。在AOP的帮助下,这些功能层可以包裹在核心业务层周围。这些功能层可以以声明的方式灵活应用到系统中,其他业务应用甚至不知道它的存在。想了解更多Java学习资料,可以关注“武汉千峰”微信公众号获取!