基于XML配置bean(二)

文章目录

    • 1.工厂中获取bean
        • 1.静态工厂
          • 1.MyStaticFactory.java
          • 2.beans.xml
          • 3.测试
        • 2.实例工厂
          • 1.MyInstanceFactory.java
          • 2.beans.xml
          • 3.测试
        • 3.FactoryBean(重点)
          • 1.MyFactoryBean.java
          • 2.beans.xml
          • 3.测试
    • 2.bean配置信息重用
        • 继承抽象bean
          • 1.beans.xml
          • 2.测试
    • 3.bean细节介绍
        • 1.bean的创建顺序
          • 1.depends-on关键字
          • 2.问题引出
        • 2.bean对象的单例和多例
          • 1.应用实例
          • 2.使用细节
          • 3.单例与多例对比
            • 单例(非懒加载)
            • 单例(懒加载)
            • 多例
        • 3.bean的生命周期
          • 1.基本介绍
          • 2.简化来说
          • 3.生命周期演示案例
            • 1.House.java
            • 2.beans.xml
            • 3.测试
          • 4.配置bean后置处理器(难点)
            • 1.MyBeanPostProcessor.java
            • 2.beans02.xml
            • 3.测试
          • 5.通过属性文件配置bean
            • 1.src下创建my.properties
            • 2.beans03.xml
            • 3.测试
          • 6.自动装配bean
            • 1.OrderDao.java
            • 2.OrderService.java
            • 3.OrderServlet.java
            • 4.通过类型自动装配
            • 5.通过名字自动装配
            • 6.测试
          • 7.Spring El表达式(了解)

1.工厂中获取bean

1.静态工厂
1.MyStaticFactory.java
package com.sxs.spring.bean;import java.util.HashMap;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class MyStaticFactory {//hashmap存储对象private static Map<String, Monster> monsterHashMap;//静态代码块进行初始化static {monsterHashMap = new HashMap<>();//放进去两个对象monsterHashMap.put("monster01", new Monster(1, "牛魔王", "芭蕉扇"));monsterHashMap.put("monster01", new Monster(2, "牛魔王", "芭蕉扇"));}//提供get方法获取bean对象public static Monster getMonster(String key) {return monsterHashMap.get(key);}
}
2.beans.xml
    <!--静态工厂获取bean--><!--不需要创建MyStaticFactory的对象,通过类加载就可以初始化工厂--><bean class="com.sxs.spring.bean.MyStaticFactory" id="staticFactory" factory-method="getMonster"><constructor-arg value="monster01"/></bean>
3.测试
    //静态工厂获取bean对象@Testpublic void staticFactory() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Monster bean = ioc.getBean("staticFactory", Monster.class);System.out.println(bean);}

image-20240218103817182

2.实例工厂
1.MyInstanceFactory.java
package com.sxs.spring.bean;import java.util.HashMap;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class MyInstanceFactory {//map存储monster对象private Map<String, Monster> monsterMap;//普通代码块进行初始化{monsterMap = new HashMap<>();//放进去两个对象monsterMap.put("monster01", new Monster(1, "牛魔王", "芭蕉扇"));monsterMap.put("monster01", new Monster(2, "牛魔王", "芭蕉扇"));}//提供get方法获取对象public Monster getMonster(String key) {return monsterMap.get(key);}
}
2.beans.xml
    <!--实例工厂获取bean--><!--创建bean对象,初始化两个实例工厂--><bean class="com.sxs.spring.bean.MyInstanceFactory" id="instanceFactory1"/><bean class="com.sxs.spring.bean.MyInstanceFactory" id="instanceFactory2"/><!--从第一个bean工厂中获取bean对象--><bean class="com.sxs.spring.bean.MyInstanceFactory" factory-bean="instanceFactory1" id="instanceFactory_1" factory-method="getMonster"><constructor-arg value="monster01"/></bean><!--从第二个bean工厂中获取bean对象--><bean class="com.sxs.spring.bean.MyInstanceFactory" factory-bean="instanceFactory2" id="instanceFactory_2" factory-method="getMonster"><constructor-arg value="monster01"/></bean>
3.测试
    //通过实例工厂获取bean对象@Testpublic void instanceFactory() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");//从第一个实例工厂中获取bean对象Monster monster1 = ioc.getBean("instanceFactory_1", Monster.class);//从第二个实例工厂中获取bean对象Monster monster2 = ioc.getBean("instanceFactory_2", Monster.class);System.out.println(monster1 == monster2);}

image-20240218111113422

3.FactoryBean(重点)
1.MyFactoryBean.java
package com.sxs.spring.bean;import org.springframework.beans.factory.FactoryBean;import java.util.HashMap;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class MyFactoryBean implements FactoryBean<Monster> {//bean工厂中的key,要取的key是什么就设置成什么private String key;//bean工厂private Map<String, Monster> monsterMap;//初始化bean工厂{monsterMap = new HashMap<>();//放进去两个对象monsterMap.put("monster01", new Monster(1, "牛魔王", "芭蕉扇"));monsterMap.put("monster02", new Monster(2, "牛魔王", "芭蕉扇"));}//设置key的方法(用于属性注入)public void setKey(String key) {this.key = key;}//根据key返回要得到的bean对象@Overridepublic Monster getObject() throws Exception {return this.monsterMap.get(key);}//返回bean对象的类型@Overridepublic Class<?> getObjectType() {return Monster.class;}//返回是否是单例的@Overridepublic boolean isSingleton() {return true;}
}
2.beans.xml
    <!--通过FactoryBean来获取bean--><bean class="com.sxs.spring.bean.MyFactoryBean" id="myFactoryBean"><!--直接对要获取的key进行属性注入即可--><property name="key" value="monster01"/></bean>
3.测试
    //通过factorybean获取bean对象@Testpublic void factoryBean() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Monster myFactoryBean = ioc.getBean("myFactoryBean", Monster.class);System.out.println(myFactoryBean);}

image-20240218140602472

2.bean配置信息重用

继承抽象bean
1.beans.xml
    <!--抽象bean对象,不能够被实例化只能够被继承,--><bean class="com.sxs.spring.bean.Monster" id="Abstractmonster" abstract="true"><property name="monsterId" value="200"/><property name="name" value="孙悟空"/><property name="skill" value="金箍棒"/></bean><!--继承抽象bean对象(也可以继承抽象的bean对象),则属性与其一样--><bean class="com.sxs.spring.bean.Monster" id="monster3" parent="Abstractmonster"/>
2.测试
    //bean配置信息重用@Testpublic void configureInformationReuse() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Monster monster03 = ioc.getBean("monster3", Monster.class);System.out.println(monster03);}

image-20240218142301845

3.bean细节介绍

1.bean的创建顺序
1.depends-on关键字
    <!--默认情况下是car5先创建,但是如果有depends-on绑定了car6,则在获取容器的时候是car6先创建--><bean class="com.sxs.spring.bean.Car" id="car5" depends-on="car6"/><bean class="com.sxs.spring.bean.Car" id="car6"/>
2.问题引出

image-20240218143948657

2.bean对象的单例和多例
1.应用实例
    <!--单例模式,默认的,每次都读取配置文件反射创建对象,然后将其放到容器中的字段里--><bean class="com.sxs.spring.bean.Monster" id="monster4" scope="singleton"/><!--多例模式,每次getBean的时候才会创建新对象--><bean class="com.sxs.spring.bean.Monster" id="monster5" scope="prototype"/>
2.使用细节

image-20240218145932813

3.单例与多例对比
单例(非懒加载)
  1. 获取ioc容器
    1. 读取配置文件
    2. 反射创建bean对象
    3. 放到ioc容器的字段中
  2. getBean直接从字段中获取
单例(懒加载)
  1. 获取ioc容器
    1. 读取配置文件
  2. getBean的时候创建bean对象
  3. 将bean对象放到ioc容器的字段中
  4. 下次getBean还是从该字段中获取
多例
  1. 获取ioc容器
    1. 读取配置文件
  2. getBean的时候创建bean对象
  3. 下次getBean再穿件bean对象
3.bean的生命周期
1.基本介绍

image-20240218150756890

2.简化来说
  1. 反射创建bean对象
  2. 依赖注入
  3. 初始化bean
  4. getBean
  5. 销毁bean(容器关闭才会调用)
3.生命周期演示案例
1.House.java
package com.sxs.spring.bean;/*** @author 孙显圣* @version 1.0*/
public class House {private String name;public String getName() {return name;}public void setName(String name) {System.out.println("setName方法被调用!");this.name = name;}//自定义的初始化方法,名字可以任意public void init() {System.out.println("bean初始化");}//自定义的销毁方法密码,名字可以任意public void destory() {System.out.println("bean对象被销毁");}
}
2.beans.xml
    <!--bean生命周期案例--><bean class="com.sxs.spring.bean.House" id="house" init-method="init" destroy-method="destory"><property name="name" value="北京豪宅"/></bean>
3.测试
    //生命周期案例演示@Testpublic void lifeCycle() {//1.反射创建bean对象,2.依赖注入ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");//3.初始化bean//4.getBeanHouse house = ioc.getBean("house", House.class);//5.销毁bean((ConfigurableApplicationContext)ioc).close();}

image-20240218154121983

4.配置bean后置处理器(难点)

image-20240219090132082

1.MyBeanPostProcessor.java
package com.sxs.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;/*** @author 孙显圣* @version 1.0*/
//bean的后置处理器对象
public class MyBeanPostProcessor implements BeanPostProcessor {/*** 在bean的init方法前被调用* @param bean 传入的在ioc容器中创建的bean* @param beanName 传入的在ioc容器中配置的bean的id* @return* @throws BeansException*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {//判断是否bean对象是house,如果是,将名字改为豪宅if (bean instanceof House) {((House) bean).setName("豪宅");}System.out.println("postProcessBeforeInitialization被调用 " + bean + "beanName=" + beanName);return bean;}/*** 在bean的init方法后被调用* @param bean* @param beanName* @return* @throws BeansException*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization被调用 " + bean + "beanName=" + beanName);return bean;}
}
2.beans02.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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置bean的后置处理器,会作用于所有的bean--><bean class="com.sxs.spring.bean.MyBeanPostProcessor" id="beanPostProcessor"/><bean class="com.sxs.spring.bean.House" id="house" init-method="init" destroy-method="destory"><property name="name" value="北京豪宅"/></bean><bean class="com.sxs.spring.bean.House" id="house02" init-method="init" destroy-method="destory"><property name="name" value="香港豪宅"/></bean>
</beans>
3.测试
    //后置处理器演示@Testpublic void MyBeanPostProcessor() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");House house = ioc.getBean("house", House.class);//关闭bean((ConfigurableApplicationContext)ioc).close();}

image-20240219090412968

5.通过属性文件配置bean
1.src下创建my.properties

如果是中文则自己将中文转换成unicode编码

name=jack
skill=\u5403\u996d
monsterId=111
2.beans03.xml
    <!--设置配置文件的位置--><context:property-placeholder location="classpath:my.properties"/><!--使用${name}来读取配置文件中的信息--><bean class="com.sxs.spring.bean.Monster" id="monster"><property name="name" value="${name}"/><property name="skill" value="${skill}"/><property name="monsterId" value="${monsterId}"/></bean>
3.测试
    //测试使用配置文件配置bean@Testpublic void profiles() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans03.xml");Monster monster = ioc.getBean("monster", Monster.class);System.out.println(monster);}

image-20240219093101698

6.自动装配bean
1.OrderDao.java
package com.sxs.spring.dao;/*** @author 孙显圣* @version 1.0*/
public class OrderDao {public void saveOrder() {System.out.println("保存订单");}
}
2.OrderService.java
package com.sxs.spring.service;import com.sxs.spring.dao.OrderDao;/*** @author 孙显圣* @version 1.0*/
public class OrderService {OrderDao orderDao;public OrderDao getOrderDao() {return orderDao;}public void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}
}
3.OrderServlet.java
package com.sxs.spring.web;import com.sxs.spring.service.OrderService;/*** @author 孙显圣* @version 1.0*/
public class OrderServlet {OrderService orderService;public OrderService getOrderService() {return orderService;}public void setOrderService(OrderService orderService) {this.orderService = orderService;}
}
4.通过类型自动装配
    <!--根据类型自动装配,会查找容器中是否有类型与属性一致的bean对象,如果有则自动注入--><!--使用类型类自动装配的话,需要保证容器中只有一个同类型的bean对象--><bean class="com.sxs.spring.dao.OrderDao" id="orderDao"/><bean autowire="byType" class="com.sxs.spring.service.OrderService" id="orderService"/><bean autowire="byType" class="com.sxs.spring.web.OrderServlet" id="orderServlet"/>
5.通过名字自动装配
    <!--根据名字自动装配,会查找容器中是否有与属性名字相同的id--><bean class="com.sxs.spring.dao.OrderDao" id="orderDao"/><bean autowire="byName" class="com.sxs.spring.service.OrderService" id="orderService"/><bean autowire="byName" class="com.sxs.spring.web.OrderServlet" id="orderServlet"/>
6.测试
    //测试使用autowire自动装配@Testpublic void setBeanByAutowire() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans03.xml");OrderServlet bean = ioc.getBean(OrderServlet.class);//验证是否装配成功System.out.println(bean.getOrderService());System.out.println(bean.getOrderService().getOrderDao());}

image-20240219100908234

7.Spring El表达式(了解)

image-20240219101043961

image-20240219101619907

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

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

相关文章

HarmonyOS实战开发-如何实现一个简单的健康生活应用

功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、73天、99天时&#xff0c;可以获得…

SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解&#xff1a; 1.1 当数据库、表名和字段名和实体类完全一致时无需加注解&#xff0c;不一致时&#xff1a; TableName指定库名 TableId指定表名 TableField指定字段名 1.2 自增主键&#xff1a; TableId(typeIdType.AUTO) private Long id; 1.3 实体类中属…

2000-2022年各省人力资本水平数据(含原始数据+计算过程+计算结果)(无缺失)

2000-2022年各省人力资本水平数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;普通高等学校在校学生数(万人)、年末常住人口&#xff08;万人&#xff09;、人力资本水平 4、范…

CTFshow-PWN-前置基础(pwn20)

提交ctfshow{【.got表与.got.plt是否可写(可写为1&#xff0c;不可写为0)】,【.got的地址】,【.got.plt的地址】 前置基础知识&#xff1a; .got 和 .got.plt 是 ELF&#xff08;Executable and Linkable Format&#xff0c;可执行和可链接格式&#xff09;二进制文件中的两个…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类&#xff08;放入线程中&#xff09; ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

RHCE作业二

一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所有人使用 二.设定cli…

Http 请求偶发400错误

1. 背景 生产环境偶发400请求错误&#xff0c;发生概率万分之一&#xff0c;异常信息如下&#xff1a; 1&#xff09; 从异常信息可以看到&#xff0c;skywalking的sw8 header解析失效导致异常信息。 2&#xff09; 0x0d0x0a 作为回车换行符号&#xff0c;没有被正确处理&#…

OpenGL:图元

OpenGL的图元 点 GL_POINTS: 将顶点绘制成单个的点 线 GL_LINES:将顶点用于创建线段,2个点成为一条单独的线段。如果顶点个数是奇数,则忽略最后一个。 顶点:v0, v1, v2, v3, … , vn,线段:v0-v1, v2-v3, v4-v5, … , vn-1 - vn GL_LINE_STRIP:将顶点用于创建线段,…

学习笔记(4月18日)vector底层模拟实现(1)

1.迭代器 vector实际上是由迭代器进行维护的&#xff0c;关于迭代器是什么&#xff0c;为什么要叫这个名字&#xff0c;后面的学习会逐渐了解&#xff0c;现在先将迭代器是作为指针即可。 vector底层有三个迭代器&#xff0c;用来起到容量、数组头、元素个数的作用。 同时为…

基于XML配置bean(一)

文章目录 1.获取bean的两种方式1.通过id获取bean&#xff08;前面用过&#xff09;2.通过类型获取bean&#xff08;单例时使用&#xff09;1.案例2.代码1.beans.xml2.SpringBeanTest.java3.结果 3.注意事项 2.三种基本依赖注入方式1.通过属性配置bean&#xff08;前面用过&…

DDoS攻击趋势分析及防御建议:网络安全新挑战与应对策略

在数字化日益普及的今天&#xff0c;网络安全问题日益凸显。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其巨大的破坏力和难以防范的特性&#xff0c;发起简单、效果显著、难以追踪等特点&#xff0c;因此被黑客广泛使用&#xff0c;已经成为网络安全领…

Python(九十四)变量的作用域

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CSS 设置空格原样显示 white-space:pre-wrap;

CSS 设置空格原样显示 问题描述 html 渲染内容时&#xff0c;对于 空格、回车、Tab 键的 默认处理方式是 &#xff1a; 无论存在多少个连续的空格&#xff0c;都只会保留一个。 结论 由于以上的特性&#xff0c;导致了我们无法直接渲染出原格式的文本。pre 标签 了解一下 &…

element-plus中的图标和文字水平对齐

<span><el-icon size"14px"><Delete /></el-icon> <span>删除</span> </span>解决方法&#xff1a;加上vertical-align: middle样式就可以了 <span><el-icon size"14px" style"vertical-align: …

【STM32CubeIDE 1.15.0】汉化包带路径配置过程

一、IDE软件下载 二、汉化版包路径 三、IDE软件板载汉化包 一、IDE软件下载 ST官网IDE下载链接 二、汉化版包路径 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 找不到就到.cn后面一级一级进 三、IDE软件板载汉化包 https://mirrors.ustc.edu…

数据库工具解析之 OceanBase 数据库导出工具

背景 大多数的数据库都配备了自己研发的导入导出工具&#xff0c;对于不同的使用者来说&#xff0c;这些工具能够发挥不一样的作用。例如&#xff1a;DBA可以使用导数工具进行逻辑备份恢复&#xff0c;开发者可以使用导数工具完成系统间的数据交换。这篇文章主要是为OceanBase…

​波士顿动力发布全新人形机器人:Atlas

4月16日&#xff0c;波士顿动力&#xff08;Boston Dynamics&#xff09;发布了《再见&#xff0c;液压Atlas》视频&#xff0c;正式宣告其研发的液压驱动双足人形机器人Atlas退役。 在视频的结尾&#xff0c;Atlas深深鞠躬&#xff0c;之后还有一句话“直到我们再次相遇&…

B1098 岩洞施工

solution #include<iostream> using namespace std; int main(){int n, x, top 1000, down 0;//管道水平放入>顶部最低点和底部最高点之间的距离就是能够承担的最大宽度scanf("%d", &n);for(int i 0; i < n; i){scanf("%d", &x);i…

3D模型处理的多进程并行【Python】

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生…

AI论文速读 | 2024[VLDB]TFB:全面与公正的时间序列预测方法基准测试研究

论文标题&#xff1a;TFB: Towards Comprehensive and Fair Benchmarking of Time Series Forecasting Methods 作者&#xff1a;Xiangfei Qiu ; Jilin Hu&#xff08;胡吉林&#xff09; ; Lekui Zhou ; Xingjian Wu ; Junyang Du ; Buang Zhang ; Chenjuan Guo&#xff08;郭…