学习笔记-Spring常用注解

目录

为什么使用注解?

@Component

@value()

@Component 总结

@Autowired

优化SpringIoc工具类

@Configuration

@Bean

@Repository  作用于 Dao层

@Service 作用于Service 层

@Controller 作用于Servlet 层

优化 Servlet 层

@RequestMapping()

@ResponseBody


为什么使用注解?

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类

VO 类不同于 POJO ,需要有 get/set 方法

@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 文件也在这里配置

使用

静态资源的处理

当我们想使用新建的 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 就是映射的路径

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

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值