Spring的Bean你了解吗

Bean的配置

Spring容器支持XML(常用)和Properties两种格式的配置文件

Spring中XML配置文件的根元素是,中包含了多个子元素,每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中

元素包含了多个属性以及子元素,常用属性及子元素如下所示

id

是一个Bean的唯一标识,Spring容器对Bean的配置、管理都有这个属性完成

name

Spring容器同样可以通过此属性对容器中的Bean进行配置和管理,name属性可以为Bean指定多个名称、每个名称之间用逗号或分号隔开

class

该属性制定了Bean的具体实现类,它必须是一个完整的类名,使用类的全限定名

scope

用来设定Bean实例的作用域

constructor-arg

元素的子元素,可以使用此元素传入构造参数进行实例化。

该元素的index属性指定构造参数的序号(从0开始),

type属性指定构造参数的类型,

参数值可以通过ref属性或value属性直接指定,也可以通过ref或value子元素指定

property

元素的子元素,用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name属性指定Bean实例中的相应属性名。

ref属性或value属性指定参数值

ref

、等元素的属性或子元素,可以用于指定Bean工厂中某个Bean的实例引用

value

、等元素的属性或子元素。可以用于直接指定一个常量值

list

用于封装List或数组类型的依赖注入

set

用于封装Set类型属性的依赖注入

map

用于封装Map类型属性的依赖注入

entry

元素的子元素,用于设置一个键值对

注意:如果Bean中未指定id和name,Spring会将class值当作id

例子:

<?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-4.3.xsd"> <bean id="userDao" class="com.aqiuo.UserDaoImp" /><bean id="userService" class="com.aqiuo.UserServiceImp"><property name="userDao" ref="userDao"></property></bean></beans>

Bean的实例化

构造器实例化:

构造器实例化是指Spring容器通过Bean对应类中默认的的无参构造函数来实例化Bean。

静态工厂方式实例化:

开发者创建一个静态工厂方法来创建Bean的实例,其Bean配置的class属性所指定的不再是Bean实例的实现类,而是静态工厂类。同时,需要使用factory-method属性来指定所创建的静态工厂方法。

package com.aqiuo.Static_Factory;public class Bean2 {}//静态工厂
public class MyBean2Factory {public static Bean2 createBean2() {return new Bean2();}
}
//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-4.3.xsd"> //id还是bean的id class指定对应的工厂实现类 factory-method指定工厂方法<bean id="bean2" class="com.aqiuo.Static_Factory.MyBean2Factory" factory-method="createBean2"></bean>
</beans>
//测试

实例工厂方式实例化

        采用直接创建Bean的实例,同时在配置文件中,需要的实例化Bean也不是通过class属性直接指向实例化类,而是通过factory-bean书性指向配置的实例工厂,然后使用factory-method属性指定使用工厂的哪个方法

       
public class MyBean3Factory {public MyBean3Factory() {System.out.println("Bean3工厂实例化...");}public Bean3 createBean3() {return new Bean3();}
}<!--实例工厂--><bean id="myBean3Factory" class="com.aqiuo.Instance_factory.MyBean3Factory" scope="prototype"></bean><!-- factory-bean指定配置的实例工厂  factory-method指定工厂的哪个方法 --><bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean3"></bean>

Bean的作用域

singleton(默认)

使用ta定义的Bean在Spring容器中将只有一个实例,无论多少个bean引用它都指向同一个对象

prototype

每次通过Spring容器获取的prototype定义的bean时,容器都创建一个新的Bean实例

request

在一次HTTP请求中,容器会返回Bena的同一个实例,不同Http请求会产生新的Bean,该Bean仅在当前HTTP Request内有效

session

在一次HTTPSession请求中,容器会返回Bena的同一个实例,不同Http请求会产生新的Bean。该Bean仅在当前HTTP Session内有效

globalSession

application

websocket

Bean的生命周期

Bean的装配方式:

xml配置

setter配置(先调用默 认无参构造函数实力化对象,然后通过反射方式调用setter方法注入属性)

要求:

Bean类必须有一个默认无参构造方法

Bean类必须为需要注入的属性提供对应的setter方法

构造器配置

要求:

Bean类必须有一个有参构造方法

       //setter注入<bean id="user1" class="com.aqiuo.User.User"><property name="username" value="冉雨珊"></property><property name="password" value="张宇"></property><property name="list"><list><value>1</value><value>2</value><value>3</value></list></property></bean>//构造器注入<bean id="user2" class="com.aqiuo.User.User"><constructor-arg index="0" value="rys"></constructor-arg><constructor-arg index="1" value="zy"></constructor-arg><constructor-arg index="2"><list><value>qq</value><value>bb</value><value>mm</value></list></constructor-arg></bean><bean id="student" class="com.orz.spring.bean.Student"><property name="name" value="李华"/><property name="map"><map><entry key="key1" value="数据库原理"/><entry key="key2" value="java编程"/></map>       </property></bean>

自动装配

元素的autowire属性

default

byName

byType

constructor

no

注解配置

注解

Component

此注解可以描述Spring中的bean,泛化的概念,仅仅表示一个组件(Bean)

Repository

用于将数据访问层(DAO层)的类标识为Spring中的bean

Service

通常作用在业务层(Service层),用于将业务层的类标识为Spring中的bean

Controller

通常作用在控制层,用于将控制层的类标识为Spring中的Bean

Autowired

用于对bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作

Resource

默认按照Bean实例名称进行装配,name解析为bean名称,type属性解析为Bean实例类型

Qualifier

与@Autowired注解配合使用,会将默认按Bean类型装配修改为按Bean实例名称装配。

注意:Spring 4.0以上版本使用上面的代码对指定包中注解进行扫描前,需要先向项目中导入SpringAOP的jar包,否则会爆出错误

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd " > 扫描包下的注解<context:component-scan base-package="com.aqiuo.annotation.*" /> </beans>

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

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

相关文章

金三银四-JAVA核心知识高频面试题

又要快到一年一度的金三银四&#xff0c;开始复习啦&#xff5e;&#xff01; 每天一点点。。 目录 一、内存模型设计 二、synchronized和ReentrantLock的区别 三、垃圾回收机制 四、优化垃圾回收机制 4.1 了解应用需求 4.2. 调整堆大小 4.3. 减少对象分配 4.4. 使用合…

RestClient操作索引库_创建索引库(二)

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c; 通过http请求发送给ES。 官方文档地址: https://www.elastic.co/quide/en/elasticsearch/client/index.html 目录 一、初始化JavaRestClient 1.1.依赖引入 1.2.初始化…

推荐几个开源HTTP服务接口快速生成工具

在现在流行微服务、前后端分离软件开发架构下&#xff0c;基于标准RESTful/JSON的HTTP接口已经成为主流。在实际业务中有很多需要快速开发调用数据服务接口的需求&#xff0c;但团队中缺乏专业的后端开发人员&#xff0c;比如&#xff1a; &#xff08;1&#xff09;数据库表已…

BFC 2023年度星光之夜即将开启,打造梦幻跨年盛典

跨年钟声即将敲响&#xff0c;星光繁花璀璨绽放。2023年12月31日&#xff0c;BFC外滩金融中心&#xff08;下称BFC&#xff09;年度星光之夜拉开帷幕&#xff0c;在热酒派对和星光音乐会的热烈节日氛围中&#xff0c;幸运气球将在全场传递节日祝福&#xff0c;更有惊喜好礼抽奖…

从物联网到 3D 打印:硬件相关的开源项目概览 | 开源专题 No.52

arendst/Tasmota Stars: 20.4k License: GPL-3.0 Tasmota 是一款为 ESP8266 和 ESP32 设备提供的替代固件&#xff0c;具有易于配置的 webUI、OTA 更新、定时器或规则驱动的自动化功能以及通过 MQTT、HTTP、串口或 KNX 进行完全本地控制。该项目主要特点包括&#xff1a; 支持…

超简单实用,推荐的深度学习科研必备网站(轻松找论文,代码项目,写论文综述)

一个非常有用的深度学习必备网站 网址推荐 接触新方向需要了解的内容1.在某一个研究方向下&#xff0c;有哪些算法模型可以用&#xff1f;不同算法之间效果对比如何&#xff1f;2.在某一个研究方向下&#xff0c;到底有哪些论文&#xff0c;模型是可以用的&#xff1f;3.在某一…

在线电路仿真分析 : CircuitJS + EveryCircuit + 嘉立创EDA

CircuitJS CircuitJS是一款免费的在线电路仿真工具。绿色&#xff1a;正电压&#xff0c;红色&#xff1a;负电压&#xff0c;黄色&#xff1a;电流。 EveryCircuit EveryCircuit 是一个易于使用、高度交互的电路模拟器和 原理图捕获工具。其用户社区创建了数百万个电路设计。动…

(2023,提示分布学习,重参数化,正交损失)DreamDistribution:文本到图像扩散模型的提示分布学习

DreamDistribution: Prompt Distribution Learning for Text-to-Image Diffusion Models 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 方法 1.1 文本到图像扩散 1.2 提示…

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后&#xff0c;如果有自己的镜像库&#xff0c;肯定要docker push 一下 至于部署的步骤&#xff0c;一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

需求分析 :不得不重新去面对的一关。

软件需求分析 背景 深入需求产生的背景明确项目目标了解用户群体 需求优先级 需求的分类与整理明确需求优先级让团队成员都参与到需求分析中来&#xff0c;增加团队合作能力与效率 编写需求文档 整理好的需求编写成详细的需求文档包括需求的描述、输入/输出格式、功能流程…

MySQL 执行过程

MySQL 的执行流程也确实是一个复杂的过程&#xff0c;它涉及多个组件的协同工作&#xff0c;故而在面试或者工作的过程中很容易陷入迷惑和误区。 MySQL 执行过程 本篇将以 MySQL 常见的 InnoDB 存储引擎为例&#xff0c;为大家详细介绍 SQL 语句的执行流程。从连接器开始&…

Linux:apache优化(5)—— 隐藏版本号

防盗链&#xff1a;就是防止别人盗取你们公司的图片、文件、视频 作用&#xff1a;防盗链就是防止别人盗用服务器中的图片、文件、视频等相关资源。运维人员可以通过apache提供rewrite模块进行优化。 配置项&#xff1a; RewriteEngine ON ##打开网页重写功能 RewriteCond …