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");
      
      	// 获取 Bean
      	UserService 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);
      
              // 从容器中获取 Bean
              UserService userService = context.getBean(UserService.class);
      
              // 使用 Bean
              userService.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容器的配置类即可
            @Override
            protected Class<?>[] getRootConfigClasses() {
                return new Class<?>[] { RootConfig.class };
            }
        
            // 配置 Web 应用上下文(Web 相关的 Bean,如控制器(Controller)、视图解析器等)
            @Override
            protected Class<?>[] getServletConfigClasses() {
                return new Class<?>[] { WebConfig.class };
            }
        
            // 配置 DispatcherServlet 的映射路径
            @Override
            protected String[] getServletMappings() {
                return new String[] { "/" };
            }
        }
        
    • 编写Spring的配置类,配置包扫描信息和开启mvc注解驱动即可

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

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

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

      • Spring容器配置类

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

      • @Configuration
        @EnableWebMvc
        @ComponentScan(basePackages = {"controller"})
        public class WebConfig implements WebMvcConfigurer {
            @Override
            public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
                configurer.enable(); // 启用 DefaultServlet
            }
        
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new UserInterceptor()).order(1).addPathPatterns("/**");
            }
        
        }
        
posted @ 2025-03-18 15:58  QAQ001  阅读(22)  评论(0)    收藏  举报