SPRING-了解2-XML

news2024/9/25 21:28:46

两种bean

  Spring中有两种bean:一种普通bean,另外一种工厂bin (Factory Bin,注意不是前面说的BeanFactory类)

 普通Bean:xml中定义什么类型返回的就是什么类型

<bean id="book" class="com.i7i8i9.spring5.collectiontype.Book">

xml中class是Book, 返回的也是Book

  public void testBooks(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
        Book book=context.getBean("book", Book.class);
        book.test();
    }

工厂Bean: 定义和返回可以不一样

   1)创建一个类,实现一个接口,作为工厂类,规定返回泛型

<bean id="myBean" class="com.i7i8i9.spring5.collectiontype.factorybean.MyBean">
public class MyBean implements FactoryBean<Courses> {
    @Override
    //定义返回对象类型,
    public Courses getObject() throws Exception {
        Courses courses=new Courses();
        courses.setcNames("化学");
        return courses;
    }

2)测试

    

@Test
public void testMyBean() {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
   //MyBean没有继承 FactoryBean<Courses>前
   // MyBean myBean= context.getBean("myBean", MyBean.class);
    Courses myBean= context.getBean("myBean", Courses.class);
    System.out.println(myBean);

}

Bean作用域

在spring里面可以设置创建Bean实例是单实例还是多实例,默认单实例

默认看

生成的两个对象地址一样,就是单实例 

在XML bean标签可以增加配置

<!--    注入-->
<!--    <bean id="book" class="com.i7i8i9.spring5.collectiontype.Book" scope="singleton">-->
<!--            多实例-->
    <bean id="book" class="com.i7i8i9.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList">

        </property>
    </bean>

不写scope,默认singleton

如果写了prototype,则可以看到,生成了多个地址的对象 ,但是不是在加载spring配置文件时创建,而是在调用getBean方法时创建多实例对象

scope还有 request  和 session

request:一次请求  把创建对象放到request

session:会话  把创建对象放到session

Bean生命周期--7步

1)创建:通过构造器创建Bean实例(无参);------xml

2) 为Bean属性设置值和对其他Bin引用(调用了set方法)----xml

3)调用Bean的初始化方法-需要进行配置

4)Bean可以使用了,对象实例已经获取到

5)当容器关闭,调用Bean的销毁方法-需要配置

类修改为,明文写出无参构造函数,自己建立初始化方法,和销毁方法,两个方法随便命名


public class Orders {
    private String oName;

    public Orders() {
        System.out.println("第一步,无参构造");
    }

    public void setoName(String oName) {
        this.oName = oName;
        System.out.println("第二部,调用Set方法设置属性值");
    }
    //创建初始化执行方法
    public void initOrders(){
        System.out.println("第三步,执行初始化方法");
    }
    //创建销毁执行方法
    public void destroyOrders(){
        System.out.println("第五步,执行销毁方法");
    }
}

将初始化和销毁方法配置到xml,就是给Bean增加两个参数

 <bean id="orders" class="com.i7i8i9.spring5.collectiontype.bean.Orders" init-method="initOrders" destroy-method="destroyOrders">
        <property name="oName" value="电器">

        </property>

    </bean>

因为不会自动调用销毁方法,所以修改测试类进行手动销毁

public void testOrders(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
       Orders orders= context.getBean("orders", Orders.class);
        System.out.println("第四步骤:获取Bean实例");
        System.out.println(orders);

        //手动执行销毁   ApplicationContext是抽象类,本身没有销毁方法,其调用ClassPathXmlApplicationContext的销毁方法
       ((ClassPathXmlApplicationContext)context).close();
    }

除了以上五步,Bean还有后置处理器,在初始化前后

1)创建:通过构造器创建Bean实例(无参);------xml

2) 为Bean属性设置值和对其他Bin引用(调用了set方法)----xml

3.1)初始化前,把Bean实例传递给后置处理器

BeanPostProcessor接口的方法 postProcessBeforeInitialization

3.2)调用Bean的初始化方法-需要进行配置

3.3)初始化后,把Bean实例传递给后置处理器

BeanPostProcessor接口的方法 postProcessAfterInitialization

4)Bean可以使用了,对象实例已经获取到

5)当容器关闭,调用Bean的销毁方法-需要配置

举例:

  1)需要额外建立一个类,实现后置处理器

   

public class MyBeanPost implements BeanPostProcessor {
    //从BeanPostProcessor接口中复制两个方法过来,把default改成public
    //@Nullable改成  @Override
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("3.1初始化之前的方法");
        return bean;
    }

    //@Nullable改成  @Override
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("3.3初始化之后的方法");
        return bean;
    }
}

修改XML增加上面的Bean

<bean id="orders" class="com.i7i8i9.spring5.collectiontype.bean.Orders" init-method="initOrders" destroy-method="destroyOrders">
        <property name="oName" value="电器">

        </property>

    </bean>
<!--    配置后置处理器-->
    <bean id="myBeanPost" class="com.i7i8i9.spring5.collectiontype.bean.MyBeanPost"></bean>

    这样该XML中所有Bean都有了后置处理器,测试文件没怎么修改,如下

    @Test
    public void testOrders(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
       Orders orders= context.getBean("orders", Orders.class);
        System.out.println("第四步骤:获取Bean实例");
        System.out.println(orders);

        //手动执行销毁   ApplicationContext是抽象类,本身没有销毁方法,其调用ClassPathXmlApplicationContext的销毁方法
       ((ClassPathXmlApplicationContext)context).close();
    }
}

输出:

第一步,无参构造
第二部,调用Set方法设置属性值
3.1初始化之前的方法
第三步,执行初始化方法
3.3初始化之后的方法
第四步骤:获取Bean实例
com.i7i8i9.spring5.collectiontype.bean.Orders@6b695b06
第五步,执行销毁方法

Process finished with exit code 0

自动装配

 xml中手动设置property叫手动装配

根据指定装配规则(属性名称或属性类型),Spring将自动匹配的属性值进行注入,不需要写property标签

第一种 byName: xml中bean的id要和类中的属性名称要一致

1)xml中增加autowire="byName"

2)类中属性名为department,xml中ref="department",同时Bean的id 也有department

xml:
<bean id="employee" class="com.i7i8i9.spring5.autowire.Employee" autowire="byName">
<!--    <property name="department" ref="department">   </property>-->
<!--    实现自动装配-->
</bean>

类中
public class Employee {
    private Department department;

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "department=" + department +
                '}';
    }

    public void test(){
        System.out.println(department);
    }
}

第二种根据类型自动装配

    <bean id="employee" class="com.i7i8i9.spring5.autowire.Employee" autowire="byType">

上文中根据类型就是在Employee类中有个属性的类型是

public class Employee {
    private Department department;

属性类型是Department,那么就会去xml中找到class是Department的bean

注意这个时候同一个类不能有多个Bean,否则还是要用byName

  <bean id="department" class="com.i7i8i9.spring5.autowire.Department">

测试输出

Employee{department=Department{}}

补充Deapartment类

public class Department {
    @Override
    public String toString() {
        return "Department{}";
    }
}

补充Employee类

package com.i7i8i9.spring5.autowire;

public class Employee {
    private Department department;

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "department=" + department +
                '}';
    }

    public void test(){
        System.out.println(department);
    }
}

补充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 id="employee" class="com.i7i8i9.spring5.autowire.Employee" autowire="byName">-->
<!--    <property name="department" ref="department">   </property>-->
<!--    实现自动装配-->
    <bean id="employee" class="com.i7i8i9.spring5.autowire.Employee" autowire="byType">
</bean>


    <bean id="department" class="com.i7i8i9.spring5.autowire.Department">

    </bean>
</beans>

如果不配autowire则会输出:

Employee{department=null}

IOC操作Bean-引入外部属性文件

以数据库连接池为例

  引入jar包:Central Repository: com/alibaba/druid​​​​​​f

复制到lib

引入

 

1)配置XML Bean:直接配置

   就是明文写value内容的意思

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

 2)引入外部properties文件

   src下创建文件

 在里面写,左边属性名是自定义的,为了防止冲突都用了prop.开头

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/musicbird
prop.username=root
prop.password=123456

引入spring配置文件:

  之前学过引入p空间用来定义属性,util空间 用来把多值的集合提取出来成为公共集合

这次定义引入context名称空间

同样增加一行xmlns,另外xsi中增加两个http,用context替换了三处beans

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

使用新标签

<!--    引入外部属性文件 jdbc.properties在src下,所以直接写出-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${prop.driverClass}"></property>
            <property name="url" value="${prop.url}"></property>
            <property name="username" value="${prop.username}"></property>
            <property name="password" value="${prop.password}"></property>
        </bean>

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

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

相关文章

Linux 应用基础 Framebuffer应用编程

文章目录前言一、了解Framebuffer二、了解LCD1.LCD的操作原理2.LCD坐标三. Framebuffer 程序分析1. 打开设备&#xff1a;&#xff08;open&#xff09;2. 获取LCD参数 : ( ioctl )3. 映射 framebuffer: ( mmap )四. 描点函数&#xff1a; &#xff08; lcd_put_pixel &#xf…

【OpenFOAM】-olaFlow-算例3- currentWaveFlume

算例路径&#xff1a; olaFlow\tutorials\currentWaveFlume 算例描述&#xff1a; 波流耦合模拟&#xff0c;该算例提供了四种工况&#xff1a;(1) Waves and forward current&#xff0c;(2) Waves and backward current&#xff0c;(3) Forward current only&#xff0c;(4) …

【LSTM预测】基于卷积神经网络结合双向长短时记忆CNN-BiLSTM(多输入单输出)数据预测含Matlab源码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【云服务器 ECS 实战】一文掌握负载均衡服务原理及配置方法

一、负载均衡基本原理概述协议/端口轮询策略会话保持二、云服务器 ECS 负载均衡相关配置协议&监听配置后端服务器配置健康检查配置测试在上期文章中&#xff0c;介绍了负载均衡的概述及优势&#xff0c;并详细演示了阿里云服务器负载均衡服务的选型与购买配置。本期文章我们…

字节最新秋招面试题泄露,“背完”这些你也可以拿到字节offer

Java 一面基本上都是基础题&#xff0c;同样是 CURD 的活&#xff0c;谁更熟练要谁&#xff0c;比如下面这些面试题&#xff0c;八股文越熟练越容易通过 Java 面试。下面会给大家详解的介绍一下每个技术点的必问问题&#xff01; 一、Java 基础 1.JDK动态代理和CGLIB动态代理的…

12月18日第壹简报,星期日,农历十一月廿五

12月18日第壹简报&#xff0c;星期日&#xff0c;农历十一月廿五1. 官方&#xff1a;预计我国今年经济总量超过120万亿元&#xff0c;明年经济有望总体回升。2. 多地血库告急&#xff0c;两部门修改“指引”&#xff1a;最后一次新冠核酸或抗原阳性结果7天后可献血。3. 北京&am…

Wireshark 实验

本部分按照数据链路层、网络层、传输层以及应用层进行分类&#xff0c;共有 10 个实验。需要使用协议分析软件 Wireshark 进行&#xff0c;请根据简介部分自行下载安装。 准备 请自行查找或使用如下参考资料&#xff0c;了解 Wireshark 的基本使用&#xff1a; 选择对哪块网…

DropBox系列-打造车载系统APM框架

前言&#xff1a; 作者本人负责公司的APM监控模块&#xff0c;因为工作的原因&#xff0c;对ANR&#xff0c;crash等流程研究的比较多&#xff0c;最近在打造APM监控平台的时候&#xff0c;顺带对DropBox的实现原理进行了一定的学习和研究&#xff0c;发现了一些妙用&#xff…

【DELM回归预测】基于海鸥算法改进深度学习极限学习机SOA-DELM实现数据回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于java+springmvc+mybatis+vue+mysql的疫情时期药物管理系统

项目介绍 前端页面&#xff1a; 功能&#xff1a;首页、医生、药品信息、药品资讯、个人中心、后台管理、在线客服 管理员后台管理页面&#xff1a; 功能&#xff1a;首页、个人中心、用户管理、医生管理、药品类别管理、药品信息管理、药品购买管理、在线咨询管理、系统管理…

Python图像处理【4】图像线性变换

图像线性变换0. 前言1. 2D 线性几何变换数学原理2. 使用 scipy.ndimage 旋转图像3. 使用 Numpy 翻转图像4. 使用 scipy.ndimage 实现仿射变换4.1 仿射变换原理4.2 实现仿射变换小结系列链接0. 前言 图像线性变换是图像处理中的基本运算&#xff0c;通常用于调整图像的视觉效果…

【Spring Cloud】如何安装与配置Nacos注册中心?

本期目录1. Nacos介绍2. Nacos安装2.1 Windows安装3. 配置Nacos3.1 引入依赖3.2 修改配置文件3.3 启动并测试1. Nacos介绍 Nacos 是阿里巴巴的产品&#xff0c;使用 Java 语言开发。比 Eureka 功能更丰富&#xff0c;除了可以作注册中心&#xff0c;还可以作配置中心。 2. Nac…

【Java开发】Staffjoy 02 :系统架构设计

本文主要对 Staffjoy 项目的架构做一个介绍和衍生&#xff0c;包括数据模型、各服务接口模型及框架选择等&#xff0c;希望能让大家对于项目有个整体的把握和判断&#xff0c;本文最后也列举了 Dubbo、Spring Cloud 和 K8s 三种微服务框架的异同~ 目录 1 架构设计 1.1 总体架…

毕业设计 基于PID控制的智能平衡车 - stm32 物联网 单片机【超详细】

文章目录0 前言1 课题背景2 设计内容3 设计方案3.1 设计思路3.3 硬件设计3.4 软件设计3.4.1 关键技术 - PID控制算法3.4.2 关键技术 - 倾角估计算法3.4.3 关键技术 - 直立控制算法3.4.4 速度控制3.4.5 方向控制4 视频演示5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业…

长短时记忆网络(LSTM)负荷预测项目(matlab)

目录 1. LSTM介绍 2. 数据集准备及预处理 3. LSTM模型搭建与训练 4. 预测模型测试 1. LSTM介绍 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径…

每日一道LeetCode(一):两数之和

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

刷完这1000道JAVA面试题,让你成功逆袭上岸

内容涵盖&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈。 由于整个笔记比较全面&#xff0c;内容相当的多 &#xff0c;这里仅展示面经中的面试真题&#xff0…

Keras深度学习实战(41)——语音识别

Keras深度学习实战&#xff08;41&#xff09;——语音识别0.前言1. 模型与数据集分析1.1 数据集分析1.2 模型分析2. 语音识别模型2.1 数据加载与预处理2.2 模型构建与训练小结系列链接0.前言 语音识别(Automatic Speech Recognition, ASR&#xff0c;或称语音转录文本)使声音…

openssl加密base64编码

openssl OpenSSL 是一个安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 首先&#xff0c;要安装 openssl: centos命令: sudo yum install openssl-devel ubuntu命令&#x…

WebService基于Baidu OCR和Map API的导航服务

哈尔滨工业大学国家示范性软件学院 《面向服务的软件系统》大作业 项目题目&#xff1a; 基于OCR和地图API的路牌定位与导航服务 项目组成员&#xff1a; 姓名 学号 李启明 120L021920 完成日期&#xff1a; 2022年 12 月 15 日 1.选题 1.1 作业…