SpringMVC整合,出现注解没有起作用的情况处理

 更新时间:2023年05月25日 11:10:31   作者:高效编程  
这篇文章主要介绍了SpringMVC整合,出现注解没有起作用的情况及处理,具有很好的参考价值,希望对大家有所帮助。

SpringMVC整合注解没有起作用

在spring的applicationContext.xml中配置问题

正确的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!--启动注解-->
    <context:annotation-config />
    <!--  base-package 注解所在的包根据自己的需要划分注解类使用的范围  -->
    <context:component-scan base-package="main.com.talkweb">
        <!--不再管理Controller 注解  因为它单独给mvc-servler.xml去管理-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
</beans>

明明有启动注解,但有些注解还是没起作用

<!--启动注解-->
    <context:annotation-config />

后来发现原因是:下面这句作与springMVC的controller注解的排除关注时,把扫描注解的返回局限了

原来 base-package=”main.com.talkweb.Controller”:

!--  base-package 注解所在的包根据自己的需要划分注解类使用的范围  -->
    <context:component-scan base-package="main.com.talkweb.Controller">
        <!--不再管理Controller 注解  因为它单独给mvc-servler.xml去管理-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

现在的包范围 base-package=“main.com.talkweb”:

!--  base-package 注解所在的包根据自己的需要划分注解类使用的范围  -->
    <context:component-scan base-package="main.com.talkweb">
        <!--不再管理Controller 注解  因为它单独给mvc-servler.xml去管理-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

注解方式整合SpringMVC

整合SpringMVC分析

web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer文件,加载这个文件里面指定的类SpringServletContainerInitializer

spring的应用一启动就会加载WebApplicationInitializer接口下的所有组件并创建对象

WebApplicationInitializer接口下有三个抽象类

AbstractContextLoaderInitializer抽象类:

调用createRootApplicationContext()方法来创建根容器

AbstractDispatcherServletInitializer抽象类

调用createServletApplicationContext()方法创建一个web的IOC容器

调用createDispatcherServlet()方法创建了DispatchServlet

将创建的DispatchServlet添加到ServletContext

AbstractAnnotationConfigDispatcherServletInitializer抽象类

使用注解的方式配置的DispatcherServlet初始化器

该类重写AbstractContextLoaderInitializer父类的createRootApplicationContext()方法来创建根容器。调用getRootConfigClasses()方法传入一个配置类

该类还重写了AbstractDispatcherServletInitializer父类的createServletApplicationContext()方法来创建web的IOC容器。获取配置类注册到IOC容器中。

以注解方式来启动SpringMVC,需要继承AbstractAnnotationConfigDispatcherServletInitializer,然后实现抽象方法指定DispatcherServlet的配置信息

注解方式整合SpringMVC

自定义容器初始化器

/*web容器启动的时候创建对象,调用方法来初始化容器以及前端控制器*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    /*获取根容器的配置类,相当于Spring的配置文件,用来创建父容器*/
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    /*获取web容器的配置类,相当于SpringMVC的配置文件,用来创建子容器*/
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{AppConfig.class};
    }
    /*获取DispatcherServlet的映射信息*/
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

子容器配置类

//SpringMVC只扫描Controller,子容器
@ComponentScan(value = "springMVC", includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class AppConfig {
}

父容器配置类

//Spring的容器不扫描Controller,必须禁用默认的过滤规则才会生效,父容器
@ComponentScan(value = "springMVC", excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
public class RootConfig {
}

Service

@Service
public class HelloService {
    public String sayHello(String name){
        return "hello " + name;
    }
}

Controller

@Controller
public class HelloController {
    @Autowired
    HelloService helloService;
    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        String hello = helloService.sayHello("张三");
        return hello;
    }
}

定制SpringMVC

使用@EnableWebMvc开启SpringMVC定制配置功能,相当于在xml文件中使用<mvc:annotation-driven/>标签

@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig {
}

配置组件,包括视图解析器、视图映射、静态资源映射、拦截器等等

@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter{
    //定制视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
    //定制静态资源访问
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        /*相当于在xml配置文件中使用<mvc:default-servlet-handler>标签,
        * 将SpringMVC处理不了的请求交给Tomcat,这样静态资源就可以访问了*/
        configurer.enable();
    }
    //定制拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java基础篇之反射机制详解

    Java基础篇之反射机制详解

    本文详细讲解了Java基础篇之反射机制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Spring中的循环依赖详解

    Spring中的循环依赖详解

    这篇文章主要介绍了Spring中的循环依赖详解,  Spring 框架是一个流行的Java应用程序框架,它提供了许多强大的功能,如依赖注入和面向切面编程,然而在使用 Spring 框架时,我们可能会遇到循环依赖的问题,需要的朋友可以参考下
    2023-09-09
  • SpringMVC+Mybatis实现的Mysql分页数据查询的示例

    SpringMVC+Mybatis实现的Mysql分页数据查询的示例

    本篇文章主要介绍了SpringMVC+Mybatis实现的Mysql分页数据查询的示例,具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • Java中List集合的常用方法详解

    Java中List集合的常用方法详解

    本篇文章给大家带来的内容是关于Java中List集合的常用方法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。下面我们就来学习一下吧
    2021-11-11
  • Java实现基于UDP协议的网络通信UDP编程

    Java实现基于UDP协议的网络通信UDP编程

    在Java中使用UDP编程,仍然需要使用Socket,因为应用程序在使用UDP时必须指定网络接口(IP地址)和端口号。注意:UDP端口和TCP端口虽然都使用0~65535,但他们是两套独立的端口,即一个应用程序用TCP占用了端口1234,不影响另一个应用程序用UDP占用端口1234
    2023-04-04
  • Java使用Jsoup解析html网页的实现步骤

    Java使用Jsoup解析html网页的实现步骤

    Jsoup是一个用于解析HTML文档的Java库,本文主要介绍了Java使用Jsoup解析html网页的实现步骤,可以提取文本、链接、图片等,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 配置pom.xml用maven打包java工程的方法(推荐)

    配置pom.xml用maven打包java工程的方法(推荐)

    下面小编就为大家带来一篇配置pom.xml用maven打包java工程的方法(推荐)。小编觉得挺不错的, 现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • SpringBoot中OKHttp和压缩文件的使用实战教程

    SpringBoot中OKHttp和压缩文件的使用实战教程

    本文介绍了如何在SpringBoot中使用OKHttp发起请求和处理压缩文件,包括文件的存储配置、实体类、配置类和初始化类的设置,以及如何通过主程序和测试类进行实际操作,最后提供了必要的依赖添加方法,以确保功能的实现
    2024-10-10
  • MyBatis中$和#的深入讲解

    MyBatis中$和#的深入讲解

    这篇文章主要给大家介绍了关于MyBatis中$和#的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring-全面详解(学习总结)

    Spring-全面详解(学习总结)

    这篇文章主要介绍了详解Spring框架入门,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能给你带来帮助
    2021-07-07

最新评论