spring入门-bean

news2024/11/25 10:49:32

Spring 是一个开源的、轻量级的企业级 Java 应用程序框架,它提供了一种全新的、基于 IoC (控制反转)和 AOP(面向切面编程)的软件开发方式,以及众多的企业级应用程序开发组件和 API。使用 Spring 框架可以大大简化企业应用程序的开发,降低代码的耦合度和复杂度,提高应用程序的可维护性和可扩展性。

Bean的作用范围

<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>

在 Spring 框架中,Bean 的作用范围(Scope)用来决定一个 Bean 实例的生命周期以及在应用中使用该 Bean 实例的方式。Spring 支持以下几种作用范围:

  • singleton:单例模式,即每一个 Bean 容器中只会创建一个 Bean 实例,每次使用时都返回同一个实例。(默认为此模式)
    单例模式

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

  • session:Web 应用中的会话作用域,即每一个 HTTP 会话都对应一个单独的 Bean 实例。

  • request:Web 应用中的请求作用域,即每一个 HTTP 请求都对应一个单独的 Bean 实例。

  • global-session: 针对portlet的session作用域,属于portlet的全局作用域。

这些作用范围的选择取决于具体的业务需求和设计,可以根据不同的场景进行选择。
使用作用范围可以达到以下几个目的:

  • 节约资源:使用单例模式可以避免在多次调用时重复创建实例,节约了资源。
  • 控制对象的生命周期:通过设置不同的作用范围,可以控制 bean 对象的创建、初始化、销毁等过程。
  • 实现特定的业务需求:有些场景下需要为不同的请求或会话创建独立的 Bean 实例,使用请求或会话作用范围可以满足这种需求。

bean的生命周期

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        //ctx.registerShutdownHook();
        //关闭容器
        ctx.close();
    }
}

applicationContext.xml配置
在这里插入图片描述
bookServiceImpl

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        System.out.println("set .....");
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void destroy() throws Exception {
        System.out.println("service destroy");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

BookDaoImpl

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }

}

输出结果
在这里插入图片描述

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");加载上下文时就会触发bean的生命周期

概念

在 Spring 容器中,一个 Bean 的生命周期可以分为以下几个阶段:

  • 实例化:Spring 容器通过反射机制创建一个 Bean 的实例。
  • 设置属性:Spring 容器将配置文件中的属性值和对其它 Bean 的引用传递到 Bean 实例中,完成 Bean 的属性注入。
  • 初始化前回调:如果 Bean 实现了 InitializingBean 接口,则调用其 afterPropertiesSet() 方法。
  • 自定义初始化回调:如果在配置文件中配置了 init-method 属性,则调用其指定的初始化方法。默认情况下,该方法名称为 init()。
  • 初始化后回调:如果 Bean 实现了 BeanPostProcessor 接口,则对所有 Bean 实例应用 postProcessBeforeInitialization() 方法。
  • 初始化:Bean 实例已经完成了初始化,可以使用了。
  • 初始化后回调:如果 Bean 实现了 BeanPostProcessor 接口,则对所有 Bean 实例应用 postProcessAfterInitialization() 方法。
  • 使用:Bean 实例可以被应用程序使用了。
  • 销毁前回调:如果 Bean 实现了 DisposableBean 接口,则调用其 destroy() 方法。
  • 自定义销毁回调:如果在配置文件中配置了 destroy-method 属性,则调用其指定的销毁方法。默认情况下,该方法名称为 destroy()。

以上是一个典型的 Bean 生命周期的阶段,但并不是每个 Bean 都需要经历全部的阶段,具体的 Bean 生命周期会受到该 Bean 的具体实现、Spring 配置文件的设置等各种因素的影响。

bean扫描

方法一:xml配置

<context:component-scan base-package="com.itheima"/>

context:component-scan 标签会扫描以下四个注解:

  • @Component:用于声明一个普通的组件类,通常作为其他组件类的基础组件使用。
  • @Controller:用于声明 Web 控制器类,主要处理 HTTP 请求和响应,通常与 @RequestMapping 注解一起使用。
  • @Service:用于声明服务类,通常作为业务逻辑的实现类使用,例如数据操作、事务管理等。
  • @Repository:用于声明数据访问对象(DAO)类,通常实现对数据库或者其他存储介质的访问,例如 CRUD 操作、查询等。

以上注解都属于 Spring 提供的基本注解,可以通过在类上使用这些注解来告诉 Spring 框架如何管理和使用这些组件。在 Spring 应用程序中,通常会将这些注解用于标记需要被 Spring 容器管理的组件类,以便在运行时自动装配和使用这些组件。
需要注意的是,context:component-scan 标签会扫描指定包下的所有类,并将其中使用了以上注解的类自动注册为 Spring Bean。因此,在使用这个标签时,需要仔细选择需要扫描的基础包名,避免将不需要注册为 Spring Bean 的类也加入到 Spring 容器中。

方法二:java类配置

@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}

@Configuration 注解表示这是一个配置类,用于声明 Spring 应用程序中的组件。通常情况下,我们会将所有相关的 Spring 配置信息放在一个或多个配置类中,以便在启动应用程序时加载和使用它们。
@ComponentScan 注解用于配置 Spring 的组件扫描功能,它可以告诉 Spring 框架在哪些包下扫描组件并将它们注册到 Spring 容器中。在上述代码中,它指定了两个需要扫描的包路径分别是 com.itheima.service 和 com.itheima.dao。
此外,@ComponentScan 注解还可以指定其他属性,例如过滤规则、扫描策略等,以便更加灵活地控制组件的扫描和管理。
综上所述,上述代码配置的 SpringConfig 类用于声明 Spring 配置信息和组件扫描路径,在启动应用程序时,Spring 框架会根据这些配置信息扫描指定的包路径,并自动注册扫描到的组件到 Spring 容器中,以便后续使用。

@Component注解和@Controller、@Service、@Repository三个衍生注解有什么区别?

  • @Component、@Controller、@Service、@Repository 这四个注解都是 Spring 框架提供的用于描述组件的注解。它们之间的区别主要在于它们的作用范围和语义不同。
  • @Component 注解是基本注解,用于声明一个普通的 Spring 组件类。它可以用于任何类型的组件类,通常作为其他高级注解的基础组件来使用。
  • @Controller 注解用于声明一个 Spring MVC 的控制器类,用于处理 HTTP 请求和响应。通常与 @RequestMapping 注解一起使用。
  • @Service 注解用于声明一个业务服务类,主要用于实现业务逻辑,例如数据操作、事务管理等。
  • @Repository 注解用于声明一个数据访问对象(DAO)类,主要用于封装对数据库或者其他存储介质的访问,例如 CRUD 操作、查询等。
  • 这些注解的目的是为了将 Java 类标记为 Spring 中的组件,以便在运行时进行组件扫描和自动装配。具体来说,在 Spring 应用程序中,这些注解通常会被用于标记需要被 Spring 容器管理的组件,以便在运行时自动装配和使用这些组件。
  • 总的来说,@Controller、@Service、@Repository 等注解都是基于 @Component 注解衍生而来的,并且拥有更加具体的语义。在使用时,我们应该根据组件的作用和类型选择合适的注解,并将其用于标记相应的类。

@Autowired注解是如何进行自动装配的?

@Autowired 注解是 Spring 框架中用于进行自动装配的注解之一。它可以将容器中类型匹配的 Bean 实例自动注入到目标类中,从而实现依赖注入。
具体来说,当 Spring 容器检测到一个类中存在 @Autowired 注解时,它会根据被注解的字段或方法参数的类型,在容器中查找匹配的 Bean 实例,并将其自动注入到对应的字段或方法参数中,完成依赖注入的过程。
在进行自动装配时,Spring 框架会按照以下规则选择匹配的 Bean 实例:

  • 根据被注解的字段或方法参数的类型选择匹配的 Bean 实例。如果有且仅有一个类型匹配的 Bean 实例,则自动装配成功。
  • 如果有多个类型匹配的 Bean 实例,且这些 Bean 实例都没有指定主要实例,则 Spring 抛出异常。
  • 如果有多个类型匹配的 Bean 实例,但这些 Bean 实例中只有一个指定了主要实例,则自动装配使用主要实例。
  • 如果有多个类型匹配的 Bean 实例,且这些 Bean 实例都指定了主要实例,则 Spring 会根据 @Qualifier 注解指定的名称或者 Bean 实例的名称进行匹配,选择满足条件的 Bean 实例进行自动装配。
    • 使用@Qualifier注解指定要装配的bean名称(@Qualifier注解无法单独使用,必须配合@Autowired注解使用)

作用:@Autowired 注解提供了一种方便的方式,可以帮助开发人员自动装配 Spring 容器中的 Bean 实例,从而简化了应用程序的配置和维护工作。

注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。

遇到的一些问题

java: 不再支持源选项 5。请使用 7 或更高版本。

在项目的 pom.xml 文件中设置 maven.compiler.source 和 maven.compiler.target 属性的值为 7 或更高版本

<project>
...
<properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <maven.compiler.source>17</maven.compiler.source>
   <maven.compiler.target>17</maven.compiler.target>
 </properties>
 <dependencies>
 ...
 </dependencies>
 ...
  </project>

扫描失败

报错Exception encountered during context initialization - cancelling refresh attempt:
<context:component-scan base-package="com.itheima"/>错误语句
解决办法:降版本,将java版本降为9

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

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

相关文章

算法02-入门算法枚举与模拟算法

文章目录 总结大纲要求枚举算法枚举思想枚举举例题目描述 统计因数题目描述 质数判定错误方法一&#xff1a;优化方法1&#xff1a; 用break实现优化优化方法2&#xff1a; sqrt(n) 题目描述 水仙花数题目描述 7744问题实现方法1优化方法2 题目描述 余数相同问题题目描述 特殊自…

安卓Termux搭建web服务器【公网远程手机Android服务器】

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 转载自cpolar极点云的文章&#xff1a;【手机建站】TermuxCpolar内网穿透&#xff0c;搭建可以被外网访问的网站 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android…

代码随想录算法训练营第三十九天 | 力扣 62.不同路径, 63. 不同路径 II

62.不同路径 题目 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多…

Stable Diffusion

文章目录 1.主界面功能介绍2.咒语一&#xff1a;3.参数3.1 采样步数3.2 提示词系数和随机种子 4.魔法书5.模型5.1 模型介绍5.2 模型种类及使用方法一览模型后缀名之谜常见模型种类及使用方法1.大模型。 2.Embedding (Textual inversion)3.Hypernetwork4.LoRA5.VAE模型 1.主界面…

代码随想录算法训练营第四十四天 | 力扣 518. 零钱兑换 II, 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

SpringCloud(1)

文章目录 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&…

【C数据结构】单链表的基本操作(多功能+思路+图解+代码备注+完整代码+效果图)

文章目录 前言1、单链表的定义2、结点的申请3、单链表的插入3.1、头插3.2、尾插3.3、在第i位插入 4、单链表的删除4.1、头删4.2、尾删4.3、在第i位删除 6、单链表的查找6.1、按值查找6.2、按位查找6.3、两者查找到后的更多的操作&#xff1a;插入操作&#xff1a;6.3.1、在第po…

Java中BitSet和Set统计不重复字符数量时间复杂度和空间复杂度分析

题目:HJ10 字符个数统计 牛客网上一道简单的题目&#xff0c;计算字符串中含有的不同字符的个数&#xff0c;一看这个题目&#xff0c;通常直接意识到方案的基本实现思路&#xff1a;设置一个容器&#xff0c;遍历字符串中的每个字符&#xff0c;若字符与容器中字符相同&#…

chatgpt赋能python:Python中求最大公约数的方法及实现

Python中求最大公约数的方法及实现 在数学中&#xff0c;最大公约数是指两个或多个整数的共同约数中最大的一个。对于Python开发工程师来说&#xff0c;求最大公约数是一个非常基本的操作&#xff0c;尤其在处理算法或数学题目时更加常见。本篇文章就是为了帮助大家更好的理解…

华为OD机试真题B卷 Java 实现【最长子字符串的长度】

一、题目描述 给你一个字符串s&#xff0c;字符串s首尾相连组成一个环形&#xff0c;请你在环形中找出‘o’字符出现了偶数次最长子字符串的长度。 二、输入描述 输入一串小写字母组成的字符串。 三、输出描述 输出一个整数。 四、解题思路 题目要求在给定的环形字符串中…

kong网关安装及konga安装

一、kong安装 安装机器地址&#xff1a;192.168.19.50 1、自定义一个docker网络 [rootmin ~]# docker network create kong-net a9bde4e7d16e4838992000cd5612476b238f7a88f95a07c994a9f57be7f64c10查看网络是否创建成功 [rootmin ~]# docker network ls NETWORK ID NA…

3DMAX车缝线生成器插件使用方法详解

3dMax车缝线生成器插件,用于创建缝合对象和一个对象,以沿样条线或仅通过绘制选定边上的缝合之间的孔。 目前有两种类型的缝线,圆形缝线和平面缝线。对于给定类型的针脚,它们的厚度是最常用的。缝线的长度和间距以及旋转都可以很容易地调整,这些参数也可以随机设置,以创造…

vscode + CMake 构建C语言项目

文章目录 1. 所需工具2. 配置1. 编写顶级目录下的 CMakeLists.txt2. 编写子目录 src 里的 CMakeLists.txt3. 添加测试文件4. 开始构建 1. 所需工具 Visual Stduio Code&#xff08;vscode&#xff09; CMake 简介&#xff1a; CMake 是一个跨平台的 构建工具&#xff0c;用于 …

[论文阅读73]Prefix-Tuning:Optimizing Continuous Prompts for Generation

1. 基本信息 题目论文作者与单位来源年份Prefix-Tuning&#xff1a;Optimizing Continuous Prompts for GenerationXiang Lisa Li等 Stanford UniversityAnnual Meeting of the Association for Computational Linguistics2021 Citations 1009, References 论文链接&#xf…

基于java的超市管理系统设计与实现

摘 要 随着小型超市规模的发展不断扩大&#xff0c;商品数量急剧增加&#xff0c;有关商品的各种信息量也成倍增长&#xff0c;传统的人工记忆方式也慢慢的无法适应形势的变化。随着信息技术的发展&#xff0c;计算机已被广泛的用于社会的各个领域&#xff0c;成为推动社会发…

EMNLP - 征集系统演示

Call For System Demonstrations - EMNLP 2023 EMNLP 2023 系统演示计划委员会邀请演示计划的提案。演示范围从早期研究原型到成熟的生产就绪系统。特别感兴趣的是公开可用的开源或开放访问系统。鉴于自然语言处理领域的理论和应用研究的现状&#xff0c;我们还强烈鼓励展示技术…

利用画图以及代码分析详细解读外排序的实现过程

外排序的实现 思想代码分析完整代码 如果有海量数据需要排序&#xff0c;而在内存中放不下这么多数据&#xff0c;因此就不能使用内排序&#xff08;直接插入排序&#xff0c;希尔排序&#xff0c;堆排序&#xff0c;快速排序&#xff0c;归并排序等等&#xff09;。关于想了解…

Java利用JOL工具分析对象分布

对象的组成 对象头[Header] Markword&#xff1a;存储对象自身运行时数据如hashcode、gc分代年龄等&#xff0c;64位系统总共占用8个字节&#xff0c;关于Markword详细内存分布如下 类型指针&#xff1a;对象指向类元数据地址的指针&#xff0c;jdk8默认开启指针压缩&#xff…

算法基础学习笔记——⑫最小生成树\二分图\质数\约数

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨最小生成树 &#x1f353;朴素Prim &#x1f353;Kruskal算法 ✨二分图 &#x1f353;匈牙利算法 ✨质数 &#x1f353;&#xff08;1&#xff09;质数的判定——试除法 &#x1f353;&#xff08;2&…

简单认识OSI(计算机网络分层)七层模型

前言 学校上课讲的太笼统啥也不是&#xff0c;自己学的太玄学似懂非懂突然在看到了一篇公众文文章。文章从初始到现在&#xff0c;步步为营的遇到一个解决一个前人的问题&#xff0c;有了细致入微的讲述&#xff0c;把之前学的死东西都连起来了。 如果让你来设计网络https://m…