五、Spring 注解开发

news2024/10/7 4:32:47

文章目录

  • 一、使用注解开发的环境准备
  • 二、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/beans
      		        https://www.springframework.org/schema/beans/spring-beans.xsd
      		        http://www.springframework.org/schema/context
      		        https://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 {
      
          @Bean
           public 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.coloradmin.cn/o/743954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.2.6 网络基本服务----电子邮件系统(E-mail)

6.2.6 网络基本服务----电子邮件系统&#xff08;E-mail&#xff09; 电子邮件系统是因特网上使用的最多且最受用户欢迎的一种应用 电子邮件系统包括用户代理和邮件服务器&#xff0c;提供收发邮件、邮件传送服务&#xff0c;邮件被传送到收信人邮件服务器的收信人信箱中&…

这所C9考数二英二!但409分被刷,387分直接放弃复试!

一、学校及专业介绍 西安交通大学简称“西安交大”&#xff0c;位于陕西省西安市&#xff0c;是中华人民共和国教育部直属的综合性研究型全国重点大学&#xff0c;由教育部、陕西省与国家国防科技工业局共建&#xff0c;国家“双一流”建设高校&#xff0c;首批进入国家“211工…

Sentionel流控授权规则

很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源访问控制的功能。来源访问控制根据资源的请求来源&#xff08;origin&#xff09;限制资源是否通过&#xff1a; 若配置白名单&#xff0c;则只有请求来源位于…

ELK日志记录——Kibana组件——grok 正则捕获插件、mutate数据修改插件、multiline 多行合并插件、date 时间处理插件

grok 正则捕获插件 grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明&…

Java 查找二叉树中某一结点的前驱结点以及后继结点

文章目录 前言什么是后继结点什么是前驱结点 代码实现查找某一结点的后继结点思路代码实现图解 查找某一结点的前驱结点思路代码实现图解 测试用例运行结果 结语 前言 给定二叉树结点定义Node结构如下&#xff0c;其中parent结点指向当前Node结点的父结点,根结点指向null&…

c++ 资源文件打包exe 写出指定目录

#include <iostream> #include <fstream> #include <Windows.h>int main() {// 加载资源HMODULE hModule GetModuleHandle(NULL);// HRSRC hResource FindResource(hModule, MAKEINTRESOURCE(IDR_MYSYS), RT_RCDATA);// IMAGE 是添加资源文件时起的名字HRS…

BOSHIDA DC电源模块过载保护的原理

BOSHIDA DC电源模块过载保护的原理 DC电源模块过载保护的原理是通过电路设计和控制算法来实现的&#xff0c;其基本思想是在系统发生过载时&#xff0c;通过控制电路的工作状态和输出特性&#xff0c;实现对输出电流的限制和保护。 具体来说&#xff0c;DC电源模块的过载保护主…

智慧城市建设与数字孪生技术的紧密关联

智慧城市是当今社会发展的趋势&#xff0c;它通过智能技术和数字化手段&#xff0c;实现城市各个领域的高效运行和可持续发展。而数字孪生技术作为智慧城市建设的重要支撑&#xff0c;正在发挥着重要的作用。 首先&#xff0c;数字孪生技术在城市规划和设计方面发挥着重要作用…

【C语言】4-C语言的数据表现形式之数据类型

0. 引言 在之前的例子中可以看到&#xff0c;在定义变量时需要指定变量的类型。C 语言要求在定义所有的变量与常量时都要指定变量的类型 为什么在用计算机运算时要指定数据的类型呢&#xff1f;在数学中&#xff0c;数值是不分类型的&#xff0c;数值的运算是绝对准确的&#…

重塑未来的1课:组装式交付新引擎——华为云智能化低代码平台

HDC期间可参与Astro注册抽奖&#xff0c;活动详情见文末&#xff01; 紧跟低代码技术飞速发展——华为云Astro智能工作流惊艳HDC.Cloud 2023&#xff01; 企业对未来智能化组装式交付的期待已不是空想。智能化低代码即将重新定义传统交付模式&#xff0c;密切连接AI科技与创造…

ue4 MRQ渲染器时,媒体纹理播放速度会被加快

问题描述&#xff1a;当MRQ渲染器开启抗锯齿时&#xff0c;媒体纹理的播放速度会被加快 解决办法&#xff1a;通过执行抗锯齿控制台命令来解决

手写文字识别为何这么难?怎么应对?

手写文字识别是一项极具挑战性的任务&#xff0c;它之所以比识别印刷体文字难&#xff0c;笔者认为&#xff0c;主要原因在于以下几个方面&#xff1a; 首先&#xff0c;手写文字样式的多样性是识别难度的主要来源。我们知道&#xff0c;签名具有法律效力&#xff0c;为什么呢…

前端|项目实操流程|学成在线项目实操

参考视频&#xff1a;黑马程序员前端CSS3基础教程&#xff0c;前端必备基础 目录 &#x1f4da;案例准备工作 &#x1f4da;CSS属性书写顺序 &#x1f407;布局定位属性 &#x1f407;自身属性 &#x1f4da;页面布局整体思路 &#x1f4da;学成在线项目制作 &#x1f4…

ELK 企业级日志分析系统的概念、ELK Elasticsearch 集群部署

ELK 企业级日志分析系统 一、ELK 的概述1、ELK 简介2、可以添加的其它组件3、filebeat 结合 logstash 带来好处&#xff1a;4、Fluentd的概念 二、ELK的特征与工作原理1、为什么要使用 ELK2、完整日志系统基本特征3、ELK 的工作原理 三、ELK Elasticsearch 集群部署&#xff08…

设计模式——门面模式

门面模式 定义 门面模式&#xff08;Faade Pattern&#xff09;又称为外观模式&#xff0c;是一种比较常用的封装模式。 要求一个子系统的外部与其内部的通信通过一个统一的对象进行。门面模式提供一个高层次的接口&#xff0c;使得子系统更易于使用 优缺点、应用场景 优点…

关于VUE报错“TypeError: Converting circular structure to JSON“

关于VUE报错“TypeError: Converting circular structure to JSON" 问题&#xff1a; [Vue warn]: Error in nextTick: "TypeError: Converting circular structure to JSON--> starting at object with constructor Vue| property $options -> object wit…

Linux驱动进阶(二)——设备驱动中的阻塞和同步机制

文章目录 前言阻塞与非阻塞等待队列等待队列概述等待队列的实现等待队列的使用 同步机制实验同步机制设计实验验证 小结 前言 阻塞和非阻塞是设备访问的两种基本方式。使用这两种方式&#xff0c;驱动程序可以灵活地支持阻塞与非阻塞访问。在写阻塞与非阻塞的驱动程序时&#…

喜报!Coremail连续4届入选嘶吼网络安全产业图谱

7月10日&#xff0c;嘶吼安全产业研究院联合国家网络安全产业园区&#xff08;通州园&#xff09;正式发布《嘶吼2023网络安全产业图谱》&#xff08;以下简称“图谱”&#xff09;。 Coremail成功入选本次图谱五大分类下14个细分领域&#xff0c;分别是安全自动化/协作&#x…

linux中数据库表相关查询

目录 1.显示所有职工的基本信息 2.查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号 3.求出所有职工的人数 4.列出最高工资和最低工资 5.列出职工的平均工资和总工资 6.创建一个只有职工号&#xff0c;姓名和参加工作的新表&#xff0c;名为工作日期表 7、显示所…

GPT(Generative Pre-Training)论文解读及实现(一)

1 GPT Framework 1.1 Unsupervised pre-training Given an unsupervised corpus of tokens U {u1, . . . , un}, we use a standard language modeling objective to maximize the following likelihood: 在给定语料上下文环境下&#xff0c;目标时最大化下面的语言模型&…