五、Spring 注解开发

news/2024/11/23 4:44:57/

文章目录

  • 一、使用注解开发的环境准备
  • 二、Spring 框架核心注解学习
    • 2.1 @Component
      • 2.1.1 通过注解来控制 Bean 的作用域(@Scope)
    • 2.2 @Component 的派生注解(对应这 web 开发的三层架构分层)
      • 2.2.1 @Repositor
      • 2.2.2 @Service
      • 2.2.3 @Controller
  • 三、使用 XML 与注解开发的学习总结
  • 四、使用 JAVA 的方式配置 Spring (XML 被完全取代成注解开发)
    • 4.1 Spring 上下文学习总结




一、使用注解开发的环境准备


在 Spring 4.0版本之后,如果想要使用注解进行开发,就必须保证 aop 的依赖包正常导入了。否则可能会导致一些注解无法正常使用。
  • 使用注解开发的环境准备,搭建 maven 项目

    • 在pom.xml 中导入 Spring 依赖

      <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency>
      
      • 依赖导入成功示意图
        在这里插入图片描述
    • 创建文件包路径,controller、dao、dto、service
      在这里插入图片描述

    • 创建 applicationContext.xml(Beans.xml),使用注解开发时,需要在该资源文件中导入约束,配置注解的支持!

      • 注:通过下面的 xml 代码可以发现,在该容器中只配置了注解支持,以及扫描指定包路径的注解,使其生效,并没有做 Bean 的任何处理。
      <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启注解的支持:注解驱动,不开启则注解不生效 --><context:annotation-config/><!-- 指定需要扫描的包,使该包下的注解生效 --><context:component-scan base-package="com.sys.dto"/>
      </beans>
      
    • 创建 User 实体类,引用注解对 Bean 进行装配

      // @Component:等同于<bean id="user" class="com.sys.dto.User"/>
      @Component
      public class User {// @Value:等同于<property name="name" value="姚青"/>@Value("姚青")private String name;public String getName() {return name;}/* 注:在使用这种方式进行 Bean 的装配时,其实并没有使用过Set(),都是通过 @Value 直接注入到 private String name; 当中*/public void setName(String name) {this.name = name;}}
      
    • 创建测试类,测试 Bean 的装配结果

      public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = context.getBean("user", User.class);System.out.println(user.getName());}
      }
      
    • 测试结果:从结果可以看出Bean成功注入了
      在这里插入图片描述

  • 注:在开发中大多数时候都是需要使用注解来进行的。




二、Spring 框架核心注解学习


在上面第一节中的使用到了 @Component ,以及 @Value 注解来实现 Bean 的装配。

2.1 @Component


@Component 是 Spring 框架中用来标记一个类为组件的注解。被 @Component 注解标记的类将会被 Spring 自动扫描并纳入到 Spring 容器中管理。

  • 使用方式:如第一节所示

2.1.1 通过注解来控制 Bean 的作用域(@Scope)


  • @Scope :用于定义Spring容器中Bean的作用域范围,它可以应用在类级别上。作用域决定了在Spring容器中创建的Bean的生命周期和可见范围。

    • 常用的@Scope作用域:

      • singleton(默认):每个Spring容器中只会创建一个Bean实例,并在整个容器的生命周期内都共享这个实例。

      • prototype:每次从容器中获取Bean时都会创建一个新的实例,即原型模式。每次获取都返回一个独立的Bean实例。

      • request:每个HTTP请求都会创建一个新的Bean实例,在同一次请求中共享。

      • session:每个HTTP session都会创建一个新的Bean实例,在同一个session中共享。

      • application:在Web应用启动时创建一个Bean实例,并在整个Web应用的生命周期内共享。

    • 代码示例:

      // @Component:等同于<bean id="user" class="com.sys.dto.User"/>
      @Component
      @Scope("singleton")
      public class User {// @Value:等同于<property name="name" value="姚青"/>@Value("姚青")private String name;public String getName() {return name;}/* 注:在使用这种方式进行 Bean 的装配时,其实并没有使用过Set(),都是通过 @Value 直接注入到 private String name; 当中*/public void setName(String name) {this.name = name;}}
      
  • 注:作用域仅在容器中有效,而不影响Bean在其他代码中的使用。



2.2 @Component 的派生注解(对应这 web 开发的三层架构分层)


@Component 注解有几个派生注解,它们的作用和使用方式类似,都是代表将某个类注册到Spring中,装配Bean。但具体含义略有差异,涉及到不同场景下的注入、管理和特定功能。
       这些派生注解分别是:@Repository、@Service、@Controller

2.2.1 @Repositor

  • @Repositor: 用于标记数据访问层的组件,通常用于访问数据库或其他数据源。

    • 使用方式:
      @Repository
      public class UserRepository {//...
      }
      

2.2.2 @Service

  • @Service: 用于标记服务层的组件,通常用于定义业务逻辑。

    • 使用方式:
      @Service
      public class UserService {//...
      }
      

2.2.3 @Controller

  • @Controller: 用于标记Web层的组件,通常用于处理HTTP请求、响应和视图。

    • 使用方式:
      @Controller
      public class UserController {//...
      }
      


三、使用 XML 与注解开发的学习总结


  • XML 与注解

    • 通过 xml 来实现 Bean 的装配时,任何场景都可以适配!并且维护简单明了。

    • 通过注解来实现 Bean 的装配时,局限性较大,如果不是自己的类就无法使用!维护相对复杂。

  • XML 与注解的最佳搭配方式:

    • XML 用来管理bean;

    • 注解只负责完成属性的注入;

  • 注:在使用的过程中,需要注意必须让注解生效,也就是需要开启注解的支持



四、使用 JAVA 的方式配置 Spring (XML 被完全取代成注解开发)


使用注解将 XML 完全替代,这种写法是 Spring 框架的子项目 JavaConfig 的一种开发模式,将 Bean 的装配以及管理全部交给 Java 来实现!并且在 Spring 4.0 之后,JavaConfig 也成为了Spring 的一个核心功能。
       这种纯Java的配置方式,在 SpringBoot 中随处可见!

  • @Component :标注一个类为 Spring 容器的 Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的)

  • @Configuration :这个也会Spring容器托管,注册到容器中,因为它本来就是一个@Component。被该注解标记的类被代表成配置类,和之前的 Beans.xml 差不多

  • @Bean :是 Spring 框架中用来定义 Bean 的注解之一。通过在方法上添加 @Bean 注解,相当于告诉 Spring 容器通过调用该方法来创建并管理一个 Bean 实例。相当于之前在 Beans.xml中 写的 < bean > 标签

    • 该方法的方法名就相当于< bean > 标签的 id 属性
    • 该方法的返回值,就相当于< bean >标签的 class 属性

  • @ComponentScan :指定要扫描的包,相当于 Beans.xml 的< context:component-scan base-package=“包路径”/ >

  • @Import :将其他配置文件引入到当前配置文件中,相当于 Beans.xml 的< import resource=“XXX”/ >



  • 代码示例:创建 maven 项目以及相关包路径

    • 创建实体类

      @Component
      public class User {@Value("姚青")private String name;public String getName() {return name;}}
      
    • 创建JavaConfig 配置类

      @Configuration
      public class DemoConfig {@Beanpublic User getUser(){return new User(); // 返回要注入到 bean 的对象!}}
      
    • 创建测试类

      public class MyTest {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);User user = context.getBean("getUser", User.class);System.out.println(user.getName());}}
      
    • 测试结果 :注入成功~~(打印姚青)



4.1 Spring 上下文学习总结

  • ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);

    • 在之前使用 Beans.xml 进行 Bean 的管理和注入时,就通过 ClassPathXmlApplicationContext 来进行 Bean 的获取。
  • ApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);

    • 在之前使用注解进行 Bean 的管理和注入时,就通过 AnnotationConfigApplicationContext 来进行 Bean 的获取。

http://www.ppmy.cn/news/839694.html

相关文章

vim常见命令

全文目录 命令模式下的常见命令vim中的批量注释 底行模式下的常见命令 命令模式下的常见命令 n yy # 将当前光标所在向下n行进行复制 n p # 将所复制行进行粘贴n次 n dd # 剪切&#xff08;删除&#xff09;当前行 n x # 删除光标之后&#xff08;包含光标&#xff09;的n…

今天谁在开网店?兼职卖家占整体网店近70%

网络零售进入B2C主流的时代&#xff0c;规模效应对赢利能力起决定作用。这个时候&#xff0c;还有人提出“小即是美”这样的观点&#xff0c;是否说得通&#xff1f;截至2012年上半年&#xff0c;中国网商数量早已超过了8300万家&#xff0c;网络购物用户已经超过2.14亿人&…

docker-compose部署rocketmq单节点

1、docker-compose文件如下 version: 3.5 services:rmqnamesrv:# image: rocketmqinc/rocketmqimage: apache/rocketmq:4.9.7 container_name: rmqnamesrvrestart: alwaysports:- 9876:9876environment:#内存分配JAVA_OPT_EXT: "-server -Xms1g -Xmx1g"volumes:-…

LabVIEW-模拟传感器采集数据并预测数据

一、题目 已知某传感器过去的一段时间内采集的数据为d1,d2,d3,......,dn&#xff0c;现欲以m点的数据宽度&#xff0c;预测 tao 步后的数据值&#xff0c;即将一维的时间序列数据重构为如下m1列的形式&#xff1a; d(1) d(2 ) ....... d(m), d(mtao) d(2) d(…

FPGA日常1:101序列检测器

采用三段式状态机&#xff0c;将组合逻辑与时序逻辑分开 第一部分描述状态转移 第二部分描述状态转移条件 第三部分描述输出 module fsm ( input clk, input rst_n, input x, output z);reg [1:0] current_state; reg [1:0] nstate;always (posedge clk or negedge rst_n)…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + RS-LiDAR-16 激光雷达测试

简介&#xff1a;介绍 RS-LiDAR-16 16线激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;如何打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melo…

verilog序列检测器_11010110

功能说明&#xff1a; •捕捉11010110序列 •在捕捉到每个序列后产生一个1时钟周期的标记信号 •对捕捉到序列个数进行计数并输出 •计数上限为16&#xff0c;计数满后值保持不变&#xff0c;产生计数慢的溢出信号 •允许序列的嵌套 设计思路&#xff1a; 采用mealy型有限…

1、 赛灵思-Zynq UltraScale+ MPSoCs:产品简介

目录 1、 赛灵思-Zynq UltraScale MPSoCs&#xff1a;产品简介1.1、Zynq UltraScale MPSoCs简介1.2、Zynq UltraScale MPSoC 处理系统的主要特性1.2.1、功耗优先1.2.2、系统性能功耗比提升 5 倍 1.3、Zynq UltraScale™ MPSoC产品信息1.3.1、Zynq UltraScale™ MPSoC产品型号1.…