Spring------Bean的装配

spring bean的简介以及手动装配、自动装配、注解装配且包含实际demo (手动装配+xml): java中定义class,xml定义bean,class是逻辑,bean是注入数据,通过ref指定bean与bean之间的关联关系(自动装配+xml): 通过spring自动扫描代替手动ref指定bean和bean之间的关系,可以设定映射方式是byName还是byType(注解装配+xml): xml只配置支持注解和扫描的bean所在的包,bean的定义不在xml中。java中不仅定义class,还通过注解定义bean实例。因此class既有逻辑,也有数据。 阅读详情

Bean的装配

Bean的装配,就是Bean对象的创建,容器根据代码要求创建Bean对象后再传递给代码的过程,称为Bean的装配

Bean的默装配方式

通过getBean()方式从容器中获取指定的Bean实例,容器首先会调用Bean类的无参数构造器,创建空值的实例对象。

示例:
AService.java

package com.bean01;

public interface AService {

	void doSome();
	
}

AServiceImpl.java

package com.bean01;

public class ASereviceImpl implements AService {

	//spring默认的是调用类的无参数构造方法,创建空值对象
	public ASereviceImpl() {
		super();
		System.out.println("ASereviceImpl的无参构造方法");
	}

	@Override
	public void doSome() {
		System.out.println("==--业务方法doSome()--==");
		
	}

}

applicationContext.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:对象名称,唯一值。
    	class:全限定的类名 不能是接口
     -->
     <!-- bean标签的作用等同于
     SomeService someService = new SomeServiceImpl() -->
     <bean id="aService" class="com.bean01.ASereviceImpl" />

</beans>

MyTest.java

package com.bean01;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MyTest {

	/**
	 * spring容器中的对象是什么时间创建的?
	 * 在创建容器对象的时候,会创建配置文件中的所有对象
	 * 优点:一次创建所有对象,在使用getBean()获取对象时速度快
	 * 缺点:占用内存
	 */
	@Test
	public void test01() {
		String configLocation = "com/bean01/applicationContext.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
		//对象相当于已经存放在了spring的map中 (getBean()源码)
		AService service =  (AService) ctx.getBean("aService");
		service.doSome();
 	}
	
	
}

在这里插入图片描述

容器中Bean的作用域

创建Bean示例的时候,可以通过scope属性,为Bean()指定特定的作用域。

Spring支持5种作用域(主要会用到的有以下4种):

(1)singleton: 单例模式。在Spring容器中,使用singleton定义的Bean将是一个单例的,只有一个实例。默认的作用域就是单例的。
(2)prototype:原型模式。每次使用getBean()方法获取的同一个< bean />的实例都是一个新的实例。
(3)request:对于每次HTTP请求,都将会产生一个不同的Bean实例。
(4)session:对于每个不同的HTTP session,都将产生一个不同的Bean实例。

注意:
对于scope为singleton的单例模式,Bean是在容器被创建时即被装配好了。
对于scope为prototype的原型模式,Bean实例是在代码中使用到该Bean实例时才进行装配的。

示例(单例模式):
applicationContext.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">

    <!-- 
    	定义对象的作用域,指定对象的存在范围和可见性
    	1.singleton 单例,这是默认值,表示在spring容器中对象只有一个
    	 如何指定单例:
    	 			<bean id="xx" class="yyy" scope="singleton" />
    	2.prototype  原型,表示每次使用getBean()都会创建一个新的对象
    	 如何指定原型作用域:
    	 			<bean id="xx" class="yyy" scope="prototype" />
     -->
     <!-- 单例 -->
     
     <bean id="aService" class="com.bean02.ASereviceImpl" scope="singleton" />
     
</beans>

MyTest.java

package com.bean02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MyTest {

	/**
	 * 单例对象是什么时间创建的?
	 * 创建容器对象的时候,会创建配置文件中的所有对象
	 */
	@Test
	public void test01() {
		String configLocation = "com/bean02/applicationContext.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
		//单例对象
		AService service1 =  (AService) ctx.getBean("aService");
		AService service2 =  (AService) ctx.getBean("aService");
		
		//判断对象是否为同一个   
		if (service1 == service2) {
			
			System.out.println("service1和service2是同一个对象");
			
		} else {
			
			System.out.println("service1和service2【不是】同一个对象");
			
		}
 	}
	
}

在这里插入图片描述示例(原型模式):
applicationContext.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">

    <!-- 
    	定义对象的作用域,指定对象的存在范围和可见性
    	1.singleton 单例,这是默认值,表示在spring容器中对象只有一个
    	 如何指定单例:
    	 			<bean id="xx" class="yyy" scope="singleton" />
    	2.prototype  原型,表示每次使用getBean()都会创建一个新的对象
    	 如何指定原型作用域:
    	 			<bean id="xx" class="yyy" scope="prototype" />
     --> 
     <!-- 原型 -->
     <bean id="aService" class="com.bean02.ASereviceImpl" scope="prototype" />

</beans>

MyTest.java

package com.bean02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MyTest {

	/**
	 * 测试原型作用域
	 * 原型作用域的对象创建时间?
	 * 把对象的创建时间延迟到使用对象的时候(调用getBean()之后才创建)
	 */
	@Test
	public void test02() {
		
		String configLocation = "com/bean02/applicationContext.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
		//原型作用域对象  调用getBean()创建出来到本方法结束,该对象就不存在了 相当于是没有存放在getBean()的map中的
		AService service1 =  (AService) ctx.getBean("aService");
		AService service2 =  (AService) ctx.getBean("aService");
		
		System.out.println("service1: " + service1.hashCode());
		System.out.println("service2: " + service2.hashCode());
		if (service1 == service2) {
			
			System.out.println("service1和service2是同一个对象");
			
		} else {
			
			System.out.println("service1和service2【不是】同一个对象");
			
		}
		
	}
	
	
}

在这里插入图片描述

自定义Bean的生命始末

可以为Bean定制初始化后的生命行为,也可以为Bean定制销毁前的生命行为。
需要在配置文件的< bean/>标签中增加如下属性:

init-method:指定初始化方法的方法名
destroy-method:指定销毁方法的方法名
注:destroy-method实现需要两个条件:
(1)Bean为singleton
(2)确保容器关闭。关闭时,接口ApplicationContext没有close方法,但是它的实现类有,所以要将ApplicationContext对象进行强转成其实现类的对象执行close方法

示例:
AServiceImpl.java

package com.bean03;

public class ASereviceImpl implements AService {

	//spring默认的是调用类的无参数构造方法,创建空值对象
	public ASereviceImpl() {
		super();
		System.out.println("ASereviceImpl的无参构造方法");
	}

	@Override
	public void doSome() {
		System.out.println("==--业务方法doSome()--==");
		
	}

	
	//定义bean的生命始末方法
	/**
	 * 初始化方法,作用是创建其他对象,给属性赋值,等同于构造方法的作用
	 */
	public void setUp() {
		
		System.out.println("bean的初始化方法,等同于构造方法的作用");
		
	}
	
	/**
	 * bean销毁之前执行的方法,只要是用来回收资源,释放内存
	 */
	public void tearDown() {
		
		System.out.println("bean销毁之前执行的方法,用来回收资源");
		
	}
}

applicationContext.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的生命始末 可以参与到spring创建对象,和销毁对象的过程中,自定义一些操作
    	1.在代码中定义生命始末的方法,方法的原型是 public void 方法名自定义() {自定义的操作}
    	2.在spring的配置文件中,定义bean对象的时候,指定方法名称
    		<bean id="xx" class="yyy" init-method="bean的初始化方法名称"
    		 destroy-method="bean对象销毁之前执行的方法名称" />
    	两个方法不需要同时存在
     -->
     <bean id="aService" class="com.bean03.ASereviceImpl" init-method="setUp"
     	destroy-method="tearDown" />
     

</beans>

MyTest.java

package com.bean03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MyTest {


	@Test
	public void test01() {
		String configLocation = "com/bean03/applicationContext.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
		//单例对象
		AService service =  (AService) ctx.getBean("aService");
		
		service.doSome();
		
		/**
		 * AService service = new AServiceImpl();
		 * service.setUp();
		 */
		
		/**
		 * 执行销毁方法
		 * 1.关闭容器
		 * 2.对象得是单例的 
		 * 因为是单例的对象存放在容器之中 原型的没有存放在容器中,所以会无法执行销毁方法
		 */
		((ClassPathXmlApplicationContext)ctx).close();  //Map
 	}
	
}

在这里插入图片描述

结束语

我喜欢吃肉,我不是英雄,我只做我想做的事,保护我想要保护的人而已。 ——路飞《海贼王》

【Spring】— Spring中Bean的装配方式 在Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter()方法来注入属性值。在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean,就会导致XML配置文件过于臃肿,给以后的维护和升级工作带来一定的困难。虽然使用注解的方式装配Bean在一定程度上减少了配置文件中的代码量,但是也有企业项目中是没有使用注解方式开发的,那么有没有什么办法既可以减少代码量,又能够实现Bean的装配呢? 阅读详情

相关推荐

探索niri:让你的Linux桌面布局无拘无束

niri是一款基于Wayland的滚动平铺合成器,采用创新的窗口管理方式。它将窗口排列为向右无限延伸的条目,支持独立显示器布局和动态垂直工作区,确保多任务操作流畅性。核心功能包括概要视图、截图界面、屏幕投射、手势操作、窗口分组等,并支持自定义布局和动画效果。niri具备良好的稳定性,兼容xwayland-satellite工具,灵感来自PaperWM但突破了GNOME限制。该项目为追求高效桌面管理的用户提供了全新解决方案,欢迎加入社区交流体验。

weixin_44626085的博客 1817

Bean的几种装配

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。 Spring容器支持多种形式的Bean装配方式,如基于XML的装配、基于注解的装配方式、以及基于Java配置类的装配; Bean的3种装配方式: · 1、基于XML形式的装配; 示例: <bean id="postservice" class="com.bbs.service.impl.PostserviceImpl"> </bean> 在<b

qq_73767908的博客 1266

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1951

JAVA中快速构建BEAN的方法

首先,创建一个JAVA类,testBean.java。package com.beans; public class testBean { } 然后,添加私有成员字段。package com.beans; public class testBean { private String name; private String age; private String ID; ...

weixin_30492047的博客 306

PCB线路板的制作工艺流程分享!2021-08-21

Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体

jdbpcb88的博客 3247

基于FPGA的TDC延迟链优化与码密度校准方法(1)——原理与实现

本文深入探讨了基于FPGA的时间数字转换器(TDC)延迟链非均匀性问题及其码密度校准方法。通过分析工艺偏差、温度电压影响等根源,详细介绍了码密度测试原理、逐位校准技术及气泡消除算法,并分享了自适应校准策略与多场景应用实践,有效提升TDC测量精度至皮秒级。

kiwi8的博客 488

spring中Bean的实例化方式

无参数构造 对于这种方式,注意Bean类中必须提供无参数构造。 创建bean类 package com.itcast.bean; public class Bean1 { public Bean1(){ System.out.println("bean1的无参构造"); } public void show(){ System.out....

Marion的博客 409

如何在INCA中修改标定量的初始值,并刷回控制器

测试过程中,有些时候,标定量来不及修改,这就需要修改标定量的初始值了,又不想打开模型重新编译,因此直接在INCA中修改,然后再刷回控制器,就成了最佳选择,之前也学过,长时间不用,忘记怎么搞了,最近又用到了,这次记录一下,以后用到的时候,就不用在网上东翻西找了。截止到2023年11月24日,共找到了两种方法可以实现修改。

weixin_43406519的博客 4200

spring中bean的生命周期

bean的生命周期如图所示: 下面通过代码示例说明: bean: package com.beanlifecycle; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.be...

shining的专栏 198

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

python:实现矩阵SVD分解(附完整源码)

python:实现矩阵SVD分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

java.beans包详解_java.beans包使用汇总一 (序列化)

看到java.bean这个包的时候,觉得XMLEncoder和XMLDecoder这两个类有点意思。前者可以直接将JavaBean输入为XML文件,后者可以直接将格式正确的XML文件还原为JavaBean的对象,感觉和对象序列化有点类似,只不过这种方式我们可以清晰地看到转换为普通文件以后的对象的格式,这种方式也可以实现对一个游离对象的持久化。一.先定义两个普通的JavaBean代码如下packag...

weixin_39578457的博客 884

【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程【站长亲测】

MMORPG端游【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程。

百创科技 531

Spring bean的装配方法

主要存在三种方法(1).在XML文件中进行显式配置(2).在java中进行显示配置(3).隐式的bean发现机制和自动装配。

weixin_42581560的博客 1779

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring中Bean的三种装配方式

bean的装配通俗点就是依赖注入(spring的特点之一),再说通俗点就是类中属性的赋值,而这种赋值不是由我们直接在代码中赋值,而是通过在配置文件中配置值类实现的,给他起了一个高大上的名字,让我来说就是把赋值包装了一层还有一层呀。让我们一起看看这三种装配方式怎么实现的吧!!   1、基于XML的装配 基于xml的装配方式有俩种表现形式,在Java中,大家对类中属性赋值一般有俩种吧,第一种就是...

苦行僧的博客 5281

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【手撕 Spring】Spring 如何装配 Bean

在 Spring 中,对象无需自己查找或创建与其所关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。

激流丶的博客 4557

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring中Bean的自动装配

Spring中Bean的自动装配 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean。 Spring中bean有三种装配机制,分别是: 在xml中显式配置; 在java中显式配置; 隐式的bean发现机制和自动装配【重点】 本文主要介绍第三种,自动化的装配bean Spring的自动装配需要从两个角度来实现,或者说是两个操作: 4. 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean

qq_41359998的博客 2062

Spring学习笔记:Bean的装配方式

学习内容:Bean的装配方式 1.

qq_49019244的博客 5261

Spring-Bean自动装配

如果@Autowired自动装配的环境比较复杂(相同的类存在多个bean,不能准确注入我们需要的bean),自动装配无法通过一个注解@Autowired完成的时候,我们可以使用@Qualifier(value = “xxx”)通过beanId,配合@Autowired的使用,指定一个唯一的bean对象注入!ByName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的bean id!

weixin_53004298的博客 904

实验1 Spring IoC中的Bean装配

实验1 Spring IoC中的Bean装配

派大星子的博客 2374

spring自动装配Bean的五种方式

no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系 byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配 byType:根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配 constructor:根据构造器进行装配,与 byType 类似,如果bean的构造器有与其他bean类型相同的属...

qq_37908493的博客 1万+

Spring装配Bean的主要方式总结

Spring装配Bean有三种主要方式:自动装配、基于Java显示配置和基于XML显示配置。建议使用的是自动装配,一是简单快捷,二是显示配置维护麻烦。但是显示配置在有些场景下是必须的或者高效的,例如想讲第三方库的组件装配到自己的应用中,肯定不能去把第三方的组件类加上注释;或者需要维护别人写的代码,但是他用的是显示配置,如果不了解就无从下手,所以也应该了解spring的显示配置方式。 1. 自

深页 920

Spring Bean的装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring 容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解IAnnotation的装配和 自动装配等(其中最常用的是基于注解的装配)。 1.基于XML的装配 Spring提供了两种基于XML的装配方式:设值注入( Setter Injection) 和构造注入( Constructor Inj...

qq_44692189的博客 634

Spring提供了三种装配bean的方式

转自:https://www.cnblogs.com/JimKing/p/8811119.html#s103 1.Spring提供了三种装配bean的方式: 2.自动装配bean: 3.通过Java代码装配bean 4.通过XML装配bean     前言:创建对象的协作关系称为装配,也就是DI(依赖注入)的本质。而在Spring容器中对bean的创建时就需要对它所依赖的对象进行注入...

armarm9的博客 2752

Spring装配Bean——通过注解装配Bean

在大多时候,我们会考虑使用注解(annotation)的方式去装配Bean。 1、使用@Component装配Bean 首先定义一下POJO,代码如下: @Component(value = "role") public class Role { @Value("1") private Long id; @Value("role_name_1") private S...

monkey_wei的博客 806

Spring 装配Bean

引言 Spring装配Bean的方式有3种: 通过XML装配Bean 通过注解装配Bean @Component 自动装配 一、通过XML装配Bean     通过XML装配Bean其实就是通过setter方法注入,通过在XML文件中设置Property值,使得对象在创建的时候就调用setter方法将初始值注入给对象。这里不再赘述。 二、通过注解装配Bean     除了通过xml文件,Spr...

yy的博客 262
上一篇: Javaweb----------基于MVC分层开发思想的一个小项目demo(登录、添加、修改、删除、登出、将信息列表导出成Excel表格)
下一篇: Spring------基于xml的DI (一)设值注入、构造注入
小岑你来一下!
博客等级 码龄8年 8粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值