• Service层使用Spring获取Mapper对象


    目前我们开发功能的流程中,在service层会手动创建SQLSession对象,并使用SQLSession对象获取Mapper接口的实例化对象,但是我们真正使用的是Mapper接口的对象,目前的代码编写方式极大的影响了开发效率,而且mybatis层和service 层之间的耦合性非常高

    解决:

    使用SpringIOC技术实现service层和mybatis层的解耦:说白了就是让Spring容器帮我们获取Mapper层接口的实例化 对象,我们直接从Spring容器中获取使用即可.

    实现:

    ①导入SpringIOC的jar包

    ②在src下创建并配置Spring的配置文件

        配置DataSource数据源的bean

    配置SQLSessionFactory的工厂bean(DataSource的bean)

    配置mapper扫描bean对象(SQLSessionFactory对象,扫 描路径)

    ③创建Spring容器对象,并获取Mapper接口的实例化对象完成数据库操作

    Controller层使用Spring解耦service层

    问题:

    在业务层使用Spring容器对象获取Mapper接口实例化对象后实现了

    service层和mybatis层的解耦,但是在controller层我们依然在Servlet

    中直接创建Service对象,耦合性过高.

    解决:

    service对象配置为bean对象,Servlet中从Spring容器中

    获取Service对象,完成功能开发.

    实现:

    ①在applicationcontext.xml文件中配置service的bean

    ②在servlet中的service方法中创建Spring容器对象

    ③在servlet中的service方法中从Spring容器中获取 service对象

    ④使用service对象完成功能处理

    [1] MVC项目中使用SpringIOC解耦的代码优化

    问题:

    目前的整合中,tomcat服务在接收到请求后,会创建一个线程来处理请求,每个线程之间都是相互独立运行.流程如下:

    ①浏览器发起登录请求

    ②tomcat服务器获取请求,创建新的线程处理请求

    ③调用请求的Servlet对象中的service方法

    假如10个用户发起登录请求,tomcat会创建10个线程处理请求.每个线程都需要调用UserServlet的service方法,而方法的调用依赖UserServlet的实例化对象,那么每个线程都创建一个UserServlet对象,还是UserServlet对象只有一个,但是被10个线程所共享使用呢?假如我们单线程操作,将UserServlet对象的service方法连续调用10此,代码如下:

    UserServlet us=new UserServlet()

    us.service();

    us.service();

    us.service();

    us.service();

    ..........

    而在此段代码中,我们完全可以声明10个线程,每个线程独立运行us.service().由此得出结论,在tomcat创建线程处理请求时,Servlet对象只会被创建一次,Servlet对象是多线程共享的.那么Servlet什么时候被创建呢?

    默认在第一次请求的时候被创建,往后就不会再次重新创建了,如果配置了loadOnStartUp则在服务器启动的时候就会完成初始化创建.

    ④Servlet中的service方法被执行,service方法进栈.

    然后创建Spring容器对象,内存堆中就会出现一个Spring容 器对象s1,而s1被创建的时候,会加载spring的配置文件,根 据配置文件创建对象(dataSource,factory,mapper,us).

    ⑤获取Spring容器中的业务层对象us

    ⑥调用us对象的登录业务方法

    ⑦登录业务方法进栈,又会创建一个新的Spring容器对象s2,

    s2被创建的时候,又加载解析Spring的配置文件,又创建 dataSource,factory,us,mapper的bean对象.

    ⑧在业务的登录方法中获取s2容器对象中的mapper对象完成 数据库操作,执行业务处理,登录业务方法处理完毕,返回结果 controller的service方法,然后业务方法出栈.

    ⑨servlet的service方法获取到业务层的返回值后,继续处理,然后响应处理结果给浏览器,service方法结束,service方法出栈,请求处理完毕,线程销毁.

    通过以上流程发现,目前的代码的结构,一个线程中会存在除Servlet对象以外10个对象,一旦高并发访问,会造成内存资源的极大的浪费,造成项目崩溃.

    解决:

    优化代码中的资源占比.

  • 相关阅读:
    AreEngine 求最小面积的外接矩形,非IEnvelope,表达不清楚了
    获取GeoScene Pro 90天免费试用版
    How to "Activate" a MapFrame in C#
    Arcengine获得模型(工具)是否存在
    ArcGIS Python获得一个数据库所有要素类
    ArcGIS Pro和Geoscene不能同时安装,因为是同一个软件
    Needs to run on the GUI thread解决
    The entity type 'ExtraPropertyDictionary' requires a primary key to be defined.
    Always Encrypted with Azure Key Vault
    Your startup project 'UnitTestNet6' doesn't reference Microsoft.EntityFrameworkCore.Design.
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14298083.html
Copyright © 2020-2023  润新知