Spring中的bean配置

配置说明

类别描述
名称bean
类型标签
所属beans标签
功能定义Spring核心容器管理的对象
格式

属性
列表
id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id是唯一的
class:bean的类型,即配置的bean的全路径类名
范例
1、Bean别名配置

配置说明

类别描述
名称name
类型属性
所属bean标签
功能定义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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--name属性:可以设置多个别名,别名之间使用逗号,空格,分号等分隔注意:id只能设置一个,并且id的值要唯一。name可以设置多个给BookDao取别名--><bean class="com.demo.dao.impl.BookDaoImpl" id="bookDao" name="bookDao2,bookDao3"></bean></beans>
@Test
public void test01(){//创建IOC容器,加载xml文件创建文件中的对象到IOC容器中ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-bean-base.xml");//使用IOC容器获取name = bookDao2对象BookDao bean = (BookDao) ctx.getBean("bookDao2");//对象调用方法bean.save();//关闭容器ctx.close();
}

**注意事项:**获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException

2、Bean作用范围配置

配置说明

类别描述
名称scope
类型属性
所属bean标签
功能定义bean的作用范围,可选范围如下:
singleton 单例(默认)在IOC容器创建时创建,只创建一次
prototype 非单例 每次从IOC容器获取的时候都会创建新的对象,获取多次创建多次。
范例

scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。

  • request:仅适用于Web环境下的ApplicationContext,每一个Http请求都会拥有一个单独的实例。
  • session:仅适用于Web环境下的ApplicationContext,即每一个用户都将拥有一个单独的实例。
  • globalSession:仅适用于Web环境下的ApplicationContext,表示每一个全局的Http Session下都会拥有一个单独的实例。

为什么bean默认为单例?

适合交给容器进行管理的bean

  • 控制器对象 (以前用的Servlet做为控制器)
  • 业务层对象 (如:BookService)
  • 数据层对象 (如:BookDao或BookMapper)
  • 工具对象 (如:CartUtils对象)

以上对象都只需要创建一个就够了

不适合交给容器进行管理的bean

  • 封装实体的域对象(实体类对象 Book 包名:pojo,entity, domain)
  • 实体类对象一般是mybatis查询数据库得到结果,需要根据每一次结果创建对象
3、bean的生命周期

生命周期相关概念介绍

  • 生命周期:从创建到消亡的完整过程
  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期控制:在bean创建后到销毁前做一些事情

代码演示

  • 提供生命周期控制方法
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...");}
}
  • applicationContext.xml配置
<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
  • 测试类
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型,接口类型没有close方法ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//关闭容器,执行销毁的方法ctx.close();}
}
  • 容器关闭前触发bean的销毁
  • 关闭容器方式:
    • 手工关闭容器
      调用容器的close()操作
    • 注册关闭钩子(类似于注册一个事件),在虚拟机退出前先关闭容器再退出虚拟机
      调用容器的registerShutdownHook()操作
public class AppForLifeCycle {public static void main( String[] args ) {//此处需要使用实现类类型,接口类型没有close方法ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器ctx.registerShutdownHook();//关闭容器//ctx.close();}
}
4、Bean对象的创造方式

构造方法方式

  • BookDaoImpl实现类
public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}
  • applicationContext.xml配置
<!--方式一:构造方法实例化bean-->
<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl"/>
  • AppForInstanceBook测试类
public class AppForInstanceBook {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();}
}

**注意:**无参构造方法如果不存在,将抛出异常BeanCreationException

静态工厂方式

  • OrderDao接口和OrderDaoImpl实现类
public interface OrderDao {public void save();
}
public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
}
  • OrderDaoFatory工厂类
//静态工厂创建对象
public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println("factory setup....");return new OrderDaoImpl();}
}
  • applicationContext.xml配置
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.demo.factory.OrderDaoFactory" factory-method="getOrderDao"/>
  • AppForInstanceOrder测试类
public class AppForInstanceOrder {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
}

实例工厂方式

  • UserDao接口和UserDaoImpl实现类
public interface UserDao {public void save();
}
public class UserDaoImpl implements UserDao {public void save() {System.out.println("user dao save ...");}
}
  • UserDaoFactory工厂类
//实例工厂创建对象
public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}
  • applicationContext.xml配置
<!--方式三:使用实例工厂实例化bean-->
<bean id="userFactory" class="com.demo.factory.UserDaoFactory"/><bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
  • AppForInstanceUser测试类
public class AppForInstanceUser {public static void main(String[] args) {//        //创建实例工厂对象//        UserDaoFactory userDaoFactory = new UserDaoFactory();//        //通过实例工厂对象创建对象//        UserDao userDao = userDaoFactory.getUserDao();//        userDao.save();ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = (UserDao) ctx.getBean("userDao");userDao.save();}
}

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

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

相关文章

【微服务】springboot集成ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK环境搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 …

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab https://blog.csdn.net/weixin_45062076…

【Redis】Redis集群方案应该怎么做 都有哪些方案

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Redis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 &#xff08;1&#xff09;twemproxy &#xff08;2&#xff09;codis &#xff08;3&#xff09;redis cluster3.0自带的集群 …

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉&#xff0c;三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

MySQL 学习记录

基本常识 row-size-limitsblob&#xff1a; BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

Linux命令-apt-get命令(Debian Linux发行版中的APT软件包管理工具)

补充说明 apt-get命令 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个 包管理系统。deb包可以把一个应用的文件包在一起&#xff0c;大体就如同Windows上的安装文件。 语法 apt-get [OPTION] PACKAGE选项 apt-get install 安装新包 apt-get r…

【vue】图片加载骨架

一、前言 在网速较低或者网站的服务器宽带只有几MB的情况下&#xff0c;网页中的图片加载时&#xff0c;要么空白&#xff0c;要么像打印机一样一行一行地“扫描”出来&#xff0c;为了提升用户体验&#xff0c;可以给图片标签外加一层骨架。 无骨架 有骨架 二、详细设计 每张…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…

Asp.net Core Mvc 7.0 Web 控制器接收Get/Post表单参数

记得.Net 5之前都是直接用 Request.Form 非常方便&#xff0c;但似乎6.0以后就不能这样用了。 1、接受post表单&#xff0c;使用 IFormCollection public IActionResult Login(IFormCollection pms){ViewData["name"] pms["login-username"]; ViewData[&…

如何在 VM 虚拟机中安装 Deft(数字证据及取证工具箱) 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Deft 镜像 下载…

Open CASCADE学习| ​提取曲面的PCurve

PCurve这个概念&#xff0c;字面上来理解就是参数曲线&#xff08;Parametric Curve&#xff09;。参数空间曲线是在参数曲面的双参数空间中的二维样条曲线。 二维曲线定义的目的只有一个&#xff1a;pCurve&#xff0c;参数曲线。OCC采用参数法构建几何结构&#xff0c;所有的…

【缓存周总结】Redis缓存的使用以及数据安全的处理

前言 Redis非关系型数据库已经是很常见的工具了&#xff0c;项目中用到的也很多&#xff0c;这篇文章系统的分析下使用过程中可能会遇到的问题 一、缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 我们项目中引用的Redis目的就是…

【前端web入门第二天】02 表单-input标签-单选框-多选框

表单 文章目录: 1.input标签基本使用 1.1 input标签占位文本1.2 单选框 radio 1.3 多选框 checkbox 作用:收集用户信息。 使用场景: 登录页面注册页面搜索区域 1.input标签基本使用 input标签type属性值不同&#xff0c;则功能不同。 <input type"..."&g…

Android Okhttp断点续传

什么是断点续传 指的是在上传/下载时&#xff0c;将任务&#xff08;一个文件或压缩包&#xff09;人为的划分为几个部分&#xff0c;每一个部分采用一个线程进行上传/下载&#xff0c;如果碰到网络故障&#xff0c;可以从已经上传/下载的部分开始继续上传/下载未完成的部分&a…

RabbitMQ面试

1. 什么是RabbitMQ RabbitMQ是使用Erlang语言开发的&#xff0c;基于AMQP高级消息队列的开源消息中间件 Erlang语言主要用于开发并发和分布式系统&#xff0c;在电信领域得到广泛应用 2.什么是消息中间件 消息中间件是在分布式系统中传递消息的软件服务。它允许不同的系统组件…

机器学习 | 如何使用 Seaborn 提升数据分析效率

Seaborn和Matplotlib都是Python可视化库&#xff0c;它们都可以用于创建各种类型的图表。但是&#xff0c;Seaborn 和Matplotlib在概念和设计上有一些不同。 Matplotlib虽然已经是比较优秀的绘图库了&#xff0c;但是它有个今人头疼的问题&#xff0c;那就是API使用过于复杂&am…

面试经典 150 题 ---- 移除元素

面试经典 150 题 ---- 移除元素 移除元素方法一&#xff1a;双指针方法二&#xff1a;双指针优化 移除元素 方法一&#xff1a;双指针 题目要求在原数组的基础进行元素的删除&#xff0c;所以输出的数组长度一定小于原数组的长度&#xff0c;因此可以使用双指针&#xff0c;r…

CMMI、SPCA、CSMM,三种认证的差异有哪些?

在当今的企业环境中&#xff0c;体系认证已经成为了一个重要的议题。其中&#xff0c;CMMI、SPCA和CSMM是三种广泛使用的认证&#xff0c;它们在各自领域内具有特定的目标和要求&#xff0c;今天擎标就带大家了解一下这三种认证之间的差异。 CMMI、CSMM和SPCA分别是什么 1、C…

htb Pov wp简记

最近懒得飞起 不想写太细&#xff0c;有师傅想看完整的可以留个言或者私信 我再补补… user部分 nmap只扫到一个端口 http/80 目录没扫出什么 vhost扫出dev来 在抓包访问页面邮箱丢出去的包有包含asp.net的viewstate&#xff0c;这里一开始我还没在意&#xff0c;后来发现有个…