首页 > 其他分享 >Spring系列之零碎知识点

Spring系列之零碎知识点

时间:2022-10-28 15:05:17浏览次数:51  
标签:知识点 匹配 Spring 路径 零碎 project Bean value 注解


​classpath​​​和​​classpath*​

​classpath​​​和​​classpath*​​​区别:
​​​classpath​​​:只会到你指定的class路径中查找找文件;
​​​classpath*​​:不仅包含class路径,还包括jar文件中(class路径)进行查找。

Ant风格

ANT通配符有三种:

通配符

说明

?

匹配任何单字符

*

匹配0或者任意数量的字符

**

匹配0或者更多的目录

举例:

URL路径

说明

/project/*.a

匹配项目根路径下所有在project路径下的.a文件

/project/p?ttern

匹配项目根路径下 /project/pattern 和 /app/pXttern

​/**/example​

匹配项目根路径下 /project/example, /project/foow/example, 和 /example

​/project/**/dir/file.*​

匹配项目根路径下/project/dir/file.jsp, /project/foow/dir/file.html,/project/foow/bar/dir/file.pdf

​/**/*.jsp​

匹配项目根路径下任何的.jsp 文件

最长匹配原则(has more characters)
现有URL请求​​​/app/dir/file.jsp​​​,假设存在两个路径匹配模式​​/**/*.jsp​​​和​​/app/dir/*.jsp​​​,那么会根据模式​​/app/dir/*.jsp​​来匹配。

@ResponseBody 和 @RequestBody 注解的区别

@RequestBody
作用:

  • 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
  • 把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:
A) GET、POST方式提时, 根据request header Content-Type的值来判断:

  • application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  • multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  • 其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  • application/x-www-form-urlencoded, 必须;
  • multipart/form-data, 不能处理;
  • 其他格式, 必须;
    说明:request的body部分的数据编码格式由header部分的Content-Type指定;

@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。通常用来返回JSON数据或者是XML数据,在使用此注解之后不会再试图走处理器,而是直接将数据写入到输入流中,效果等同于通过response对象输出指定格式的数据。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

区别

  • Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用;
  • 在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。例如,异步获取 json 数据,加上 @Responsebody 注解后,就会直接返回 json 数据。
  • @RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

例子:

@RequestMapping(value = "person/login")
@ResponseBody
// 将请求中的 datas 写入 Person 对象中
public Person login(@RequestBody Person person) {
// 不会被解析为跳转路径,而是直接写入 HTTP 响应正文中
return person;
}

参考

@RequestParam,@PathVariable等注解

@RequestMapping(value = "/test/{uid}", method = RequestMethod.GET)
public void get(@RequestParam(value = "nickname", required = false, defaultValue = "johnny" ) String name, @PathVariable String uid) {
}

请求 URL 是 http://localhost:8080/test/1234435?nickname=wong
@RequestParam 是"?"后面的 URL 的一部分,支持下面三种参数:

  • defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值;
  • required 这个参数表示是不是必须的,默认为 true;
  • value 定义 key-value 键值对里面的键。

@PathVariable是"?"前面的URL的一部分。

根据上面的示例可知,接口方法定义时,@RequestParam 后面的变量定义 可以和前面的 value 里面的定义不相同,但是"?"后面的 key-value 键值对必须是 value 定义的键。但是@PathVariable 后面的变量定义必须和接口的 URL 里面的,即@RequestMapping 里面 value 定义的大括号 {} 相同。
两者的作用都是将request里的参数的值绑定到contorl里的方法参数里的,这两个在 web 开发,即接口开发中,使用最多,都是 spring 框架里面的注解。

@PathParam
这个注解是和spring的pathVariable是一样的,也是基于模板的,jboss包下面的一个实现。
@QueryParam 是 JAX-RS 本来就提供的,和Spring的RequestParam作用一致

SpringMVC @Response 返回String中文乱码

项目开发中如果没有遇到乱码,那你可能不是一个真正的开发;遇到乱码,总是习惯性去网上乱搜一气,实际上乱码的根源会有很多种情况,现象也不一样。这方面,目前菜逼的我也是乱搜一气,先排除一些不靠谱的解决方案,然后去尝试那些有理有据,适合自己项目情况的解决方案,假如成功,就了事,也没有时间和激情去追本溯源(需要改正),不行就换一种解决方法;
另,关于乱码,建议多度几遍《深入分析Java Web技术内幕》书籍的第三章:深入分析Java Web中的中文编码问题。
现在遇到的一种情况是,spring web响应乱码。一种可行的解决方法:
在springMVC的配置文件中(springMVC-xx.xml),修改​​​<mvc:annotation-driven/>​​为:

<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

乱码原因:org.springframework.http.converter.StringHttpMessageConverter有个final修饰的Charset DEFAULT_CHARSET=Charset.forName(“ISO-8859-1”)常量。即当返回类型为String时,返回类型为text/plain,字符被设置为默认字符ISO-8859-1。

@Required注解检查依赖

依赖检查,该注解只能用在set方法上,并通过xml文件的property属性注入。一旦用了这个注解,那么容器在初始化bean的时候必须要进行set,也就是说必须对这个值进行依赖注入。

@Primary & @Qualifier

@Qualifier

This annotation may be used on a field or parameter as a qualifier for candidate beans when autowiring. It may also be used to annotate other custom annotations that can then in turn be used as qualifiers.

这个注释可用于作为预备bean的字段或参数,也可以用在其他的自定义注释下;@Qualifier(“XXX”),Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除byType方式产生的歧义。

@Primary

Indicates that a bean should be given preference when multiple candidates are qualified to autowire a single-valued dependency. If exactly one ‘primary’ bean exists among the candidates, it will be the autowired value. This annotation is semantically equivalent to the {@code } element’s {@code primary} attribute

配置文件

虽然有 Java Config,基于Java类定义Bean配置元数据中的@Configuration注解的类等价于XML配置文件,@Bean注解的方法等价于XML配置文件中的Bean定义。基于Java类定义Bean配置元数据需要通过AnnotationConfigApplicationContext加载配置类及初始化容器,类似于XML配置文件需要使用ClassPathXmlApplicationContext加载配置文件及初始化容器。

但是 XML 还有用武之地,不可能被淘汰;

<context:component-scan
base-package="com"
resource-pattern="**/*.class"
name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"
use-default-filters="true"
annotation-config="true">
<context:include-filter type="aspectj" expression="*"/>
<context:exclude-filter type="regex" expression="aa"/>
</context:component-scan>

默认情况下将自动扫描@Component、@ManagedBean、@Named注解的类并将其注册为Spring管理Bean。注意:@Aspect注解不能被Spring自动识别并注册为Bean。
base-package:表示扫描注解类的开始位置,即将在指定的包中扫描,其他包中的注解类将不被扫描,默认将扫描所有类路径;
resource-pattern:表示扫描注解类的后缀匹配模式,即 “base-package+resource-pattern” 将组成匹配模式用于匹配类路径中的组件,默认后缀为 “**/*.class”,即指定包下的所有以​​​.class​​​结尾的类文件;
name-generator:默认情况下的Bean标识符生成策略,默认是AnnotationBeanNameGenerator,其将生成以小写开头的类名(不包括包名);可以自定义自己的标识符生成策略;
use-default-filters:默认为true表示扫描@Component、@ManagedBean、@Named注解的类,如果改为false默认将不扫描这些默认的注解来定义Bean,即这些注解类不能被扫描到,即不能通过这些注解进行Bean定义;
annotation-config:表示是否自动支持注解实现Bean依赖注入,默认支持;设置为false,将关闭支持注解的依赖注入:​​​annotation-config="false"​​​。
exclude-filter:比include-filter具有更高优先级;type:表示过滤器类型,目前支持注解类型、类类型、正则表达式、aspectj表达式过滤器,当然也可以自定义自己的过滤器,实现org.springframework.core.type.filter.TypeFilter即可;expression:表示过滤器表达式。

​<aop:aspectj-autoproxy proxy-target-class="true"/>​​​用于开启Spring对@AspectJ风格切面的支持。
​​​default-lazy-init="true">​​:


标签:知识点,匹配,Spring,路径,零碎,project,Bean,value,注解
From: https://blog.51cto.com/u_15851118/5804873

相关文章

  • java + springmvc 酷炫验证码分享
    java+springmvc酷炫验证码分享一、maven依赖<!--https://mvnrepository.com/artifact/com.github.bingoohuang/patchca--><!--验证码--><dependency><groupId>com......
  • Spring mvc配置
    <!--自动扫描包,开启注解--><context:component-scanbase-package="com.wang.springmv.controller"/><!--annotation-driven配置的作用如下:1)、主要是......
  • springboot-slf4j日志输出级别简要配置
    springboot-slf4j日志输出级别简要配置1.前言springboot使用ymal、yml配置,更好的将相关的配置节点聚合在一起,方便查看和增改配置项。配置可以写在application.yml、spring......
  • java springboot 2.x 环境搭建
    环境:javaversion1.8ApacheMaven3.2.2 ide:ideaspringboot:2.1.3.RELEASE创建步骤:1file=>new=>mudule...2选择SpringInitializr:modulesdk选择1.7,其他默认......
  • Spring中过滤器和拦截器技术
    在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者......
  • Spring Retry 重试
    重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用SpringRetry的话一个注......
  • SpringCloud微服务实战——搭建企业级开发框架(四十八):【移动开发】整合uni-app搭建移动
      uni-app默认使用uni-ui全端兼容的、高性能UI框架,在我们开发过程中可以满足大部分的需求了,并且如果是为了兼容性,还是强烈建议使用uni-ui作为UI框架使用。  如果作为......
  • 1.天线知识点
    天线知识点1.天线实现宽带方法多谐振天线可以实现宽阻抗宽带。A.难点:如何产生或控制多个谐振点。常用的方法:多模辐射单元、多天线单元、电抗或寄生单元加载、阻抗变换......
  • SpringBoot中整合Shiro+Mybatis+Thymeleaf框架实现用户登录以及权限的验证(超级详细过
    1、建立springboot项目目录结构2、项目的jar包依赖在pom文件中加入jar包依赖<dependencies><!--整合shirosubject:用户security......
  • Spring Cloud Netflix SideCar
    ​​PolyglotsupportwithSidecar​​​​spring-cloud-netflix-sidecar​​......