XML开发和注解开发的总结

Mybatis

  • XML开发

    • 需要mybatis整体的配置文件,一般命名为mybatis-config.xml

    • 在整体配置文件中配置mybatis的环境信息如数据源和事务管理器和mapper映射器等等

      • <mappers><mapper resource="mapper/UserMapper.xml"/>
        </mappers>
        
    • 编写mapper接口,单独编写对应接口的xml的文件,该文件中存储SQL

    • 使用XML开发需要读取整体配置文件信息,并获取相应的接口

      •     public void setUp() throws Exception {// 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);}
        
  • 注解开发---(可以纯注解)

    • 一般mybatis中的注解开发也需要整体配置的xml文件

    • 在整体xml配置文件中配置mapper的映射器

      • <mappers><mapper class="com.example.mapper.UserMapper"/>
        </mappers>
        
    • 编写mapper接口,接口上不需要添加注解,直接在接口方法中使用相应的注解编写SQL语句

    • 读取XML配置信息,并获取相应的接口

      •     public void setUp() throws Exception {// 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);}
        

Spring容器

  • XML开发

    • 需要spring容器的整体配置文件,通常使用applicationContext.xml作为默认的Spring配置文件名称

    • 在该配置文件中编写bean代码即可

    • XML开发需要读取整体配置文件获取Spring容器

    • public void testSpring() {// 加载 Spring 配置文件ApplicationContext context = new 		ClassPathXmlApplicationContext("applicationContext.xml");// 获取 BeanUserService userService = (UserService) context.getBean("userService");
      
  • 注解开发

    • 注解开发不需要xml配置文件

    • 需要一个配置类,使用 @Configuration 注解标记一个类为配置类

      • @Configuration 的作用
      1. 标记配置类。
      2. 启用代理模式,确保 @Bean 方法是单例的。
      3. 支持 @Import@ComponentScan
      • 不加 @Configuration 的问题
        1. @Bean 方法可能不是单例。
        2. 不支持 @Bean 方法之间的依赖注入。
  • 在这个配置类中配置扫描的包路径

  • @Configuration
    @ComponentScan(basePackages = "com.example") // 指定扫描的包
    public class AppConfig {
    }
    
    • 获取Spring容器时加载该配置类即可

    • public class MainApp {public static void main(String[] args) {// 加载配置类,初始化 Spring 容器ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 从容器中获取 BeanUserService userService = context.getBean(UserService.class);// 使用 BeanuserService.doSomething();}
      }
      

Tomcat

  • XML开发
    • tomcat项目为web应用,一个web应用下存在web.xml文件
    • 在web.xml文件中配置servlet或者过滤器的全部信息,包括映射路径等等
    • 使用时启动tomcat服务器即可,不需要手动加载web.xml文件
  • 注解开发
    • 不在web.xml中配置servlet或者过滤器的信息,而直接在类上加注解实现
    • @WebServlet 注解定义 Servlet, @WebFilter 注解定义 Filter。
    • 不需要额外的扫描配置,直接使用注解定义完类启动tomcat服务器即可

SpringMVC

  • XML开发

    • 需要在web.xml文件中配置DispatcherServlet

    • DispatcherServlet中需要使用初始化参数,来配置Spring容器配置文件的路径

      • <servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc-config.xml</param-value></init-param><load-on-startup>1</load-on-startup>
        </servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
        </servlet-mapping>
        
    • 需要在Spring配置文件中配置扫描包的路径以及开启mvc注解驱动

      • <!-- 启用组件扫描,扫描控制器 -->
        <context:component-scan base-package="com.example.controller" /><!-- 启用注解驱动 -->
        <mvc:annotation-driven />
        
    • 使用注解配置访问路径等信息后启动tomcat服务器即可

  • 注解开发

    • 编写一个类继承AbstractAnnotationConfigDispatcherServletInitializer,该类会被tomcat自动扫描并加载为DispatcherServlet

    • 实现该继承类中的方法来指定Spring容器配置类的的class文件

      • public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {// 配置根应用上下文(非 Web 相关的 Bean,如服务层、数据层)//这个就是配置Spring容器,指定为配置Spring容器的配置类即可@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[] { RootConfig.class };}// 配置 Web 应用上下文(Web 相关的 Bean,如控制器(Controller)、视图解析器等)@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[] { WebConfig.class };}// 配置 DispatcherServlet 的映射路径@Overrideprotected String[] getServletMappings() {return new String[] { "/" };}
        }
        
    • 编写Spring的配置类,配置包扫描信息和开启mvc注解驱动即可

    • 可以二合一只配置Spring容器配置文件作为RootConfigClasses

      • 这个Spring配置类需要实现WebMvcConfigurer接口,该接口中提供了许多方法用来自定义SpringMVC的行为,比如配置视图解析器、添加拦截器等等

      • @Configuration
        @EnableWebMvc
        @ComponentScan(basePackages = "com.example.controller")
        public class WebConfig implements WebMvcConfigurer {// 配置视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}// 配置静态资源处理@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("/static/");}// 配置拦截器(可选)@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new CustomInterceptor());}
        }
        
    • 最好还是分开进行配置,getRootConfigClasses方法里写Spring容器的配置类,getServletConfigClasses方法里写web相关的配置类

      • Spring容器配置类

      • @Configuration
        @ComponentScan(basePackages = {"server"})
        public class SpringConfig {@Beanpublic User returnBean(){return new User();}
        }
        
      • web相关的配置类

      • @Configuration
        @EnableWebMvc
        @ComponentScan(basePackages = {"controller"})
        public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable(); // 启用 DefaultServlet}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInterceptor()).order(1).addPathPatterns("/**");}}
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900980.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Open3D

Step01初识Open3d 程序代码: import open3d as o3d #导入Open3d库 def main():#定义主函数box = o3d.geometry.TriangleMesh.create_box(width=3.0, height=2.0, depth=1.0)#创建一个长方体对象box.compute_vertex_normals() #计算法向量vis = o3d.visualization.Visualizer(…

20222223 实验一《Python程序设计》实验报告

20222223 2024-2025-2 《Python程序设计》实验一报告课程:《Python程序设计》 班级: 2222 姓名: 李東霖 学号: 20222223 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

交换节点 - 环

树上交换节点给定一棵树,每个节点有一个权值。现在每次可以交换任意两个节点的权值,请问最少多少次交换可以使得每个节点的权值等于它的编号? 保证给出的权值是一个排列,也就是说保证一定有解。时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M输入描…

Arduino雷达使用Android移动应用程序

该系统可以检测障碍物并收集距离和角度信息,并且可以通过移动应用程序通过蓝牙进行控制。 Arduino雷达使用Android移动应用程序本项目是一个由超声波传感器和伺服电机驱动的雷达系统。该系统可以检测障碍物并收集距离和角度信息,并且可以通过移动应用程序通过蓝牙进行控制。该…

使用cursor打造智能客服demo

cursor AI它真的是非常强大。 今天讲下如何使用它,搭配deepseek api接口,来生成一个智能客服系统。这是最终的效果。首先cursor需要登录后才能使用。登录之后有两周的免费试用期。我们在窗口的右侧填写智能客服的需求。帮我实现一个网页智能客服。详细要求如下: 1.生成一个h…

【蓝牙小程序】小程序使用echart图表报错:setOption of undefined

转载自:https://developers.weixin.qq.com/community/develop/doc/0004ac054ccec0f26df7baa8756800问题:小程序使用echart图表报错 Cannot read property setOption of undefined;at api request success callback function TypeError: Cannot read property setOption of un…

前端中的Javascript

前端中的Javascript javascript定义方式内联JavaScript直接在HTML元素的事件属性中编写JavaScript代码<body><h1>Hello, World!</h1><button onclick="alert(Button clicked!)">Click Me</button> </body>内部JavaScript可以直接…

NVM:安装配置使用

一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同,而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题,它可以在同一台机器上下管理多个 node 版本,使得程序员可以轻松地安装、卸载和切换不同的 node 版本。 在下载和配置 nvm 前,需要在控制面板中先删…

硬盘科普,M.2,PCI-E,NVMe 傻傻分不清

首先从三个层面去理解这个问题:物理接口,通道,协议 1:物理接口(相当于通讯中的电,光口) 大白话- 物理规格,像是 公路,铁路 专门跑PCI-E通道的那个物理接口:扩展性极强,可以插显卡的PCI-E X16的那个物理接口,或者插网卡,声卡的那个PCI-E X1那个物理接口,都是属于一类…

第二届长城杯ciscn半决赛awdp pwn以及应急响应wp

这次半决赛还真是状况频出,先是上午全场靶机断联了2轮,下午的应急又在坐大牢,还好是后面捋顺了逻辑做出来了,下半场干了个赛区第二,总成绩第四,这回是真燃尽了 上半场AWDP typo fix 一开始一直在改这道结果后面才发现那个prompt是真的好改,白浪费了3轮。。。 进入程序是…

LLM Assistance for Memory Safety

LLM Assistance for Memory SafetyMohammed, Nausheen, et al. "LLM Assistance for Memory Safety." 2025 IEEE/ACM 47th International Conference on Software Engineering (ICSE). IEEE Computer Society, 2024.Introduction 在软件安全的漏洞中,内存安全是主要…