Spring |(五)IoC/DI的注解开发

文章目录

  • 📚核心容器
    • 🐇环境准备
    • 🐇容器的创建方式
    • 🐇bean的三种获取方式
    • 🐇BeanFactory的使用
  • 📚IoC/DI注解开发
    • 🐇环境准备
    • 🐇注解开发定义bean
    • 🐇纯注解开发模式
    • 🐇bean的作用范围
    • 🐇bean的生命周期
  • 📚小结

学习来源:黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术

📚核心容器

🐇环境准备

在这里插入图片描述

  • 创建一个Maven项目。
  • pom.xml添加Spring的依赖。
     <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies>
    
  • resources下添加applicationContext.xml
      <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/></beans>
    
  • 添加BookDao和BookDaoImpl类
    public interface BookDao {public void save();
    }
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ..." );}
    }
    

🐇容器的创建方式

  • 创建运行类App
    public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    
  • 类路径下的XML配置文件
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
  • 文件系统下的XML配置文件(不推荐使用)
    ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml"); 
    

🐇bean的三种获取方式

在这里插入图片描述

  • 方式一getBean("名称")(存在的问题是每次获取时都需要进行类型转换

    BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    
  • 方式二getBean("名称",类型.class)(可以解决类型强转问题,但参数又多加了一个

    BookDao bookDao = ctx.getBean("bookDao"BookDao.class);
    
  • 方式三getBean(类型.class)(类似于按类型注入,但要确保IoC容器中该类型对应的bean对象只能有一个

    BookDao bookDao = ctx.getBean(BookDao.class);
    

🐇BeanFactory的使用

  • 使用BeanFactory来创建IoC容器
    public class AppForBeanFactory {public static void main(String[] args) {Resource resources = new ClassPathResource("applicationContext.xml");BeanFactory bf = new XmlBeanFactory(resources);BookDao bookDao = bf.getBean(BookDao.class);bookDao.save();}
    }
    

  • 为了更好的看出BeanFactoryApplicationContext之间的区别,在BookDaoImpl添加如下构造函数:
    public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("constructor");}public void save() {System.out.println("book dao save ..." );}
    }
    
  • 如果不去获取bean对象,打印会发现:
    • BeanFactory是延迟加载,只有在获取bean对象的时候才会去创建。
    • ApplicationContext是立即加载,容器加载的时候就会创建bean对象。
    • ApplicationContext要想成为延迟加载,只需要按照如下方式进行配置(了解即可)。
      <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"  lazy-init="true"/></beans>
    

  1. BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载。
  2. ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载。
  3. ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能。
  4. ApplicationContext接口常用初始化类
    • ClassPathXmlApplicationContext(常用)
    • FileSystemXmlApplicationContext

📚IoC/DI注解开发

🐇环境准备

这里是引用

  • 创建一个Maven项目

  • pom.xml添加Spring的依赖

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies>
    
  • resources下添加applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    </beans>
    
  • 添加BookDao、BookDaoImpl、BookService、BookServiceImpl类

     public interface BookDao {public void save();}public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ..." );}}public interface BookService {public void save();}public class BookServiceImpl implements BookService {public void save() {System.out.println("book service save ...");}}
    
  • 创建运行类App

    public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
    }
    

🐇注解开发定义bean

  • 步骤1:删除原XML配置。把配置文件中的<bean>标签删掉。
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    
  • 步骤2:Dao上添加注解,在BookDaolmpl类上添加@Component注解。
    @Component("bookDao")
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ..." );}
    }
    
    在这里插入图片描述
    • 注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的。
  • 步骤3:在BookServiceImpl类上也添加@Component交给Spring框架管理。
    @Component
    public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void save() {System.out.println("book service save ...");bookDao.save();}
    }
    
    • @Component注解如果不起名称,即直接就是@Component而不是类似于@Component("bookDao"),默认值就是当前类名首字母小写
  • 步骤4:配置Spring的注解包扫描。为了让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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><context:component-scan base-package="com.itheima"/>
    </beans>
    
    • component-scan
      • component:组件,Spring将管理的bean视作自己的一个组件。
      • scan:扫描。
    • base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解。
      • 包路径越多[如:com.itheima.dao.impl],扫描的范围越小速度越快。
      • 包路径越少[如:com.itheima],扫描的范围越大速度越慢。
      • 一般扫描到项目的组织名称即Maven的groupId下[如:com.itheima]即可。
  • 步骤5:运行程序。
    public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");System.out.println(bookDao);//按类型获取beanBookService bookService = ctx.getBean(BookService.class);System.out.println(bookService);}
    }
    

    在这里插入图片描述


  • 衍生的三个注解@Controller@Service@Repository,这三个注解和@Component注解的作用是一样的,目的是方便我们后期在编写类时能很好的区分出这个类是属于表现层业务层还是数据层的类。
    • @Controller 注解用于标识一个类为控制器(Controller),主要用于处理用户的请求并返回相应的视图。通常用于Spring MVC框架中,处理Web请求,并将处理结果返回给用户。
    • @Service 注解用于标识一个类为服务(Service),主要用于定义业务逻辑的处理。它在应用程序中起到了事务边界的作用,将业务逻辑从控制器中分离出来,使得代码更加清晰和可维护。
    • @Repository 注解用于标识一个类为存储库(Repository),主要用于与数据库或其他持久化机制进行交互。它通常是用于访问和操作数据库的接口,提供了一些常用的持久化方法,如增删改查。

🐇纯注解开发模式

Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道。

  • 步骤1:创建一个配置类SpringConfig,并在该配置类上添加@Configuration注解,替换applicationContext.xml
  • 步骤2:再添加包扫描注解@ComponentScan替换<context:component-scan base-package=""/>
    @Configuration
    @ComponentScan("com.itheima")
    public class SpringConfig {
    }
    
    在这里插入图片描述
    • @ComponentScan注解用于设定扫描路径,只能添加一次,多个数据用数组格式。
      @ComponentScan({com.itheima.service","com.itheima.dao"})
      
  • 步骤3:创建一个新的运行类AppForAnnotation,读取Spring核心配置文件初始化容器对象【切换为】读取Java配置类初始化容器对象,并运行。
    public class AppForAnnotation {public static void main(String[] args) {//加载配置文件初始化容器//ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//加载配置类初始化容器ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao = (BookDao) ctx.getBean("bookDao");System.out.println(bookDao);BookService bookService = ctx.getBean(BookService.class);System.out.println(bookService);}
    }
    

    在这里插入图片描述

🐇bean的作用范围

  • 默认情况下bean是单例,要想变成非单例,需要在其类上添加@scope注解。
    @Repository
    //@Scope设置bean的作用范围
    @Scope("prototype")
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}
    }
    

🐇bean的生命周期

  • 步骤1:在BookDaoImpl中添加两个方法,initdestroy,方法名可以任意。

    @Repository
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}public void init() {System.out.println("init ...");}public void destroy() {System.out.println("destroy ...");}
    }
    
  • 步骤2:在对应的方法上添加@PostConstruct@PreDestroy注解分别表示初始化方法和销毁方法。

    @Repository
    public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save ...");}@PostConstruct //在构造方法之后执行,替换 init-methodpublic void init() {System.out.println("init ...");}@PreDestroy //在销毁方法之前执行,替换 destroy-methodpublic void destroy() {System.out.println("destroy ...");}
    }
    
  • 步骤3:需要注意的是destroy只有在容器关闭的时候,才会执行,所以需要修改App的类,并运行。

    public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao1 = ctx.getBean(BookDao.class);BookDao bookDao2 = ctx.getBean(BookDao.class);System.out.println(bookDao1);System.out.println(bookDao2);ctx.close(); //关闭容器}
    }
    

    在这里插入图片描述

  • 注意:@PostConstruct@PreDestroy注解如果找不到,需要导入下面的jar包,因为从JDK9以后jdk中的javax.annotation包被移除了,这两个注解刚好就在这个包中。

    <dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version>
    </dependency>
    

📚小结

在这里插入图片描述

  • 知识点1:@Component等
    在这里插入图片描述

  • 知识点2:@Configuration
    在这里插入图片描述

  • 知识点3:@ComponentScan
    在这里插入图片描述

  • 知识点4:@Scope

    在这里插入图片描述

  • 知识点5:@PostConstruct
    在这里插入图片描述

  • 知识点6:@PreDestroy
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux -日志 | 线程池 | 线程安全 | 死锁

文章目录 1.日志1.1日志介绍1.2策略模式1.3实现日志类 2.线程池2.1线程池介绍2.2线程池的应用场景2.3线程池的设计2.4代码实现2.5修改为单例模式 3.线程安全和函数重入问题3.1线程安全和函数重入的概念3.2总结 4.死锁4.1什么是死锁4.2产生死锁的必要条件4.3避免死锁 1.日志 1.…

AI时代的PPT革命:智能生成PPT工具为何备受青睐?

在日常工作和学习中&#xff0c;PPT是我们不可或缺的表达工具。制作一份精美的PPT常常需要耗费数小时&#xff0c;甚至几天的时间。从选择主题到调整排版&#xff0c;琐碎的细节让人筋疲力尽。但现在一种名为“AI生成PPT”的技术正悄然崛起&#xff0c;彻底颠覆了传统PPT制作的…

结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用

目录 第一章 夯实基础 R/Rstudio简介及入门 第二章 结构方程模型&#xff08;SEM&#xff09;介绍 第三章 R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 第四章 SEM全局估计&#xff08;lavaan&#xff09;在生态学领域高阶应用 第五章 SEM潜变量分析在生态学领域…

CANopen多电机控制的性能分析

在 CANopen 总线上控制多台电机并实时获取位置和速度信息&#xff0c;通信速度受到总线带宽、电机数量、数据刷新频率等因素影响。在 LabVIEW 开发中&#xff0c;利用 PDO 优化数据传输&#xff0c;合理设置刷新周期&#xff0c;并结合高效任务管理&#xff0c;可以显著提高多电…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例

目录 Cusor的主要特点 Cusor实操 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; Cursor 是 Visual Studio Code 的一个分支。这使我们能够…

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测&#xff0c;本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中&#xff0c;虽然原生应用通常基于 ArkTS 实现&#xff0c;但在实际研发过程中发现&#xff0c;使用 C…

二,[ACTF2020 新生赛]Include1感谢 Y1ng 师傅供题。

进入靶场后&#xff0c;发现tips可以点击 点击后进入此页面 猜测此为文件上传漏洞,构造payload&#xff0c;并成功得到base64编码后的源码 详解payload&#xff1a; php://filter/readconvert.base64-encode/resourceflag.php 1.php://filter是PHP中的一个流封装协议&#xf…

EXTI配置流程 含中断延时消抖点亮小灯

如图可知&#xff0c;配置流程分成以下一个部分 ①使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE();// 打开时钟 ②初始化利用 HAL_GPIO_Init 一步到位&#xff0c;可以初始化外设GPIO的一切 4个参数 &#xff08;引脚 Pull 这里选择的模式是从下面这几个里面选 速度&#x…

AIGC-----AIGC在虚拟现实中的应用前景

AIGC在虚拟现实中的应用前景 引言 随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的应用也迎来了新的契机。AIGC与VR的结合为创造沉浸式体验带来了全新的可能性&#xff0c;这种组合不仅极大地降低了VR内容的…

Docker部署mysql:8.0.31+dbsyncer

Docker部署mysql8.0.31 创建本地mysql配置文件 mkdir -p /opt/mysql/log mkdir -p /opt/mysql/data mkdir -p /opt/mysql/conf cd /opt/mysql/conf touch my.config [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4 [mysqld] #设置3306端口 port33…

大语言模型LLM的微调代码详解

代码的摘要说明 一、整体功能概述 这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型&#xff08;具体为 TAIDE-LX-7B-Chat 模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;的功能&#xff0c;使其能更好地应用于生成唐诗相关内容的…

解决SSL VPN客户端一直提示无法连接服务器的问题

近期服务器更新VPN后&#xff0c;我的win10电脑一致无法连接到VPN服务器&#xff0c; SSL VPN客户端总是提示无法连接到服务端。网上百度尝试了各种方法后&#xff0c;终于通过以下设置方式解决了问题&#xff1a; 1、首先&#xff0c;在控制面板中打开“网络和共享中心”窗口&…

《基于FPGA的便携式PWM方波信号发生器》论文分析(三)——数码管稳定显示与系统调试

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器&#xff0c;旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…

基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径

知识点&#xff1a; 1、基础入门-Web应用-域名上的技术要点 2、基础入门-Web应用-源码上的技术要点 3、基础入门-Web应用-数据上的技术要点 4、基础入门-Web应用-解析上的技术要点 5、基础入门-Web应用-平台上的技术要点 一、演示案例-域名差异-主站&分站&端口站&…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理&#xff1a; 1.3.2 自定义绘制饼状图&#xff1a; 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…

Servlet细节

目录 1 Servlet 是否符合线程安全&#xff1f; 2 Servlet对象的创建时间&#xff1f; 3 Servlet 绑定url 的写法 3.1 一个Servlet 可以绑定多个url 3.2 在web.xml 配置文件中 url-pattern写法 1 Servlet 是否符合线程安全&#xff1f; 答案&#xff1a;不安全 判断一个线程…

VisionPro 机器视觉案例 之 凹点检测

第十六篇 机器视觉案例 之 凹点检测 文章目录 第十六篇 机器视觉案例 之 凹点检测1.案例要求2.实现思路2.1 方式一&#xff1a;斑点工具加画线工具加点线距离工具2.2 方法二 使用斑点工具的结果集边缘坐标的横坐标最大值ImageBoundMaxX2.3 方法三 使用斑点工具的结果集凹点结果…

SAP 零售方案 CAR 系统的介绍与研究

前言 当今时代&#xff0c;零售业务是充满活力和活力的业务领域之一。每天&#xff0c;由于销售运营和客户行为&#xff0c;它都会生成大量数据。因此&#xff0c;公司迫切需要管理数据并从中检索见解。它将帮助公司朝着正确的方向发展他们的业务。 这就是为什么公司用来处理…

手搓人工智能—聚类分析(下)谱系聚类与K-mean聚类

“无论结果如何&#xff0c;至少我们存在过” ——《无人深空》 前言 除了上一篇手搓人工智能-聚类分析&#xff08;上&#xff09;中提到的两种简单聚类方式&#xff0c;还有一些更为常用、更复杂的聚类方式&#xff1a;谱系聚类&#xff0c;K-均值聚类。 谱系聚类 谱系聚类…