spring 详解二 IOC(Bean xml配置及DI)

news/2024/5/10 5:01:28/文章来源:https://blog.csdn.net/m0_65775063/article/details/131617052

配置列表

Xml配置

功能描述

<bean id="" class=""></bean>

Bean的id,配置id会转为Bean名称和不配就是全限定类名

<bean name="" ></bean>

Bean的别名配置,存储在Factory的aliasMap中通过别名也可以获取Bean

<bean scope="" ></bean>

Bean的作用范围,默认singleton和prototype,加上mvc依赖又request和session

<bean lazy-init="" ></bean>

Bean的实例化机制,是否延迟加载,BeanFactory作为容器无效

<bean init-method="" ></bean>

Bean的实例化之后自动执行的初始化方法

<bean destroy-method="" ></bean>

Bean实例销毁前执行的方法,必须用close()方法,停止程序无效

<bean autowire="byType" ></bean>

设置自动注入模式,按类型byType按名称byName

<bean factory-bean="" factory-method="" ></bean>

指定哪个自定义bean工厂的哪个方法完成bean的创建

Singleton 容器创建的时候,就会进行bean的实例化并存储到单例池中,每次getBean都是从单例池中取到

ProtoType  容器创建的时候不会进行Bean实例创建,当调用getBean方法时,才会创建Bean,每次都会创建一个新的Bean实例

lazy-init="true" 延迟加载为true时,容器创建时不会创建Bean,在getBean时创建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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userService"  name="aaa,bbb" init-method="init" destroy-method="destroy" class="com.tech.test.service.impl.UserServiceImpl"></bean><!--        <alias name="userService" alias="aaa"></alias>--></beans>

UserServiceImpl 

package com.tech.test.service.impl;import com.tech.test.service.UserService;
import org.springframework.beans.factory.InitializingBean;public class UserServiceImpl implements UserService, InitializingBean {public UserServiceImpl() {System.out.println("Bean实例化");}@Overridepublic void getUser() {System.out.println("get User Success");}/*** Bean初始化方法*/public void init(){System.out.println("初始化方法");}/*** Bean销毁前方法*/public void destroy(){System.out.println("销毁前方法");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("initBean...");}
}

可以看到在Bean实例加载之后,我们自定义的初始化方法开始执行

同时我们的配置类可以实现InitializingBean接口来添加Bean的初始化方法,实现afterPropertiesSet方法,此方法执行时机早于自定义方法,见名知义,此方法在属性注入之后执行,在生命周期中介绍

 别名配置

可以看到,我们配置的别名存在aliasMap中,指向Bean的名称,在Bean标签上的name属性配置和单独alias 标签效果是一样的,只不过配置的地方不一样

工厂方法实例化Bean 

实例化Bean的方式

1、无参构造实例化Bean

2、有参构造实例化Bean

3、静态工厂方法实例化Bean

4、实例工厂实例化Bean

5、实现FactoryBean规范接口实例化Bean

静态工厂实例化Bean 

package com.tech.test.factory;
import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;public class MyStaticFactory {public static UserService getUserServiceBean(){return new UserServiceImpl();}
}
 <bean id="userService"  class="com.tech.test.factory.MyStaticFactory" factory-method="getUserServiceBean"></bean>

 直接配置工厂方法实例化bean即可 factory-method="getUserServiceBean"

 实例工厂实例化Bean

package com.tech.test.factory;import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;public class MyBeanFactory {public  UserService getUserBean(){return new UserServiceImpl();}
}
     <!--  配置实例工厂对象  --><bean id="factory"  class="com.tech.test.factory.MyBeanFactory"></bean><!--  配置实例工厂对象生成Bean对象  --><bean id="userService2"  factory-bean="factory" factory-method="getUserBean"></bean>

实例工厂配置bean,首先需要配置工厂Bean,因为不是静态的,不能够类名调用,必须需要对象,其他配置都一样

 实现FactoryBean规范接口实例化Bean

package com.tech.test.factory;import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;
import org.springframework.beans.factory.FactoryBean;public class MyBeanFactory1 implements FactoryBean<UserService> {@Overridepublic UserService getObject() throws Exception {return new UserServiceImpl();}@Overridepublic Class<?> getObjectType() {return UserService.class;}
}
    <!--实现工厂规范生成Bean对象,正常配置即可,该规范sping会自动调用生成工厂对象--><bean id="userService3"  class="com.tech.test.factory.MyBeanFactory1"></bean>

正常配置即可,该规范sping会自动调用生成工厂对象

DI依赖注入配置

注入方式

注入方式

配置方式

通过Bean的set方法注入

<property name = "user" ref="userService" />

<property name = "ceshi" value="test" />

通过Bean的构造方法注入

<constructor-arg  name="user" ref="userService"/>

<constructor-arg  name="ceshi" value="test"/>

Bean的属性或者依赖的注入方式只有两种,通过set方法为Bean设置属性,通过构造方法为Bean设置属性 

注入规则

普通数据类型 String int 等 用 value指定

<property name="url" value="jdbc:mysql://localhost:3306/test"></property>

引用数据类型 对象等 用ref指定

<bean id="userService" class="com.tech.test.factory.MyBeanFactory1"></bean>

<property name="userService" ref="userService">

集合数据类型 List Map Properties等如下示例所示:

示例 

 <bean id="di"  class="com.tech.test.testbean.DI"><property name="testString"><list><value>string1</value><value>string2</value></list></property><property name="userServices"><ref bean="userService"></ref></property><property name="map"><map><entry key="d1" value-ref="userService"></entry></map></property><property name="properties"><props><prop key="p1">123</prop></props></property>
</bean>

自动注入

除了这种注入方式,可以配置自动注入,但也是通过set和构造方法两种形式

bytype,根据类型注入,容器创建bean之后注入属性自动寻找匹配类型的bean,需要注意scope需要单例,否则报错

byName,会找寻bean实例的set方法,例如testString,会找这个setTestString注入

<bean id="di"  class="com.tech.test.testbean.DI" autowire="byName"><property name="testString"><list><value>string1</value><value>string2</value></list></property></bean>

Spring默认命名空间标签 

标签

作用

<beans>

xml的配置的根标签,其他标签都是该标签的子标签

<bean>

beans下创建bean的标签,配置bean

<import>

外部资源导入标签

<alias>

指定Bean别名标签 跟<bean>上的name一样 别名存在aliasMap中

<import>

可以引入分模块配置的其他配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="di.xml"></import></beans>

按模块导入,类似下面配置即可 

 多套<beans>环境配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="di.xml"></import><beans profile="test"><bean id="userServiceTestenv"  name="aaa,bbb" init-method="init" destroy-method="destroy" class="com.tech.test.service.impl.UserServiceImpl"></bean><alias name="userServiceTestenv" alias="aaa"></alias></beans></beans>

此时test之外的是默认环境,如果选择test环境也会包含默认环境的配置

切换环境如下:

  • 命令行参数 -Dspring.profiles.active = test
  • 使用代码的方式设置环境变量 System.setProperty(“spring.profiles.active”,”test”)

spring中的getBean方法

getBean(String name)

通过名称寻找bean实例,需要强转

getBean(Class Type)

通过类型寻找Bean,不需要强转,但Bean必须是单例唯一,否则报错

getBean(String name,Class Type)

根据名称获取Bean,返回值为Class类型的实例,无需强转

配置非自定义bean

在实际开发中,有些功能类并不是我们自己定义的,而是在第三方jar包之上,想要让容器管理需要考虑以下两个问题

Bean的实例化方式是什么 ?无参构造、有参构造,静态工厂还是实例工厂

被配置的Bean是否需要注入必要属性?

配置数据源 

引入依赖

 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version>
</dependency>

配置第三方jar交给spring管理

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean>

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

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

相关文章

Qt自定义控件之动画文本

文章目录 前言一、动画文本的效果二、具体实现定义动画对象设置动画时长的实现设置text函数实现绘制代码设置字体函数 三、高级部分操作代码总结 前言 在 Qt 中&#xff0c;自定义控件可以让我们实现丰富的用户界面效果和交互体验。其中&#xff0c;动画文本是一种常见的效果&…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…

Redis知识补充(1)

1)Redis本身就是在内存中进行存储数据的&#xff0c;那么为什么不直接定义一个变量来针对数据直接进行存储呢&#xff1f;因为Redis主要是应用于分布式系统&#xff0c;才能发挥它的最大威力&#xff0c;如果只是一个单机程序&#xff0c;通过变量存储数据的方式&#xff0c;是…

Kotlin~Composite组合模式

概念 能够帮助实现树状结构的模式。 主要特点 递归组合树状结构统一处理所有对象 角色介绍 Component: 组合接口Leaf: 叶子节点&#xff0c;无子节点Composite&#xff1a;枝节点&#xff0c;用来存储子部件 UML 代码实现 interface Organ {fun personCount():Int } cla…

[VUE学习】从头搭建权限管理系统前端-初始化

1.安装Node 2.安装Vue Cli vue的一个脚手架 npm install -g vue/cli 3.vue ui搭建vue项目 cmd 运行 vue ui 然后创建新项目 选择npm 选择配置 Babel 是编译的 Router 是路由 vuex 是状态保存的 Linter/fomatter 代码检测和格式化 创建完成 这个时候 代码在我们本地…

解决IDEA/WebStorm的Ctrl+Shift+F冲突失效

IDEA 的 CtrlShiftF 是全文或全项目搜索搜索快捷键&#xff0c;非常好用。 当这个快捷键偶而会失效时&#xff0c;基本可以确定是快捷键冲突了。 检查所有运行的软件的快捷键&#xff0c;若有设置为CtrlShiftF的则改掉。特别是输入法会占用较多的快捷键。 例如我这里的搜过输…

Skywalking高级使用

Skywalking高级使用 RPC调用监控Mysql调用监控Skywalking常用插件获取追踪ID过滤指定的端点告警功能Skywalking原理Open Tracing介绍 RPC调用监控 Skywalking(6.5.0)支持的RPC框架有以下几种&#xff1a; (1) Dubbo 2.5.4 -> 2.6.0 (2) Dubbox 2.8.4 (3) Apache Dubbo 2.7.…

Git gui教程---第四篇 Git gui的使用 添加文件,并提交

添加文件&#xff0c;并提交 新建一个txt文件点击扫描重新扫描&#xff0c;未缓存改动多了我们刚刚新建的文件。 点击缓存改动&#xff0c;文件位置变换。 如果缓存选错&#xff0c;想撤销&#xff0c;在菜单栏选择“提交”&#xff0c;“从本次提交撤销”&#xff0c;文件变更…

实例解释在lingo中使用集合模型

某部门有三个生产同一产品的工厂&#xff08;产地&#xff09;&#xff0c;生产的产品运往四个销售点&#xff08;销地&#xff09;出售&#xff0c;各个工厂的生产量、各销地的销量&#xff08;单位&#xff1a;吨&#xff09;、从各个工厂到各个销售点的单位运价&#xff08;…

动态规划之62 不同路径(第4道)

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

debian to go

可以使用虚拟机操作&#xff0c;在运行镜像到安装步骤时选择 u盘 不需要手动分 /boot 分区之类的&#xff0c;“Automaction”自动分区就行&#xff0c;全安装到根目录。boot load 安装到 /dev/sdb&#xff0c;也就是硬盘本身 推荐使用gpt分区表&#xff0c;建议拿不用的盘练…

js实现图片压缩

创建一个type"file"的input标签&#xff0c;用于文件上传。 <input type"file" name"" id"upload" value"" />通过js实现图片压缩 window.onload function () {const upload document.getElementById("upload…

范德波尔方程可视化

Van der Pol方程如下所示 d x d t y d y d t − x ( 1 − x 2 ) y \begin{equation} \begin{aligned} \frac{dx}{dt} & y \\ \frac{dy}{dt} & -x(1-x^2)y \end{aligned} \end{equation} dtdx​dtdy​​y−x(1−x2)y​​​ 相应的程序如下 为了观看长期趋势&…

【LeetCode每日一题合集】2023.7.3-2023.7.9

文章目录 2023.7.3——445. 两数相加 II&#xff08;大数相加/高精度加法&#xff09;2023.7.4——2679. 矩阵中的和2023.7.5——2600. K 件物品的最大和&#xff08;贪心&#xff09;代码1——贪心模拟代码2——Java一行 2023.7.6——2178. 拆分成最多数目的正偶数之和&#x…

STM32的ADC模式及其应用例程介绍

STM32的ADC模式及其应用例程介绍 &#x1f4cd;ST官方相关应用笔记介绍资料&#xff1a;https://www.stmcu.com.cn/Designresource/detail/application_note/705947&#x1f4cc;相关例程资源包&#xff1a;STSW-STM32028&#xff1a;https://www.st.com/zh/embedded-software/…

MySQL数据库对象与数据备份和还原详解

目录 一、视图 1. 什么是视图 2. 视图与数据表的区别 3. 视图的优点 4. 创建视图 二、索引 1. 什么是索引 2. 为什么要使用索引 3. 索引优缺点 4. 何时不使用索引 5. 索引何时失效 6. 索引分类 6.1 普通索引 6.2 唯一索引 6.3 主键索引 6.4 组合索引 三、数据的…

Integration Objects OPC 所有产品Crack

OPC产品 OPC UA 升级到 OPC UA 以提高互操作性和安全性。 OPC 隧道 无需 DCOM 即可实现安全可靠的连接。 OPC 数据归档 将 OPC 数据存储到标准数据库或 CSV 文件中。 OPC 服务器 将任何通信协议转换为OPC标准。 OPC 客户端 读取、写入和传输您的 OPC 数据。 OPC 服务器工具…

axios的学习

axios是基于promise对ajax的一种封装 //将省份信息打印到网页上 <p class"my-p"></p> <script src"https://unpkg.com/axios/dist/axios.min.js"></script> <script>axios({url:http://hmajax.itheima.net/api/province}).…

图形学 | 期末复习(上)| games101笔记 | 补档

博客基于GAMES101-现代计算机图形学入门-闫令琪&#xff0c;但不是其完整笔记&#xff0c;基于复习要求有一定的删减。考试以图形学入门基本概念和核心研究内容为主&#xff0c;少量公式。即以论述概念为主&#xff0c;涉及少量算法。p1:29:12是对应的games101视频节点&#xf…