Spring Bean - xml 配置文件创建对象

news2024/11/27 3:41:26

类型:

1、值类型

2、null (标签)

3、特殊符号 (<   -> &lt; )

4、CDATA 

<?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 id="school" class="com.gyk.ObjInject.School">
        <property name="location" value="henan"></property>
        <property name="num" value="30000"></property>
    </bean>
    <bean id="school2" class="com.gyk.ObjInject.School">
        <property name="location" value="henan"></property>
        <property name="num" value="30000"></property>
    </bean>
    <!--    <bean id="student" class="com.gyk.ObjInject.Student">-->
    <!--        <property name="name" value="zs"></property>-->
    <!--        <property name="age" value="22"></property>-->
    <!--        <property name="school" ref="school"></property>-->
    <!--    </bean>-->

    <!--   嵌套内部bean-->
    <bean id="student" class="com.gyk.ObjInject.Student">
        <property name="name" value="zs"></property>
        <property name="age" value="22"></property>
        <!--  对象属性-->
        <property name="school">
            <bean class="com.gyk.ObjInject.School">
                <property name="location" value="henan"></property>
                <property name="num" value="30000"></property>
            </bean>
        </property>
        <!-- 设置数组属性-->
        <property name="hobbies">
            <array>
                <value>play</value>
                <value>sing</value>
                <value>ball</value>
            </array>
        </property>
        <!-- 设置 list 属性-->
        <property name="schoolList">
            <list>
                <ref bean="school"></ref>
                <ref bean="school2"></ref>
            </list>
        </property>
        <!--        设置map 属性-->
        <property name="stringSchoolMap">
            <list>
                <map>
                    <entry>
                        <key>
                            <value>map1</value>
                        </key>
                        <ref bean="school"></ref>
                    </entry>
                </map>
                <map>
                    <entry>
                        <key>
                            <value>map2</value>
                        </key>
                        <ref bean="school2"></ref>
                    </entry>
                </map>
            </list>
        </property>
    </bean>


</beans>
package com.gyk.ObjInject;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * ClassName: Student
 * Package: com.gyk.depInject
 * Description:
 *
 * @Author Samuel
 * @Create 2024/7/24 09:20
 * @Version 1.0
 */
public class Student {
    private String name;
    private int age;
    private School school;

    private String[] hobbies;

    private List<School> schoolList;


    private List<Map<String, School>> stringSchoolMap;

    public void setStringSchoolMap(List<Map<String, School>> stringSchoolMap) {
        this.stringSchoolMap = stringSchoolMap;
    }

    public void setSchoolList(List<School> schoolList) {
        this.schoolList = schoolList;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setHobbies(String[] hobbies) {
        this.hobbies = hobbies;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                ", hobbies=" + Arrays.toString(hobbies) +
                ", schoolList=" + schoolList +
                ", stringSchoolMap=" + stringSchoolMap +
                '}';
    }

    @Test
    public void getObj() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ObjInject.xml");
        System.out.println(applicationContext.getBean(Student.class));
    }

    public void setSchoolNum(int num) {
        this.school.setNum(num);
    }

}
package com.gyk.ObjInject;

/**
 * ClassName: School
 * Package: com.gyk.depInject
 * Description:
 *
 * @Author Samuel
 * @Create 2024/7/24 09:21
 * @Version 1.0
 */
public class School {
    private String location;
    private int num;

    public void setLocation(String location) {
        this.location = location;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "School{" +
                "location='" + location + '\'' +
                ", num=" + num +
                '}';
    }
}


2024-07-24 14:09:02 534 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@49872d67
2024-07-24 14:09:02 602 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 3 bean definitions from class path resource [ObjInject.xml]
2024-07-24 14:09:02 615 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'school'
2024-07-24 14:09:02 633 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'school2'
2024-07-24 14:09:02 633 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'student'
Student{name='zs', age=22, school=School{location='henan', num=30000}, hobbies=[play, sing, ball], schoolList=[School{location='henan', num=30000}, School{location='henan', num=30000}], stringSchoolMap=[{map1=School{location='henan', num=30000}}, {map2=School{location='henan', num=30000}}]}

util:list  util:map

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       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
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd">


    <util:list id="list">
        <ref bean="school"></ref>
        <ref bean="school2"></ref>
    </util:list>


    <util:list id="list2">
        <util:map id="map">
            <entry>
                <key>
                    <value>school1</value>
                </key>
                <ref bean="school"></ref>
            </entry>
            <entry>
                <key>
                    <value>school2</value>
                </key>
                <ref bean="school2"></ref>
            </entry>
        </util:map>
    </util:list>


 <property name="schoolList" ref="list">
            <!--            <list>-->
            <!--                <ref bean="school"></ref>-->
            <!--                <ref bean="school2"></ref>-->
            <!--            </list>-->
  </property>

p命名空间 

    <!--   p命名空间  -->
    <bean id="school3" class="com.gyk.ObjInject.School" p:num="11" p:location="ww">
    </bean>
    <bean id="student2" class="com.gyk.ObjInject.Student" p:age="11" p:name="e11" p:hobbies="{1},{1}"
          p:schoolList-ref="list"
          p:stringSchoolMap-ref="list2">
    </bean>

bean 中读取本地 properties配置属性文件    druid 读取配置属性

先加依赖

 <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <!-- 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>

注意配置 context 命名空间url 和 xsi location url。

 @Test
    public void getPropertiesInfo() throws SQLException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ObjInject.xml");
        DruidDataSource student = (DruidDataSource) applicationContext.getBean(DruidDataSource.class);
        System.out.println(student.getUrl());
        System.out.println(student.getUsername());
        System.out.println(student.getPassword());
//        System.out.println(student.getConnection());
        System.out.println(student.getCreatedTime());
    }



jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC
root
root
Thu Jul 25 11:20:26 CST 2024

bean的作用范围:单实例还是多实例 (默认 singleon 单实例)

取值含义创建对象的时机
singleton(默认)在IOC容器中,这个bean的对象始终为单实例IOC容器初始化时
prototype这个bean在IOC容器中有多个实例获取bean时

Bean 生命周期

    /**
     * bean life cycle
     * 1. invoke null params controller
     * 2. set obj property
     * 3. before init
     * 4. invoke init method
     * 5. after init
     * 6. obj init success
     * 7. obj destroy
     * 8. ioc close
     */

 

①具体的生命周期过程

  • bean对象创建(调用无参构造器)

  • 给bean对象设置属性

  • bean的后置处理器(初始化之前)

  • bean对象初始化(需在配置bean时指定初始化方法)

  • bean的后置处理器(初始化之后)

  • bean对象就绪可以使用

  • bean对象销毁(需在配置bean时指定销毁方法)

  • IOC容器关闭

注意其中的initMethod()和destroyMethod(),可以通过配置bean指定为初始化和销毁的方法

<!-- 使用init-method属性指定初始化方法 -->
<!-- 使用destroy-method属性指定销毁方法 -->
<bean class="com.atguigu.spring6.bean.User" scope="prototype" 
init-method="initMethod" destroy-method="destroyMethod">
    <property name="id" value="1001"></property>
    <property name="username" value="admin"></property>
    <property name="password" value="123456"></property>
    <property name="age" value="23"></property>
</bean>

⑤bean的后置处理器

bean的后置处理器会在生命周期的初始化前后添加额外的操作,需要实现BeanPostProcessor接口,且配置到IOC容器中,需要注意的是,bean后置处理器不是单独针对某一个bean生效,而是针对IOC容器中所有bean都会执行

public class MyBeanProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("☆☆☆" + beanName + " = " + bean);
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("★★★" + beanName + " = " + bean);
        return bean;
    }
}
<!--        **⑤bean的后置处理器**-->
<!--        bean的后置处理器会在生命周期的初始化前后添加额外的操作,需要实现BeanPostProcessor接口,且配置到IOC容器中,需要注意的是,bean后置处理器不是单独针对某一个bean生效,而是针对IOC容器中所有bean都会执行-->

 FactoryBean

FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同,配置一个FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是getObject()方法的返回值。通过这种机制,Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来,只把最简洁的使用界面展示给我们。

将来我们整合Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。

class MyOBJ {

}

public class FactoryBean implements org.springframework.beans.factory.FactoryBean<MyOBJ> {
    @Override
    public MyOBJ getObject() throws Exception {
        return new MyOBJ();
    }

    @Override
    public Class<?> getObjectType() {
        return MyOBJ.class;
    }

    @Test
    public void re() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("FactoryBean.xml");
        MyOBJ factoryBean = (MyOBJ) context.getBean("factoryBean"); //只能传id ,FactoryBean.class 会报错
        System.out.println(factoryBean);//com.gyk.factory.MyOBJ@7df587ef
    }
}
基于xml自动装配

使用bean标签的autowire属性设置自动装配效果

自动装配方式:byType

byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值

若在IOC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,即值为默认值null

若在IOC中,有多个兼容类型的bean能够为属性赋值,则抛出异常NoUniqueBeanDefinitionException

  <bean id="controller" class="com.gyk.auto_wired.controller.controller" autowire="byType"></bean>
    <bean id="service" class="com.gyk.auto_wired.service.service" autowire="byType"></bean>
    <bean id="dao" class="com.gyk.auto_wired.dao.dao" autowire="byType"></bean>
public class controller {
    public void setServ(service serv) {
        this.serv = serv;
    }

    private service serv;

    public void run() {
        System.out.println("controller run ");
        serv.run();
    }

    @Test
    public void test() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("autowire.xml");
        controller c = (controller) applicationContext.getBean(controller.class);
        c.run();
    }
}


//
public class service {
    private dao d;

    public void setD(dao d) {
        this.d = d;
    }

    public void run() {
        System.out.println(" service run ");
        d.run();
    }
}
// 

public class dao {
    public void run() {
        System.out.println(" dao run ");
    }
}

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

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

相关文章

**往届快至会后2个月完成检索,刊后1个月完成检索,第四届电子信息工程与计算机科学国际会议(EIECS 2024)火热征稿中!

2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024) 2024 4th International Conference on Electronic Information Engineering and Computer Science 中国延吉 | 2024年9月27-29日 二轮截稿日期&#xff1a;2024年8月9日 收录检索&#xff1a;EI Compendex, Sc…

【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针

目录 常量指针和指向常量的指针有什么区别&#xff1f;1. 指向常量的指针&#xff08;Pointer to Constant&#xff09;声明方式&#xff1a;示例&#xff1a;解释&#xff1a; 2. 常量指针&#xff08;Constant Pointer&#xff09;声明方式&#xff1a;示例&#xff1a;解释&…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案&#xff0c;旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果&#xff0c;边缘物联网平台应具备以下功能&#xff1a; 云边协同&#xff1a; 云边一体架构&#xff0c;通过云端管理边…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

医疗大模型落地赛,敢问钱在何方?

“你们能不能帮我们触达到更多顶尖药企&#xff1f;” 一大模型厂商与某服务商沟通需求时率先发问。从混沌时期的争辩模型大小、数据规模&#xff0c;到如今的做应用、抢占医疗各环节场景&#xff0c;中国医疗大模型已经进入落地的第二战场。 中国信通院云计算与大数据研究所…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前&#xff0c;仍然是先来个视频&#xff0c;以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击&#xff1a; 痕即鼠标点击器可以设定每秒点击次数&#xff0c;让您轻松应对高频点击需求。 切换时长&#xff0c;即每次动作之间的间…

使用Process Explorer/Process Hacker和Windbg高效排查C++程序高CPU占用问题

目录 1、为什么需要将Process Explorer/Process Hacker与Windbg结合起来分析高CPU占用问题? 1.1、使用Windbg分析时为什么还要使用Process Explorer/Process Hacker呢? 1.2、使用Process Explorer/Process Hacker分析时为什么还要使用Windbg呢? 2、先用Process Explorer…

《程序猿入职必会(6) · 返回结果统一封装》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

前段时间&#xff0c;带着大家捏了一个对话机器人&#xff1a; 手把手带你搭建一个语音对话机器人&#xff0c;5分钟定制个人AI小助手&#xff08;新手入门篇&#xff09; 其中语音识别&#xff08;ASR&#xff09;方案&#xff0c;采用的是阿里开源的 FunASR&#xff0c;这刚…

【Python机器学习】朴素贝叶斯——条件概率

条件概率 假设现在有一个装了7块石头的罐子&#xff08;3块灰色&#xff0c;4块黑色&#xff09;&#xff0c;如果从中随机取出一块&#xff0c;灰色的可能性就是3/7&#xff0c;黑色的可能性是4/7。我们使用p(gray)来表示取到灰色石头的概率&#xff0c;其概率值可以通过灰色…

Radxa ROCK 5B+开发板基本配置和上手测试

目录 1.ROCK 5B Plus开发板是什么&#xff1f;2.烧录官方系统3.设置ROOT用户4.开发板温度情况5.VNC远程桌面配置6.WIFI模块测速7.M2接口使用注意8.总结 1.ROCK 5B Plus开发板是什么&#xff1f; ROCK 5B&#xff08;即ROCK 5B Plus&#xff0c;本文用ROCK 5B指代&#xff09; …

数据结构-----对列

前言 Hello, 小伙伴们&#xff0c;你们的作者菌又来了&#xff0c;前不久&#xff0c;我们学习了一种数据结构----栈&#xff0c;他特殊的性质使得他在一些数据管理的问题上被广泛的使用&#xff0c;那今天&#xff0c;我们就来学习另一种十分重要的数据结构--对列。 在开始之…

Spring Boot中如何实现全链路调用日志跟踪?

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 在Spring Boot中实现全链路调用日志跟踪&#xff0c;主要依赖于Mapped Diagnostic Context&#xff08;MDC&#xff09;功能。MDC是一种用于在多线程条件下记录日志的功能&#xff0c;它可以看作是与当…

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

[Python][列表和元组]详细讲解

目录 0.是什么&#xff1f;1.列表1.创建列表2.访问下标3.切片操作4.遍历列表元素5.新增元素6.查找元素7.删除元素8.连接列表 2.关于元组∞.积累 0.是什么&#xff1f; 列表和元组类似C/C中的数组列表&#xff1a;一种在代码中批量表示/保存数据的方式 代码中需要表示的数据特别…

093、Python操作Excel生成统计图表

在Excel里做统计表是我们经常会做的一件事情。我们也可以通过编程的方式操作Excel生成统计图表。 下面是官方的一个很有参考价值的案例&#xff1a; from openpyxl import Workbook from openpyxl.chart import BarChart, Reference from copy import deepcopywb Workbook(w…

C# 使用pythonnet 迁入 python 初始化错误解决办法

pythonnet 从 3.0 版本开始&#xff0c;必须设置Runtime.PythonDLL属性或环境变量 例如&#xff1a; string pathToVirtualEnv ".\\envs\\pythonnetTest"; Runtime.PythonDLL Path.Combine(pathToVirtualEnv, "python39.dll"); PythonEngine.PythonHom…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …

GraphHopper-map-navi_路径规划、导航(web前端页面版)

文章目录 一、项目地址二、踩坑环境三、问题记录3.1、graphhopper中地图问题3.1.1. getOpacity不存在的问题3.1.2. dispatchEvent不存在的问题3.1.3. vectorLayer.set(background-maplibre-layer, true)不存在set方法3.1.4. maplibre-gl.js.map不存在的问题3.1.5. Uncaught Ref…

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…