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

Spring框架的介绍和使用

时间:2023-03-14 19:37:51 科技观察

本文主要是Spring的基本使用,推荐阅读时间5分钟。历史的选择Spring作为基础框架,在JavaEE发展的历史上,已经被成千上万的公司所选择。单独使用Spring的人很少,很多都是用Spring-Boot/Spring-Cloud开发的,但是Spring基础仍然是我们使用的基石。下面一起来聊聊Spring的基本使用。首先我们看一下Spring框架的整体架构如下:数据访问/集成,包括JDBC、ORM、OXM、JMS和Transaction模块;WEB模块,包括WebSocket、Servlet、Web、Portlet模块;核心容器,包括Bean模块、Core模块、Context模块和SpEL模块;其他部分,包括:AOP、Test等模块Spring类似框架MicronautQuarkusSpring核心功能核心功能:控制反转(IOC)、AOP非核心功能:事件驱动、国际化、资源管理、数据绑定、类型转换、SpEL、单元测试等等。PS:本文将在实践中用到核心函数。SpringBean容器控制反转(IOC)是Spring框架的核心功能之一。其本质是将用户创建bean的过程交给IOC容器来完成,实现容器创建bean和依赖bean的创建bean权限的倒置。.Bean的创建Spring容器创建Bean只需要三步:定义Bean创建Bean容器/Bean工厂获取Bean对象举个例子:publicclassTestMain{publicstaticvoidmain(String[]args){班级);学生student=applicationContext.getBean(Student.class);学生.study();学生睡眠();学生.study();}}@Configuration@Import(Student.class)classAppConfig{}@ComponentclassStudent{私有字符串名称;私有整数源;publicvoidstudy(){System.out.println("学习...");}publicvoidsleep(){System.out.println("正在休息...");}//settergetter}运行上面的代码,我们可以得到如下结果:learning...resting...studying...上面的代码执行了什么?其实我们可以把ApplicationContext理解成一个Spring容器对象,然后我们在AppConfig配置类中定义Spring容器来帮我们加载那些bean,最后通过getBean方法获取我们注册的Bean对象。如下图所示:这个过程中用到的关键接口/类有哪些?BeanFactory?是Bean的抽象工厂,是我们ApplicationContext的一个父接口。BeanDefinition是Bean定义信息,比如beanName、className、isAbstract等Bean定义信息。DependencyInjection(DI)SpringIOC容器主要解决Bean的创建和依赖管理的问题。依赖注入常见的方式有两种:属性注入,构造函数注入,属性注入,通过成员属性自动注入bean@ComponentclassStudent{@AutowiredprivateAddress地址;//...}@Componentclass地址{//...}Student类和Address类可以通过@Component标记为bean对象。可以通过@Autowired自动注入依赖bean。构造函数注入通过构造函数实现Bean的自动注入。@ComponentclassStudent{publicStudent(Addressaddress){this.address=address;}}@ComponentclassAddress{//...}Spring的IOC解决了什么问题?容器化,Spring包含并管理应用程序中对象的生命周期和配置(配置为单例或原型,何时使用,何时销毁)。为了方便解耦和简化开发,Spring是一个大工厂,可以将所有的对象创建和依赖维护交给Spring管理,实现松耦合。本着高内聚低耦合的思想,这个特性也被称为IOC(InversionofControl)。在AOP编程的支持下,Spring提供了面向切面的编程,可以方便的实现程序的权限拦截、运行监控等功能。它是通过动态代理和CGlib实现的,底层原理是反射。声明式事务的支持是通过AOP实现的。不需要通过编程来管理事务,这样就不需要在业务逻辑代码中混入事务管理代码,只需在配置文件中进行相关的事务规则声明,然后将事务规则应用到业务逻辑中即可。方便程序测试,Spring对Junit4的支持,可以通过注解方便地测试Spring程序。方便集成各种优秀的框架。Spring不排斥各种优秀的开源框架,直接支持各种优秀的框架(如Struts2、Hibernate、MyBatis等)。异常处理,Spring提供了方便的API,将特定技术相关的异常转换为一致的未检查异常(如JDBC、Hibernate或JDO抛出的异常)。SpringMVC还有一个集中异常处理的思想,将异常抛给SpringMVC框架,由框架处理异常。为了降低JavaEEAPI的使用难度,Spring对一些JavaEE开发中非常难用的API(JDBC、JavaMail、远程调用等)进行了封装,大大降低了这些API的使用难度。SpringAOPAspect-orientedAOP(AspectOrientedProgramming)即面向切面的意思。了解AOPJava是一门面向对象(OOP)的编程语言,但是它有一个缺点就是当需要为多个没有继承关系的对象引入一个共同的行为时,比如:日志记录、授权验证、事务管理、访问统计等行为,不易维护,重复代码较多,AOP可以作为AOP的补充。比如:我们有两个逻辑登录服务和订单服务,需要在它们的调用前后进行:权限验证、日志记录等公共逻辑。通过OOP实现,我们需要做一个逻辑模板:权限验证,具体逻辑(登录,下单),日志记录。通过AOP的方式,我们只需要在具体的逻辑(登录、下单)前后做一个自定义的切点来进行权限验证和日志记录。如下图所示:经过AOP处理后,我们可以减少对公共对象的引用,通过非继承处理切入逻辑的拦截,实现公共逻辑与业务逻辑的松耦合关系。AOP实现Spring通过代理实现AOP,Java代理有两种模式:静态代理和动态代理。静态代理:静态代理是指在程序运行前编译.java文件后存在于代理类中的字节码.class文件。动态代理:动态代理是指在运行时生成代理对象,在程序运行过程中通过JVM反射等动态机制来确定代理逻辑。Spring的两种代理模式:JDK代理:核心类JdkDynamicAopProxy。GCLIB代理:核心类ObjenesisCglibAopProxy。代理有两种选择:如果bean实现了接口,就使用JDK代理,如果不实现接口,就使用GCLIB代理。AOP的使用假设已经有一个提供登录服务的UserService类。我们需要为这个业务做【授权验证】和【日志记录】两个通用逻辑,可以通过AOP解决,不需要修改UserService类的代码。.示例如下://1.测试类publicclassAopTest{publicstaticvoidmain(String[]args){ApplicationContextapplicationContext=newAnnotationConfigApplicationContext(AopConfig.class);UserServiceuserService=applicationContext.getBean(UserService.class);userService.login("admin","123456");}}//2.配置类@EnableAspectJAutoProxy@Configuration@Import({UserService.class,ValidateAspect.class})classAopConfig{}//业务类@ComponentclassUserService{publicStringlogin(Stringusername,Stringpassword){System.out.println("用户名:"+username+",password:"+password);返回“确定”;}}//Aspect@Aspect@ComponentclassValidateAspect{@Pointcut("execution(public*io.zhengsh.simu.spring.UserService.*(..))")publicvoidservicePoint(){//什么都不做}@Around("servicePoint()")publicObjectdoAroundService(ProceedingJoinPointjoinPoint)throwsThrowable{System.out.println(“验证参数调用!!!”);返回joinPoint.proceed();}}maven依赖org.springframeworkspring-core${spring.version}org.springframeworkspring-beans${spring.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-aop${spring.version}org.aspectjaspectjweaver1.9.9.1参考文档Spring官方文档骆驼整理说-SpringAOPJava-为什么要用Spring框架