学习笔记-Spring常用注解

目录

为什么使用注解?

@Component

@value()

@Component 总结

@Autowired

优化SpringIoc工具类

@Configuration

@Bean

@Repository  作用于 Dao层

@Service 作用于Service 层

@Controller 作用于Servlet 层

优化 Servlet 层

@RequestMapping()

@ResponseBody

动态资源

静态资源

@RequestParam()

扩展

@GetMapping()

@PathVariable()

@RequestBody

消息转换器

1. 添加第三方依赖

2. 配置Spring 的消息转换器  -- 结合 fastjson 转换

3. 引用 第三方 bean

总结

静态资源的处理

映射静态资源

映射本地图片


为什么使用注解?

Spring注解方式减少了配置文件内容,更加方便管理

Spring的一个核心功能是Ioc,就是将Bean初始化加载到容器中,Bean是如何加载到容器的呢?可以使用Spring注解方式或者Spring XML配置方式。

使用XML 配置方式的话,哪些 Bean 文件需要Ioc 来接管,需要在XML配置文件中 写 <bean>标签,来指定加载哪个 Bean 文件 

但是如果有很多 Bean文件需要加载,那么使用配置文件来指定哪些需要加载就不太方便了

@Component

注解 @component 就比较方便了

但是问题来了,Ioc 容器怎么知道哪些需要加载哪些不加载呢?还需要在配置文件中指定扫描哪些包下的文件

这样指定了扫描 com 包下的所有 加了 @component 注释的Bean 文件

创建一个 SpringIoc 工具类 ,读取配置文件

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class springIocUtil {
    private static ClassPathXmlApplicationContext context;
    static {
        context = new ClassPathXmlApplicationContext("spring.xml");
    }
    public static Object getBean(String beanName){
        return context.getBean(beanName);
    }
}

调用SpringIoc工具类的getBean 静态方法获取student对象,传参 student ,默认是Student 类名的首字母小写,也可以指定名字

注解加参数的方式,就可以使用自定义的名字传参

验证

因为没有赋值,所以显示的是默认值

@value()

那怎么赋值呢?

使用 @value() 赋值和直接在属性后面 = 赋值 是一样的,不同的是 @value() 可以设置变量

游览器访问

@Component 总结

1. 类带上 @Component 注解

2. 修改配置文件

3. 使用

@Autowired

如果 Student 类里有引用其他类怎么办呢?

使用 引用类型的注入 @Autowired 自动注入

注意:Role 类也需要加上 @Component 注解,

因为 Ioc 容器创建对象是通过 空参 创建的,所以需要有空参构造函数,

在 Student 类中重写 ToString 方法,打印才会显示 Role 的信息

验证

优化SpringIoc工具类

如果参数是 class 怎么修改?

重载方法,并使用泛型的方式

泛型参数 <T>:这表示getBean方法现在可以接受任何类型的Class对象,并将返回该类型的一个实例。这里的T代表返回的bean的类型。


类型参数 Class<T>:这确保了clazz参数必须是一个具体的类类型。


返回类型 <T>:这表示方法将返回由clazz参数指定的类型。这样,调用者可以直接获得一个类型安全的对象,无需显式转换。

@Configuration

如果不使用 XML 配置文件扫描包,还有其他的方式吗? 可以使用配置类

配置类

1.类似spring 的配置文件  --设置包扫描路径

2.引入第三方的bean  -- 结合 @Bean

创建配置类

扫描 com 包下的所有文件,有 @Component 注解的Bean 加载到 Ioc 容器

修改工具类

这样和使用 XML 配置文件 是一样的

因为第三方的Bean 我们是不能直接加 @component 注解的,

那怎么引入第三方Bean 呢?

创建一个类作为第三方Bean 

@Bean

在配置类创建一个方法并结合 @Bean 注解 ,获取第三方 Bean 的实例,然后返回实例

那怎么调用这个方法呢?

使用方法名获取

验证

Servlet 控制层,Service 业务逻辑层和Dao 数据处理层 也是使用 @Component 注解,不过也有更精准的 注解

@Repository  作用于 Dao层

@Service 作用于Service 层

@Controller 作用于Servlet 层

这些注解和 @Component 注解是一样的作用,它们都继承了 @Component

使用这些注解方便阅读,可以更直观的知道这是什么层

优化 Servlet 层

在项目中,每个功能可能就需要写一个 Servlet ,当 Servlet 太多了怎么处理?

能不能只写一个Servlet ?可以的

新建一个包,然后创建 Controller 类,

然后就可以把 Servlet 类删除了,但是有个问题,Servlet 类删除了之后,游览器怎么访问服务器?

因为 Tomcat 是使用 Servlet 来处理和响应数据的,相当于一个桥梁,现在桥梁没了,那怎么办呢?

再新建一个Servlet 就可以了,但是只需要创建一个 Servlet 就可以,而不是像之前创建很多个Servlet 

那么问题来了,现在只有一个 Servlet ,映射路径写什么?

映射路径是游览器发送的请求路径,比如 Http://127.0.0.1/pages/Login

/pages/Login 就是映射路径

只需要写一个 / ,表示拦截所有的请求

这个Servlet 怎么创建呢?

Spring 自己写了一个 Servlet 结合Tomcat ,我们设置 拦截所有请求,也就是把请求路径设置为 / 

Spring 写的Servlet 是 DispatcherServlet 中央处理器,中央处理器负责分发 客户端请求的数据 由哪个 Controller 处理

先引用一下Spring 生态的 web 依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.30</version>
    </dependency>

然后在 Web.xml 配置文件 引入 Spring 写的 Servlet 

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 初始化 spring 配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring.xml</param-value>
    </init-param>

    <!-- 启动 Ioc 容器,我们之前是使用工具类读取配置文件,现在可以使用框架来帮我们完成,就不需要在工具类中读取配置文件了-->
    <load-on-startup>1</load-on-startup>    <!--1 表示true-->
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>    <!-- 拦截所有请求-->
  </servlet-mapping>

现在使用框架启动 Ioc 容器,就不用配置类了

修改 Spring 配置文件

<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <context:component-scan base-package="com"/>

    <!--开启注解驱动-->
    <mvc:annotation-driven/>    <!--使用 schema/mvc 的-->
</beans>

总结

1. 引入 SpringMVC 依赖

        有了这个依赖 DispatcherServlet 才能和Tomcat 结合

2. 修改Web.xml 配置文件

        引入 DispatcherServlet,启动 Ioc 容器

3. 修改Spring配置文件

        开启包扫描路径

        开启注解驱动

现在就可以配置 Controller 类了

每个方法相当于一个 Servlet 

@RequestMapping()

那么问题来了,怎么区分中央处理器会分发给哪个 controller 呢?和哪个方法呢?使用 @RequestMapping() 注解

@ResponseBody

那怎么区分请求的是静态的资源还是动态资源?

使用 @ResponseBody 注解

动态资源

带有 @ResponseBody 注解的表示这是响应的是动态资源

测试

启动 Tomcat ,在游览器访问 http://localhost:8080/maven_war_exploded/User/Login 

这是我的项目路径,你的需要修改为自己的项目路径

控制台输出 登录 

静态资源

不带 @ResponseBody 注解的表示响应的是静态资源

那响应的静态资源的路径是什么呢?

比如我们访问 index.jsp 文件,先看一下编译后文件的路径

可以看到 index.jsp 在编译后就在项目根路径下

所以,文件路径只需要写 /index.jsp 就行了

我们在请求动态资源的时候,一般都会有请求参数,所以,方法的形参也需要加上

注意:请求的参数名要和方法的参数名保持一致

前端 请求的参数名和方法的参数名不一样怎么办?假设,前端的参数名已经确定了,不能修改了,这样的话,参数名不一样就赋值不了,怎么办?两种方法

比如,前端请求的参数名是 username 和 p

第一种方法:形参的参数名也修改为 p ,这样的话谁知道 p 是什么意思?有可能是 position ,phone,price,prize,poet  呢,一般在命名的时候,尽量见名知意

@RequestParam()

第二种方法

扩展

RESTful 设计风格

映射地址和参数之间,参数和参数之间 用 / 分割

传过去的参数只写参数的值

@GetMapping()

@PathVariable()

因为使用的GET 方法,所以注解是 @GetMapping,还有 @POSTMapping 等等

@PathVariable 和 @RequestParam 的区别是什么?

都是用来接收参数的,@RequestParam 是传统的风格,@PathVariable 是RESTful 风格

相同点都是接收地址栏的参数

当 POST 请求的参数很多怎么办?

把参数封装为一个对象,再传过去,也就是说,参数是一个对象

一般在传输数据都会封装为 JSON 格式 ,这也是一种规范,JSON 格式方便阅读,也比较容易解析

我们使用 Apipost 模拟发送数据

Apipost-API 文档、设计、调试、自动化测试一体化协作平台

先不发送,先创建接收参数的 VO

VO是Value Object(‌值对象)‌的缩写,‌它是一个普通的JavaBean,‌通常与DAO(‌数据访问对象)‌类配合使用

先创建 VO 包,再创建一个 VO类

@RequestBody

@RequestBody注解用于接收HTTP请求体中的数据,并将其绑定到方法参数上

消息转换器

测试返回成功,但是返回的不是 JSON 怎么办?

把返回数据封装为 JSON 格式 返回

1. 添加第三方依赖

在 pom.xml 文件中的 <dependencies> 标签中添加以下代码

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.49</version>
    </dependency>

2. 配置Spring 的消息转换器  -- 结合 fastjson 转换

3. 引用 第三方 bean

引入 第三方 Bean 文件有两种方式

第一种是使用Spring 配置文件

第二种是配置类配合注解使用

这里因为 Spring 的消息转换器需要在配置文件配置,所以引入 Bean 文件也在这里配置

4. 使用

返回对象类型,不用显式调用JSON 转换

因为配置了消息转换器,在返回数据时 Spring 会自动把它转换为 JSON 格式

测试

显示返回的类型未经允许的

配置消息转换器支持哪些媒体类型

 

    <bean id="fastjasonalibaba" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>

测试

成功响应 JSON 格式数据

总结

1. 添加第三方依赖    pom.xml

2. 修改配置信息        Spring.xml

        2.1 配置spring 消息转换器 -- 结合fastjson

        2.2 引入第三方Bean

        2.3 添加 Content-Type 的媒体类型

3. 使用

静态资源的处理

当我们想使用新建的 index.html 作为默认界面怎么处理?

直接修改文件名是不行的,这是因为 Tomcat 在最早的时候,他的目标是把 java代码和前端的页面 结合,使用 jsp 文件处理, 所以默认只能返回 jsp 文件

现在前后端分离,用不到 jsp 文件了,一般都是使用 HTML 文件,那怎么返回 HTML 文件?需要配置

在Spring 配置文件里配置

<!--配置视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 设置视图资源的前缀,例如"test"逻辑视图名会被解析为"/WEB-INF/pages/test.html" -->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <!-- 设置视图资源的后缀,用于确定资源的文件类型 -->
        <property name="suffix" value=".html"/>
    </bean>
<!-- 配置默认的 Servlet 用于处理静态资源请求 -->
    <mvc:default-servlet-handler/>

返回的文件路径只需要写 文件名即可

测试

映射静态资源

那引入 CSS 文件 路径怎么写呢?

之前的路径是这样的,但是这样写访问不到 css 文件,因为文件是放在 WEB-INF 文件夹下,WEB-INF 是安全目录,只有服务器可以访问,游览器发送的请求访问不了

在 Spring 配置文件中添加映射就可以了

在HTML 文件里 修改引用 css 文件的路径

测试

映射本地图片

游览器访问 http://localhost:8080/ecard_back_war_exploded/images/car.jpg

images 就是映射的路径

以上是我的学习笔记,如果有不对的地方希望能够指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值