spring手把手超详细讲解(基本配置,基于xml)

2023-05-16

spring教程

  • 1.1. 容器概述
    • 1.1.1. 配置元数据
    • 1.1.2. 容器的实例化
    • 1.1.3. 容器的使用
  • 1.2. bean的概述
    • 1.2.1. 命名bean
    • 1.2.2. 实例化Bean
  • 1.3. 依赖
    • 1.3.1. 依赖注入
    • 1.3.2. 使用 属性
    • 1.3.3. 懒加载bean
    • 1.3.4. 自动注入
  • 1.4. Bean 的作用域
    • 1.4.1. Singleton(单例)的作用域
    • 1.4.2.Prototype(原型)的作用域
  • 1.5. 自定义bean的特性
    • 1.5.1. 生命周期回调
    • 1.5.2初始化方法回调销毁方法回调
    • 1.5.3在非Web应用中优雅地关闭Spring IoC容器
  • 1.6 ApplicationContextAware 和 BeanNameAware
  • 1.7. Bean 定义的继承

IOC配置详解

1.1. 容器概述

**
ApplicationContext是Spring IoC容器实现的代表,它负责实例化,配置和组装Bean。容器通过读取配置元数据获取有关实例化、配置和组装哪些对象的说明 。配置元数据可以使用XML、Java注解或Java代码来呈现。它允许你处理应用程序的对象与其他对象之间的互相依赖关系。

1.1.1. 配置元数据

使用xml的配置

简单、直观 适合入门

基于注解的配置:

 @Compont(@serivce @controller @repository) @Autowride

Spring 2.5 支持基于注解的元数据配置:

SSM框架开发中 的使用基于Java的配置: @Confiration @Bean @Import
	从 Spring 3.0开始, 由Spring JavaConfig项目提供的功能已经成为Spring核
心框架的一部分。因此,你可以使用Java配置来代替 XML配置定义外部bean .
	
从spring4.0开始支持springboot1.0 之后 

springboot 完全采用javaConfig的方式进行开发。

1.1.2. 容器的实例化

对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建 

1.1.3. 容器的使用

ApplicationContext是能够创建bean定义以及处理相互依赖关系的高级工厂接口,使用	方法T getBean(String name, Class<T> requiredType)获取容器实例。
1//创建spring上下文 加载所有的bean
2ApplicationContext context = new ClassPathXmlApplicationContext("service s.xml", "daos.xml");
3 
4//获取bean
5PetStoreService service = context.getBean("petStore", PetStoreService.cla ss);
6 
7//使用bean的对象
List<String> userList = service.getUsernameList();

1.2. bean的概述

1.2.1. 命名bean

<bean class="com.tuling.entity.User" id="user" name="user2 user3,user4;us er5"></bean>
为外部定义的bean起别名

1.2.2. 实例化Bean

1 使用构造器实例化 默认无需设置
缺点:无法干预实例化过程

2 使用静态工厂方法实例化
<bean class="com.tuling.service.impl.UserServiceImpl" id="userService2"factory‐method="createUserServiceInstance" ></bean>
public static UserServiceImpl createUserServiceInstance(){return new UserServiceImpl();}
使用实例工厂方法实例化
<bean class="com.tuling.service.impl.UserServiceImpl" id="userService"factory‐bean="serviceFactory"factory‐method="createUserService" ></bean>
public class createUserService{public UserServiceImpl createUserFactory(){return new UserServiceImpl();} }

1.3. 依赖

1.3.1. 依赖注入

基于setter方法的依赖注入
<!‐‐基于setter方法的依赖注入
.属性必须声明了set方法. name是根据set方法的名字来的 比如方法名字是: setIdxx > name="idxx"‐‐>
<bean class="cn.tulingxueyuan.beans.User" id="user2">
	<property name="idtuling" value="1"></property>
	<property name="username" value="zhangsan"></property><property name="realname" value="张三"></property>
</bean>
基于构造函数的依赖注入
<!‐‐基于构造函数的依赖注入
.将会调用自定义构造函数来实例化对象,就不会调用默认的无参构造函数
. name是根据构造函数的参数名来的, 比如:User(String idxx) > name="idxx"
. name属性可以省略 但是要注意参数的位置
.如果非要把位置错开 可以使用 name或者 index或者 type
. index是下标 从0开始
. type在位置错开情况下只能在类型不一样的时候指定才有明显效果
‐‐>
<bean class="cn.tulingxueyuan.beans.User" id="user3">
	<constructor‐arg name="username" value="lisi"></constructor‐arg>
	<constructor‐arg name="id_xushu" value="1"></constructor‐arg>
	<constructor‐arg name="realname" value="李四"></constructor‐arg>
</bean>
使用p命名空间简化基于setter属性注入XML配置
使用c命名空间简化基于构造函数的XML
<!‐‐复杂数据类型‐‐>
<bean class="cn.tulingxueyuan.beans.Person" id="person" p:wife‐ ref="wife2">
	<property name="id" value="1"></property>
	<property name="realName" value=""></property>
		<!‐‐设置null值‐‐>
	<property name="name">
		<null></null>
	</property>
<!‐‐当依赖其他bean:内部bean inner bean
	<property name="wife">
		<bean class="cn.tulingxueyuan.beans.Wife" >
			<property name="age" value="18"></property>
			<property name="name" value="迪丽热巴"></property>
		</bean>
	</property>‐‐>
<!‐‐当依赖其他bean:引用外部bean
	<property name="wife" ref="wife"></property>‐‐>
	<property name="birthday" value="2020/05/20"></property>
	<property name="hobbies">
		<list>
			<value>唱歌</value>
			<value>跳舞</value>
			<!‐‐如果List的泛型是比如:List<Wife> <bean>‐‐>
		</list>
	</property>
	<property name="course" >
		<map>
			<entry key="1" value="JAVA"> </entry>
			<entry key="2" value="HTML"> </entry>
		</map>
</property>
 
</bean>
 
<!‐‐可以使用p命名空间来简化基于setter属性注入 它不支持集合‐‐>
<bean class="cn.tulingxueyuan.beans.Wife" id="wife" p:age="18" p:name="迪 丽热巴" ></bean>
 
<!‐‐可以使用c命名空间来简化基于构造函数属性注入 它不支持集合‐‐>
<bean class="cn.tulingxueyuan.beans.Wife" id="wife2" c:age="20" c:name="xxx"><!‐‐ <constructor‐arg name="age" value="18"></constructor‐arg>‐‐></bean>

1.3.2. 使用 属性

<!‐‐使用depends‐on可以设置先加载的Bean也就是控制bean的加载顺序‐‐>
<bean class="cn.tulingxueyuan.beans.Person" id="person" depends‐ on="wife"></bean>
<bean class="cn.tulingxueyuan.beans.Wife" id="wife"></bean>

1.3.3. 懒加载bean

<!‐‐使用lazy‐init设置懒加载
默认为false:在spring容器创建的时候加载(实例化)
	 true:在使用的时候(getBean)才会去加载(实例化)‐‐>
<bean class="cn.tulingxueyuan.beans.Person" id="person2" lazy‐ init="true">
	<property name="id" value="1"></property>
	<property name="realName" value="吴彦祖"></property>
	<property name="name" value="徐庶"></property>
</bean>

1.3.4. 自动注入

当一个对象中需要引用另外一个对象的时候,在之前的配置中我们都是通过
property标签来进行手动配置的,其实在spring中还提供了一个非常强大的功能
就是自动装配,
可以按照我们指定的规则进行配置,配置的方式有以下几种:

default/no:不自动装配

byName:按照名字进行装配,以属性名作为id去容器中查找组件,进行赋
值,如果找不到则装配null

byType:按照类型进行装配,以属性的类型作为查找依据去容器中找到这个
组件,如果有多个类型相同的bean对象,那么会报异常,如果找不到则装配null

constructor:按照构造器进行装配,先按照有参构造器参数的类型进行装
配,没有就直接装配null;如果按照类型找到了多个,那么就使用参数名作为
id继续匹配,找到就装配,找不到就装配null

通过将autowire-candidate 属性设置为false,避免对bean定义进行自动装
配,如下一节所述。

通过将其<bean/> 元素的primary属性设置为 true,将单个bean定义指定为主要
候选项。
<!‐‐**************************************基于xml自动注入 begin*********** ***************************************‐‐>
 
<!‐‐自动注入:
1. bytype根据类型自动注入(spring会根据bean里面的所有对象属性的类型,只要它匹配到bean里面某一个类型跟属性类型吻合就会自动注入

2. byname会根据属性setxxx的名字来自动匹配 (spring会根据bean里面的所有对象属性的set的名字,只要它匹配到bean里面某一个名字跟属性名字吻合就会自动注入

3. constructor优先根据名字来找, 如果名字没有匹配到根据类型来匹配, 如果类型匹
配到多个则不会自动注入

注意:
	bytype如果匹配到两个同样的类型会出现错误,所以一定要保证ioc容器里面只有一个对应类型的bean
	
	byname最能匹配到唯一的那个bean
	
	constructor保证构造函数不能包含多余的其他参数
	
	default:不会进行自动注入
 
<bean class="cn.tulingxueyuan.beans.Person" id="person6" autowire="const ructor" >
	<property name="id" value="1"></property>
	<property name="realName" value="吴彦祖"></property>
	<property name="name" value="徐庶"></property>
</bean>
 
<bean class="cn.tulingxueyuan.beans.Wife" id="wife" p:age="18" p:name="小鑫科技" ></bean>
<bean class="cn.tulingxueyuan.beans.Wife" id="QBL" p:age="60" p:name="小鑫科技1号" ></bean>
 **************************************基于xml自动注入 end*************** ***********************************‐‐>

1.4. Bean 的作用域

1.4.1. Singleton(单例)的作用域

1.4.2.Prototype(原型)的作用域

<!‐‐作用域scope
singleton默认:单例 只会在Ioc容器种创建一次
prototype多例(原型bean)每次获取都会new一次新的bean‐‐>
<bean class="cn.tulingxueyuan.beans.Person" id="person3" scope="prototype">
	<property name="id" value="1"></property>
	<property name="realName" value="吴彦祖"></property><property name="name" value="徐庶"></property> 
</bean>

1.5. 自定义bean的特性

1.5.1. 生命周期回调

1.5.2初始化方法回调销毁方法回调

1.5.3在非Web应用中优雅地关闭Spring IoC容器

/**
*生命周期回调
* 1.使用接口实现的方式来实现生命周期的回调:
* 	1.1初始化方法: 实现接口: InitializingBean重写afterPropertiesSet方法 初始化会自动调用的方法
* 	1.1销毁的方法: 实现接口: DisposableBean重写destroy方法 销毁的时候自动
调用方法
*什么时候销毁:在spring容器关闭的时候 close()
*或者 使用ConfigurableApplicationContext.registerShutdownHook方法优雅的关闭
*
* 2.使用指定具体方法的方式实现生命周期的回调:
*		在对应的bean里面创建对应的两个方法
* 			init‐method="init" destroy‐method="destroy"
*/

1.6 ApplicationContextAware 和 BeanNameAware

1.7. Bean 定义的继承

<!‐‐bean的继承 一个bean继承另一个bean  可以使用parent属性指定父类bean  如果想让父类bean不能被实例化 abstract="true" 
<bean class="cn.tulingxueyuan.beans.Person" id="person4" abstract="true"> 
	 <property name="id" value="1"></property> 
	 <property name="realName" value="吴彦祖"></property> 
	 <property name="name" value="徐庶"></property>  
 </bean>  
 <bean class="cn.tulingxueyuan.beans.Person" id="person5" parent="person4" > 
  	<property name="realName" value="刘德华"></property> 
 </bean>‐‐>

spring创建第三方bean对象 在Spring中,很多对象都是单实例的,在日常的开发中,我们经常需 要使用某些外部的单实例对象,例如数据库连接池,下面我们来讲解下如何在 spring中创建第三方bean实例。 1、导入数据库连接池的pom文件
1、导入数据库连接池的pom文件

<!‐‐ https://mvnrepository.com/artifact/com.alibaba/druid ‐‐> 
<dependency>  
	<groupId>com.alibaba</groupId>  		
	<artifactId>druid</artifactId>  
	<version>1.1.21</version>  
</dependency>  
<!‐‐ https://mvnrepository.com/artifact/mysql/mysql‐connector‐j
ava ‐‐>  
<dependency>  
	<groupId>mysql</groupId>  
	<artifactId>mysql‐connector‐java</artifactId>  
	<version>5.1.47</version> 
</dependency>

2、编写配置文件 ioc.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 htt p://www.springframework.org/schema/beans/spring‐beans.xsd">  	
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">  
		<property name="username" value="root"></property>  
		<property name="password" value="123456"></property>  
		<property name="url" value="jdbc:mysql://localhost:3306/demo"></pr operty>  
		<property name="driverClassName" value="com.mysql.jdbc.Driver"> </property>  
	</bean>  
</beans>

3、编写测试文件

public class MyTest { 
 public static void main(String[] args) throws SQLException { 
	  ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
	  DruidDataSource dataSource = context.getBean("dataSource", DruidDa taSource.class); 
	  System.out.println(dataSource); 
	  System.out.println(dataSource.getConnection()); 
     } 
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring手把手超详细讲解(基本配置,基于xml) 的相关文章

  • SpringBoot项目配置文件编写方式参考

    背景 为防止出现各环境配置文件不同步的情况 xff0c 现根据实际开发情况 xff0c 制定该配置文件编写参考 介绍 SpringBoot使用一个全局的配置文件 xff0c 配置文件名是固定的 xff1b application prope
  • xshell 连接 Linux kvm图形界面报错问题

    如下的报错 zyq 64 zyq sudo virt manager zyq 64 zyq virt manager 18561 Gtk WARNING cannot open display localhost 10 0 以上前提是需先安
  • 一文让你看懂Golang如何打造实时聊天系统

    项目截图 简介 在本次课程中 xff0c 我们来学习使用WebSocket来打造一个实时聊天系统 我们会从一下几个方面来进行学习 xff1a 什么是websocket xff1b Websocket与传统的HTTP协议有什么区别 xff1b
  • 【IBM MQ】使用IBM MQ远程连接时报错AMQ 4043解决思路

    我使用IBM MQ客户端远程连接队列管理器时 xff0c 报错 AMQ 4043 xff0c 百度基本找不到解决办法 xff0c 唯一一个解决方法是这个 xff08 https stackoom com question 1sroR xff
  • Arch Linux安装桌面及常用软件

    Arch Linux安装桌面及常用软件 安装桌面环境 显卡驱动 span class token comment 查看显卡情况 span lspci k span class token operator span span class t
  • Python 报错处理 paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    使用多进程启动多个ssh报错 xff1a Exception client Error reading SSH protocol banner Errno 104 Connection reset by peer During handli
  • 信息加密(简单的字母转换)

    题目 在传递信息的过程中 xff0c 为了加密 xff0c 有时需要按一定规则将文本转换成密文发送出去 有一种加密规则是这样的 xff1a 1 对于字母字符 xff0c 将其转换成其后的第3个字母 例如 xff1a A D xff0c a
  • js按钮绑定点击事件

    1 第一种 34 btn 34 click function 操作 2 第二种 document getElementById 39 foo 39 addEventListener 39 click 39 function 3 第三种 xf
  • 微信小程序与微信公众号同一用户登录问题

    微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口 整理相关资料以及个人认识的心得写了这篇文章与大家一起分享 首先 xff0c 简单说下我遇到的问题是我们的程序调用微信小程序得到openid 然后通过ope
  • 快速编译system.img和boot.img的方法【转】

    本文转载自 xff1a http www cnblogs com wanqieddy archive 2012 10 22 2734024 html 快速编译system img xff0c 可以使用这个命令 xff1a make syst
  • SSM----SpringMVC

    SpringMVC 1 什么是SpringMVC Spring MVC属于SpringFrameWork的后续产品 xff0c 已经融合在Spring Web Flow里面 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模
  • mvp契约类

    public class MainActivity extends AppCompatActivity implements IContract IView private IContract IPresenter presenter 64
  • Rxjava和Retrofit结合使用大量请求时候出现OOM的问题

    在使用RxJava 43 Retrofit的过程中 出现了OOM的问题 报错日志如下 java lang OutOfMemoryError pthread create 1040KB stack failed Try again at ja
  • vc++中进程间的通信

    进程通常被定义为一个正在运行的程序的实例 xff0c 它由两个部分组成 xff1a 一个是操作系统用来管理进程的内核对象 内核对象也是系统用来存放关于进程的统计信息的地方 另一个是地址空间 xff0c 它包含所有的可执行模块或DLL模块的代
  • 如何用YOLO+Tesseract实现定制OCR系统

    转载 AI开发者 xff1a https mp weixin qq com s Eq6POwgyME WJYK9NWpzDw 什么是 OCR xff1f OCR 指的是光学字符识别 它用于从扫描的文档或图片中读取文本 这项技术被用来将几乎任
  • cnn-过拟合(over-fitting)

    概念 为了得到一致假设而使假设变得过度严格称为过拟合 1 给定一个假设空间H xff0c 一个假设h属于H xff0c 如果存在其他的假设h 属于H 使得在训练样例上h的错误率比h 小 xff0c 但在整个实例分布上h 比h的错误率小 xf
  • cnn-欠拟合(underfitting)

    模型不能很好拟合数据 称之为欠拟合 直白的说 xff1a 模型没有找到数据规律或不完整 xff0c 泛化能力不强 在训练和测试数据集上 xff0c 预测或训练结果都和真实结果相差很远 一般解决方法 增加新特征 xff0c 可以考虑加入进特征
  • ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full comm

    类似这种问题 xff0c 不一定是pip版本不对 xff0c 有可能是某个文件不存在 xff0c 例如 在python3 5环境中安装scikit image pip install scikit image 61 61 0 12 就出现
  • AI最新资讯,持续更新

    三星 人造人 项目曝光 xff01 效果太逼真 xff0c 可自主生成新表情 动作和对话 https mp weixin qq com s 417fL3oYVE1vOwsVHMmqow Det3D 首个通用 3D 目标检测框架 https
  • 二维码生成以及扫一扫解析二维码原理

    二维码生成以及扫一扫解析二维码原理 1 生成URL xff0c 确定要通过二维码传达的信息 xff0c 也就是通过扫一扫可以获得地址和数据信息 1 得到随机数 xff0c 用随机数得到签名 xff0c 签名验证身份 String ranSt

随机推荐

  • idea 不能生成target

    1 改module https blog csdn net qq 15304369 article details 93715206 2 pom配置文件 修改为 xff1a lt packaging gt jar lt packaging
  • mariadb 遇到的坑

    mariadb13 3 25 配置文件失效 xff08 折腾了很久 xff09 xff0c 当时我需要配置主从 xff0c 发现binlog无法打开 xff0c 配置了bin log项还是不行 xff01 当my cnf 文件权限过大时 x
  • CV资料汇总

    1 图像风格迁移 Neural Style 简史 https www sohu com a 221597595 236505 2 一文让你理解什么是卷积神经网络 https www jianshu com p 1ea2949c0056
  • skinmagic 对话框菜单展示

    我偶用skinmagic xff0c 在换对话框皮肤时候 xff0c 发现菜单不见了 xff0c 几经折腾 xff0c 发现SetWindowSkin m hWnd 34 Dialog 34 在iniInstance xff08 xff09
  • 系统如何支持高并发

    给个例子 xff0c 你的系统部署的机器是4核8G xff0c 数据库服务器是16核32G 此时假设你的系统用户量总共就10万 xff0c 用户量很少 xff0c 日活用户按照不同系统的场景有区别 xff0c 我们取一个较为客观的比例 xf
  • Firewalld防火墙基础

    目录 一 Firewalld 概述 1 1 Firewalld的简述 1 2 Firewalld 和 iptables的区别 1 3 firewalld的区域 1 3 1 firewalld的9个区域 1 3 2 firewalld的数据处
  • CentOS7安装Oracle JDK

    CentOS7默认安装的是OpenJDK 如果安装Oracle JDK xff0c 需要按如下方式操作 xff1a 1 登录http www oracle com technetwork java javase downloads inde
  • 百度2014校招笔试题(一)

    算法和程序设计题 xff1a 1 题意 xff1a 一幢大楼的底层有1001根电线 xff0c 这些电线一直延伸到大楼楼顶 xff0c 你需要确定底层的1001个线头和楼顶的1001次线头的对应关系 你有一个电池 xff0c 一个灯泡 xf
  • Acwing 1175.最大联通子图(tarjan缩点求scc)

    Acwing 1175 最大连通子图 题意 一个有向图 G 61 V E G 61 V
  • 用github搭建个人(博客网站

    x1f308 博客主页 xff1a 卿云阁 x1f48c 欢迎关注 x1f389 点赞 x1f44d 收藏 留言 x1f4dd x1f31f 本文由卿云阁原创 xff01 x1f64f 作者水平很有限 xff0c 如果发现错误 xff0c
  • 多线程下HashMap的死循环

    多线程下HashMap的死循环 Java的HashMap是非线程安全的 多线程下应该用ConcurrentHashMap 多线程下 HashMap 的问题 xff08 这里主要说死循环问题 xff09 xff1a 1 多线程put操作后 x
  • 找出一个图中所有的强连通子图

    如果一个有向图中的没对顶点都可以从通过路径可达 xff0c 那么就称这个图是强连通的 一个 strongly connected component就是一个有向图中最大的强连通子图 下图中就有三个强连通子图 xff1a 应用kosaraju
  • win7启动分区不存在,使用分区工具修正

    DiskGenius 分区右键 激活当前分区
  • getElementById获取不到td标签

    一次测试中发现 然后使用getElementById获取不到此标签 xff0c 将td改成div即可 不知道是不是单独使用td标签的问题 code
  • 应用宝YSDK支付接入技术细节

    前言 应用宝是出了名的坑 xff0c 主要体现在 xff1a 文档杂乱繁多信息不全或描述模糊文档格式不规范技术支持很不及时 并且可以明显察觉到为了兼容QQ和微信 xff0c 应用宝的接入规范有诸多不合理的地方 来来回回折腾了一周 xff0c
  • 用Word2007批量设置图片位置

    转自 xff1a http www ccw com cn college htm2010 20100727 877695 shtml Word2007的 查找和替换 功能并不仅仅可以对文字进行批量的查找替换 xff0c 还有很多神奇的功能
  • java-生产者消费者问题以及解决办法

    文章目录 1 生产者消费者问题概述2 生产者消费者问题的解决办法2 1 解决思路2 2 实现方法2 3 代码实现2 3 1 wait 和nofity 方法2 3 2 await signal 方法2 3 3 BlockingQueue阻塞队
  • 【Remote Development】VSCode 基于 SSH 进行远程开发

    系统需求 我们在 VSCode 下载由微软官方推出的 Remote SSH 插件 查看一下里面的描述 xff0c 对于远程机器的要求如下 xff1a Local A supported OpenSSH compatible SSH clie
  • git idea创建新分支,获取/合并主支代码的2个方法

    其他sql格式也在更新中 xff0c 可直接查看这个系列 xff0c 要是没有你需要的格式 xff0c 可在评论或私信我 个人目录 获取主支代码的2个方法 1 xff0c 创建一个分支 xff0c 获取主支的所有代码 xff08 场景 xf
  • spring手把手超详细讲解(基本配置,基于xml)

    spring教程 1 1 容器概述1 1 1 配置元数据1 1 2 容器的实例化1 1 3 容器的使用 1 2 bean的概述1 2 1 命名bean1 2 2 实例化Bean 1 3 依赖1 3 1 依赖注入1 3 2 使用 属性1 3