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

news2024/9/21 22:29:55

配置列表

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/beans
        http://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实例化");
    }

  @Override
    public void getUser() {
        System.out.println("get User Success");
    }

    /**
     * Bean初始化方法
     */
    public void init(){
        System.out.println("初始化方法");
    }

    /**
     * Bean销毁前方法
     */
    public void destroy(){
        System.out.println("销毁前方法");
    }


    @Override
    public 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> {
    @Override
    public UserService getObject() throws Exception {
        return new UserServiceImpl();
    }

    @Override
    public 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/beans
        http://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/beans
        http://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.coloradmin.cn/o/733158.html

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

相关文章

Springboot请求映射原理

1、重点关注DispatcherServlet.class&#xff08;前端控制器&#xff09; 所有的请求在Springmvc中都经过DispatcherServlet.class进行处理 展开DispatcherServlet.class的机构树&#xff0c; 发现dispatcherServlet也是继承了httpServlet,那么只要事servlet就要重写doget、do…

[CISCN 2019华北Day2]Web1

[CISCN 2019华北Day2]Web1 开题一眼SQL 抓个包&#xff0c;发现是POST注入 试了一下&#xff0c;过滤了空格&#xff0c;用括号绕过&#xff0c;是个盲注 直接贴个脚本 import requests import timeurl "http://node2.anna.nssctf.cn:28326/index.php" payload …

Spring复习: (5) DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate

DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate 这两个类里定义了大量的静态变量&#xff0c;这些变量用来在xml配置文件中使用

C语言 常用库函数-表

文章目录 一、数学函数二、字符函数三、字符串函数四、输入输出函数五、动态分配函数和随机函数 一、数学函数 调用数学函数时&#xff0c;要求在源文件中包下以下命令行&#xff1a; #include <math.h> 二、字符函数 调用字符函数时&#xff0c;要求在源文件中包下以…

windows系统查看程序安装位置

查询命令 where sqlcmd是查询sqlcmd安装在什么位置 where cmd 是查询cmd安装在什么位置 where sqlcmd where cmd 使用方法 winr快捷键&#xff0c;输入cmd&#xff0c;点击确认 输入查询命令 &#xff0c;可以看到程序所在的路径

Kubernetes —Pod 和容器日志

日志架构 应用日志可以让你了解应用内部的运行状况。日志对调试问题和监控集群活动非常有用。 大部分现代化应用都有某种日志记录机制。同样地&#xff0c;容器引擎也被设计成支持日志记录。 针对容器化应用&#xff0c;最简单且最广泛采用的日志记录方式就是写入标准输出和标…

【JavaEE】前后端综合项目-博客系统(下)

【JavaEE】前后端综合项目-博客系统&#xff08;下&#xff09; 文章目录 【JavaEE】前后端综合项目-博客系统&#xff08;下&#xff09;1. 博客登录页1.1 用户名密码校验1.1.1 约定前后端交互接口1.1.2 后端代码1.1.3 前端代码 1.2 登录信息记忆功能1.2.1 约定前后端交互接口…

【Kerberos-KafkaTool】在大数据Kerberos认证下使用KafkaTool工具

【Kerberos-KafkaTool】在大数据Kerberos认证下使用KafkaTool工具 1&#xff09;安装 Kafka Tool 工具2&#xff09;配置 Kafka Tool 属性3&#xff09;添加相关配置3.1.新建连接3.2.Properties3.3.Security3.4.Advanced3.5.JAAS Config 1&#xff09;安装 Kafka Tool 工具 下…

驱动开发 作业2

使用 ioctl 替换 write/read 控制 LED、蜂鸣器、马达、风扇&#xff0c;并使用 udev 来自动创建设备文件 完整代码目录&#xff0c;请看这个仓库依然使用之前 ARM 课程中的 common 中的结构体代码都差不多&#xff0c;就贴个 led.c &#xff0c;用户空间测试代码 test.c 和头文…

多元回归预测 | Matlab主成分分析PCA降维,PLS偏小二乘回归预测。PCA-PLS回归预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab主成分分析PCA降维,PLS偏小二乘回归预测。PCA-PLS回归预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warn…

硬件性能 - 磁盘瓶颈分析

简介 本文章通过Linux命令输出指标项&#xff0c;简单的介绍硬件资源-磁盘的性能瓶颈分析。其他硬件性能分析如下&#xff1a; 1. 硬件性能 - CPU瓶颈分析 2. 硬件性能 - 掌握内存知识 3. 硬件性能 - 网络瓶颈分析 目录 1. 测试磁盘性能 1.1. 读性能 1.2. 写性能 1.3. 同时…

MachineLearningWu_5_MultipleLinearRegression

在进行多元线性回归的时候&#xff0c;我们需要规定一些基本法则。例如我们使用 x j ( i ) x_j^{(i)} xj(i)​来表示第i个sample的第j个特征。 将单元的线性回归变为多元线性回归&#xff0c;公式将变换为如下&#xff0c; 为了实现更简单的数学表达式&#xff0c;我们将表达式…

haproxy负载均衡

目录 一.常见的web集群调度器 二.haproxy的概念 三.特性 四 图解haproxy 五 haproxy的配置文件详解 一.常见的web集群调度器 1.目前常见的web集群调度器分为软件和硬件 2.软件通常使用开源的lvs/haproxy/nginx 3.硬件一般使用比较多的是f5 也有国内的产品 二.haproxy的…

LeetCode:合并区间

题目&#xff1a;56. 合并区间 - 力扣&#xff08;Leetcode&#xff09; 讲这道题之前&#xff0c;先介绍一下sort函数的骚操作。 sort函数可以用于二维数组的排序&#xff01;&#xff01;&#xff01; 解释&#xff1a; 这里sort函数也是从小到大进行排序&#xff0c;只…

确保无缝、安全的云转型

随着云计算继续主导数字化转型&#xff08;这是理所当然的&#xff09;&#xff0c;组织面临着双重挑战&#xff1a;将运营无缝转移到云并确保这种转型的安全。 虽然云的采用保证了可扩展性、成本效率和生产力的提高&#xff0c;但保持警惕对于组织防范网络安全威胁和安全漏洞…

webpack5搭建与基本概念

webpack基础构建 新建文件夹进入文件夹查看是否安装node&#xff0c;命令&#xff1a;node-v创建package.json文件&#xff0c;命令&#xff1a;npm init -y安装webpack和webpack-cli&#xff0c;&#xff08;命令自动创建出package-lock.json文件和node_modules文件夹&#x…

【智慧交通项目实战】《 OCR车牌检测与识别》(一)项目介绍

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。 🎉专栏推荐: 点…

指针进阶(1)(字符指针,指针数组,数组指针,函数指针)

目录 前言&#xff1a; 字符指针 TIP&#xff1a; 指针数组 数组指针 概念辨析 形式辨析 数组名的理解&#xff1a; 数组指针如何使用&#xff1f; 二维数组的传参 函数指针 函数的地址&#xff1a; 函数指针的形式 函数指针的作用 关于函数指针一些奇特的点 前言&…

Java基础知识 之 java Applet 小训练

import java.applet.Applet; import java.awt.*; import java.util.Random;import static java.lang.Math.cos; import static java.lang.Math.sin;public class HelloWorldApplet extends Applet {public void paint(Graphics g) {// 将Graphics对象转换为Graphics2D类型java.…

Linux 系统编辑 --文件IO

目录 1.文件 IO 1.1系统调用 1.2 C 标准库文件 IO 函数 1.3 open/close 函数 1.4 文件描述符表 1.7 read/write 函数 1.8 缓冲区 1.9 错误处理函数 2.0 阻塞、非阻塞 2.1 lseek 函数 辅助学习资料 参考书 1 &#xff1a;《 Unix 环境高级编程》 W.Richard St…