三种配置Spring程序的方法

1 使用XML文件配置Spring程序

在XML文件中使用bean标签,将其交给容器管理

  • class: 指定bean对应的类型的全限定名称
  • id: 用于指定一个名称,作为该bean的唯一标识符,如果不需要id,也可不指定该属性
  • name: 用于指定bean的别名,多个的使用空格或逗号或分号分割
  • scope: 指定bean的范围,决定了bean实例化的数量
    scope有效值:
            singleton: 默认值,单例,每次请求一个bean,返回的是同一个共享实例
            prototype: 原型,每次请求一个bean,获取的是一个新的实例
            其他值包括:request, session, application, websocket等,是在web程序中使用
<bean id="dog" name="gou,quan" class="com.qdu.bean.Dog"scope="prototype" /><bean id="sheep" class="com.qdu.bean.Sheep" /><bean class="com.qdu.bean.Pig" />
  • 对于单例的bean,容器启动的时候就会实例化 ,如果将lazy-init设置为true,则单例的bean在第一次请求的时候被实例化。scope为prototype的bean在每次请求的时候被实例化
  • init-method指定初始化时要调用的方法
  • destroy-method指定bean被摧毁前要调用的方法
<bean id="singleDog" class="com.qdu.bean.SingleDog"lazy-init="true" init-method="init" destroy-method="destroy" />

在程序中获取bean的方式有:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的name获取bean的实例
  3. 可以根据bean的类型获取bean的实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog"); 
d1.eat();// 也可根据bean的name(别名)获取bean的实例
Dog d2 = (Dog) ctx.getBean("gou"); 
d2.eat();// 还可以根据bean的类型获取bean实例
Dog d3 = ctx.getBean(Dog.class); 
d3.eat();

2 使用Java代码配置Spring程序

如果使用的是java配置类,而不是xml配置文件,则需要使用ApplicationContext接口的AnnotationConfigApplicationContext实现类来创建容器。

可以传入一个或多个配置类的类型,这样形成的容器管理这些配置类注册的bean

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig1.class, SpringConfig2.class);

在com.qdu下创建一个config包来存储Java配置类

相应注解:

  • @Configuration说明类是一个java配置类
  • @Bean表示方法返回的对象成为Spring管理的bean。默认一个bean是单例范围,也就是不管请求该bean多少次,返回的是同一个共享实例。这种方式注册的spring bean的名称是方法名;可通过@Bean注解的name属性指定bean的一个主名称和多个别名,如果指定了名称,则方法名就不作为bean的名称了
  • 可通过@Bean注解的initMethod指定初始化时要调用的方法,方法名称随便起,但是不能有参数
  • 可通过@Bean注解的destroyMethod指定bean摧毁前要调用的方法,方法名称随便起,但是不能有参数
  • @Scope注解用于指定bean的范围,默认是singleton,还可以是prototype, request, session, application等
  • @Lazy指示bean使用懒加载/延迟加载,默认单例的bean是容器启动就实例化。如果使用该注解,则是第一次请求该bean的时候实例化。

SpringConfig1.class:

@Configuration 
public class SpringConfig1 {@Bean(name= {"dog","gou","quan"})@Scope("prototype") public Dog dog() {return new Dog();}@Beanpublic Sheep sheep() {return new Sheep();}@Bean(initMethod="init",destroyMethod="destroy")@Lazy public SingleDog singleDog() {return new SingleDog();}
}

在程序中获取bean的方式有:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的name获取bean的实例
  3. 可以根据bean的类型获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog");
d1.eat();Dog d2 = (Dog) ctx.getBean("gou");
d2.eat();Dog d3 = ctx.getBean(Dog.class);
d3.eat();

 3 使用注解配置Spring程序

若要使用注解配置,则需要在SpringConfig类中开启包扫描:

@Configuration
@ComponentScan(basePackages= {"com.qdu.bean"})
public class SpringConfig {}

同2, 在这里我们使用的是java配置类,而不是xml配置文件,则需要使用ApplicationContext接口的AnnotationConfigApplicationContext实现类来创建容器。

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

 在Dog类中别忘记添加注解@Component!!!

@Component //将一个bean注册为spring管理的bean,默认名称是首字母小写的类名
@Scope("prototype") //指定bean的范围,默认是singleton
public class Dog {public Dog() {System.out.println("实例化了Dog!!!");}public void eat() {System.out.println("这是一只狗,狗吃骨头!");}
}

除此之外,常用注解还有:

  • @Lazy:延迟加载
  • @PostConstruct:修饰的方法用于执行初始化工作
  • @PreDestroy:修饰的方法在bean摧毁前调用,用于执行如释放资源等操作
  • 方法名可以随便起,但是方法不能有参数!!!

在这里获取bean的方式有两种:

  1. 可以根据bean的id获取bean的实例
  2. 可以根据bean的类型获取bean的实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog"); 
d1.eat();// 还可以根据bean的类型获取bean实例
Dog d2 = ctx.getBean(Dog.class); 
d2.eat();

 

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

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

相关文章

【小米电脑管家】安装使用教程--非小米电脑

安装说明功能体验下载资源 Xiaomi HyperOS发布后&#xff0c;小米妙享电脑端独立版本也走向终点&#xff0c;最新的【小米电脑管家】将会内置妙享实现万物互联。那么本篇文章将分享非小米电脑用户如何绕过设备识别验证安装使用【小米电脑管家】实现万物互联 安装说明 1.解压文…

如何用Python编写俄罗斯方块Tetris游戏?

在本文中&#xff0c;我们将用Python代码构建一个令人惊叹的项目&#xff1a;俄罗斯方块游戏。在这个项目中&#xff0c;我们将使用pygame库来构建游戏。要创建此项目&#xff0c;请确保您的系统中安装了最新版本的Python。让我们开始吧&#xff01; Pygame是一组跨平台的Pyth…

wireshark过滤包小技巧

1、过滤包含某个字符串的数据包&#xff1a; 或者&#xff1a; 2、过滤包含某一连续十六进制的数据包&#xff1a; 或者&#xff1a; 3、过滤精确到位数位置 或者&#xff1a;

关于使用EB tresos出现无法激活的情况解决

EB安装完成时需要激活才能使用的&#xff0c;不然都无法建立工程。 我在安装eb studio时就是在激活方面有问题导致无法使用&#xff0c;下面讲解出现了什么问题以及我如何去解除的。 1.出现的错误提示&#xff1f; ERROR&#xff1a;flexActAPPActivationSend按照在官网中&…

低代码:轻松构建应用程序的新时代

在当今数字化时代&#xff0c;应用程序对于日常企业业务的开展&#xff0c;已经成为一种刚需。然而&#xff0c;应用程序开发的过程往往耗时耗力&#xff0c;对于企业来讲&#xff0c;是一笔不小的成本开支。低代码问世以来&#xff0c;一直在尝试为业务人员赋能&#xff0c;让…

扁平按钮样式

上图 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>扁平按钮</title><style>body {margin: 0;padding: 0;height: 100vh;display: flex;justify-content: center;ali…

Web漏洞-XSS绕过和pikachu靶场4个场景(三)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、XSS漏洞挖掘与绕过 1.1、XSS漏洞挖掘 数据…

排序算法---冒泡排序

1. 原理 对数组进行遍历&#xff0c;每次对相邻的两个元素进行比较&#xff0c;如果大的在前面&#xff0c;则交换两个元素的位置&#xff0c;完成一趟遍历后&#xff0c;数组中最大的数值到了数组的末尾。再对前面n-1个数值进行相同的遍历。一共完成n-1趟遍历就实现了排序。 1…

代码随想录 63. 不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到右下…

UI界面程序鼠标右键弹出菜单的一些事

1.概述 在做客户端UI程序时&#xff0c;鼠标右键弹出菜单这种操作非常常见&#xff0c;一般在鼠标右键按下或者鼠标右键抬起事件中响应操作&#xff0c;显示菜单即可&#xff0c;但是有时涉及到鼠标的移动&#xff0c;就是鼠标按下右键且移动时&#xff0c;则不需要弹出菜单&a…

104. 二叉树的最大深度(Java)

目录 解法&#xff1a; 官方解答&#xff1a; 方法一&#xff1a;深度优先搜索 方法二&#xff1a;广度优先搜索 思路与算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根…

【密码学引论】数字签名

第八章 数字签名 1、数字签名体制包括两个方面&#xff1a;施加签名、验证签名 SIG(M,Kd)S VER(S,Ke)bool&#xff08;真、假&#xff09; 2、数字签名和信息加密的区别&#xff08;从密码学五个组成部分来回答 3、安全性要求&#xff1a;先签名后加密&#xff1b;针对哈希函…

如何入门网络安全_网络安全自学

由于我之前写了不少网络安全技术相关的故事文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人在微信里问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff…

算法:合并两个有序数组(双指针)

时间复杂度 O(m n)&#xff0c;空间复杂度 O(1) /*** param {number[]} nums1* param {number} m* param {number[]} nums2* param {number} n* return {void} Do not return anything, modify nums1 in-place instead.*/ var merge function(nums1,m,nums2,n) {let p1 m-1…

harmonyOS学习笔记之@Styles装饰器与@Extend装饰器

Styles装饰器 定义组件重用样式 自定义样式函数使用装饰器 可以定义在组件内或全局,内部优先级>外部,内部不需要function,外部需要function 定义在组件内的styles可以通过this访问组件内部的常量和状态变量,可以在styles里通过事件来改变状态变量 弊端:只支持通用属性和通用…

深度模型训练时CPU或GPU的使用model.to(device)

一、使用device控制使用CPU还是GPU device torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU.先判断机器上是否存在GPU&#xff0c;没有则使用CPU训练 model model.to(device) data data.to(device)#或者在确定有GPU的…

解决 Cannot read properties of undefined (reading ‘getUserMedia‘) 报错

[TOC](解决 Cannot read properties of undefined (reading ‘getUserMedia’) 报错) 0. 背景 使用浏览器输入语音时&#xff0c;浏览器的控制台里面有下面错误信息。 Cannot read properties of undefined (reading getUserMedia)1. 解决方法 在浏览器中访问 chrome://fla…

半导体材料

半导体材料 电子元器件百科 文章目录 半导体材料前言一、半导体材料是什么二、半导体材料的类别三、半导体材料的应用实例四、半导体材料的作用原理总结前言 半导体材料具有独特的电学性质,使其在电子器件和集成电路中有广泛的应用。通过控制半导体材料中载流子的浓度和运动方…

数字化浪潮下,你的企业数字化转型了吗?

企业数字化转型面临的挑战 技术转型挑战&#xff1a;数字化转型涉及到各种新技术、新软件和新硬件&#xff0c;需要企业有一定的技术实力和专业知识&#xff0c;并且需要不断学习和适应变化。对于传统企业来说&#xff0c;可能面临技术门槛高、技术更新快等问题。组织结构转型…

如何用flex布局设计登录页?

使用 Flex 布局设计登录页是一种简单而灵活的方式&#xff0c;让页面在不同屏幕大小下都能有良好的布局。以下是一个简单的例子&#xff0c;演示如何使用 Flex 布局设计登录页&#xff1a; HTML 结构&#xff1a; <!DOCTYPE html> <html lang"en"> <…