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

devtools/2024/9/22 17:39:52/

类型:

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>
java">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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", school=" + school +", hobbies=" + Arrays.toString(hobbies) +", schoolList=" + schoolList +", stringSchoolMap=" + stringSchoolMap +'}';}@Testpublic void getObj() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ObjInject.xml");System.out.println(applicationContext.getBean(Student.class));}public void setSchoolNum(int num) {this.school.setNum(num);}}
java">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;}@Overridepublic 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

java"><?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://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命名空间 

java">    <!--   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。

java"> @Testpublic 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都会执行

java">public class MyBeanProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("☆☆☆" + beanName + " = " + bean);return bean;}@Overridepublic 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> {@Overridepublic MyOBJ getObject() throws Exception {return new MyOBJ();}@Overridepublic Class<?> getObjectType() {return MyOBJ.class;}@Testpublic 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

java">  <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();}@Testpublic 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.ppmy.cn/devtools/85086.html

相关文章

go-kratos 学习笔记(5) 删除hellword从新生成服务

go-kratos 删除hellword模版里的服务&#xff0c;从新生成服务users 直接删除api/helloword 目录&#xff0c;在api目录下新建 users目录&#xff1b;使用命令生成新的proto #项目根目录执行 kratos proto add api/users/user.protobuf generate生成的user.proto需要根据自己…

Laravel:揭秘PHP世界中最优雅的艺术品

1. 引言 在PHP的世界里&#xff0c;框架如繁星般璀璨&#xff0c;但Laravel以其独特的魅力和优雅&#xff0c;成为了众多开发者心中的艺术品。本文将深入探讨Laravel为何能在众多PHP框架中脱颖而出&#xff0c;成为最优雅的选择。 1.1 Laravel的诞生背景 Laravel的诞生可以…

2024秋招算法

文章目录 参考资料刷题感悟一 数组1.1 二分查找1.2 移除元素1.3 长度最小的子数组1.4 螺旋矩阵1.5 在排序数组中查找元素的第一个和最后一个位置 二 链表2.1 移除链表元素2.2 设计链表2.3 反转链表2.4 两两交换链表中的节点2.5 删除链表的倒数第N个节点2.6 链表相交2.7 环形链表…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号4

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…

TCP的socket的API

关键的两个类 1)ServerSocket 该类专门给服务器用的,这个构造方法传入端口进行连接 accept相当于是接听操作,进行连接 close关闭当前套接字,当socket对象与进程的生命周期不一致时需要提前释放资源,就需要调用close 为什么UDP的客户端服务器中没有这个close方法,因为这个sock…

【动态规划】力扣.213. 打家劫舍 II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…

Python应用开发——30天学习Streamlit Python包进行APP的构建(20):配置

Configuration配置 config.toml config.toml 是一个可选文件,你可以为工作目录或全局开发环境定义它。当 config.toml 文件同时在全局和工作目录中定义时,Streamlit 会合并配置选项,并优先使用工作目录配置。此外,你还可以使用环境变量和命令行选项来覆盖其他配置选项。更…

React系列面试题

大家好&#xff0c;我是有用就点赞&#xff0c;有用就扩散。 1.React的组件间通信都有哪些形式&#xff1f; 父传子&#xff1a;在React中&#xff0c;父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中&#xff0c;在子组件中通过props属性进行接收。这个就…