小菜鸟 SSM框架之 Spring复习-02(Bean的实例化)

本文详细介绍了Spring中Bean的三种实例化方式:构造器实例化、静态工厂实例化和实例工厂实例化,以及每种方式的配置和使用示例。此外,还讲解了Bean的作用域,包括singleton和prototype等,分析了它们在实际应用中的区别和管理方式。
摘要由CSDN通过智能技术生成

Bean 的实例化

Bean的实例化有三种方式:构造器实例化、静态工厂实例化、实例工厂方式实例化

构造器实例化

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

创建Bean1类:

package com.itheima.instance.constructor;

public class Bean1 {
    
}

创建Spring的配置文件:

<?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 = "bean1" class = "com.itheima.instance.constructor.Bean1"></bean>
        
</beans>

在配置文件中配置一个id 为bean1的 Bean ,并通过class属性指定其对应的实现类。

创建测试类:

package com.itheima.instance.constructor;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InstanceTest1 {
	public static void main(String[] args) {
		//定义配置文件的路径
		String xmlPath = "com/itheima/instance/constructor/beans1.xml";
		//加载配置文件,并对Bean进行实例化
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		Bean1 bean = (Bean1) applicationContext.getBean("bean1"); //强制类型转换
		System.out.print(bean);
		((AbstractApplicationContext)applicationContext).close();
	}
}

运行结果:
在这里插入图片描述

bean1 已被执行,执行结果在不同的电脑有不同的结果!!!

静态工厂方式实例化

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

创建Bean2类:

package com.itheima.instance.static_factory;

public class Bean2 {

}

创建工厂类,并在工厂类中创建一个静态工厂方法:

package com.itheima.instance.static_factory;

//工厂类
public class MyBean2Factory {
	//工厂类中的静态方法
	public static Bean2 createBean() {
		return new Bean2();
	}
}

使用静态工厂实例化时,工厂类中的静态方法必须有返回值,且返回值的类型和实例化的Bean2 的类型相同。

配置Spring的配置文件:

<?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 = "bean2" class = "com.itheima.instance.static_factory.MyBean2Factory" 
    		factory-method = "createBean"/>
</beans>

class属性指向 静态方法的所属的工厂类;factory-method指向 实例化Bean的静态方法。

测试类:

package com.itheima.instance.static_factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InstanceTest2 {
	public static void main(String[] args) {
		//定义配置文件的路径
		String xmlPath = "com/itheima/instance/static_factory/beans2.xml";
		//加载配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		//实例化Bean2对象
		Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
		System.out.println(bean2);
		((AbstractApplicationContext)applicationContext).close();
	}
}

运行结果:
在这里插入图片描述

实例工厂方式实例化

此种方式不再使用静态方法创建 Bean 实例,而是采用直接创建 Bean 实例的方式。

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

创建Bean3 类:

package com.itheima.instance.factory;

public class Bean3 {

}

创建实例工厂类:

package com.itheima.instance.factory;

public class MyBean3Factory {
	//无参构造方法
	public MyBean3Factory() {
		System.out.println("bean3 工厂实例化中 。。。。");
	}
	
	//创建bean3实例化方法
	public Bean3 createBean() {
		return new Bean3();
	}
}

创建Spring配置文件:

<?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 = "MyBean3Factory"  class = "com.itheima.instance.factory.MyBean3Factory"/>
       	<!-- factory-method配置工厂中使用哪一个方法      factory-bean指向配置的实例工厂-->
       	<bean id = "bean3" factory-bean = "MyBean3Factory"  factory-method = "createBean"></bean>
        
</beans> 

创建测试类:

package com.itheima.instance.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InstanceTest3 {
	public static void main(String[] args) {
		//指定配置文件的路经
		String xmlPath = "com/itheima/instance/factory/beans3.xml";
		//加载配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		//实例化Bean3对象
		Bean3 bean = (Bean3) applicationContext.getBean("bean3");
		System.out.println(bean);
		
		((AbstractApplicationContext)applicationContext).close();
		
	}
}

运行结果:
在这里插入图片描述

构造器实例化、静态工厂方式实例化、实例工厂方式实例化三者的复杂程度依次增加。

静态工厂方式实例化和实例工厂方式实例化两者批量实例化的Bean比较方便。


》 附加一点Bean的作用域的知识,这一点比较简单。

Bean 的作用域

作用域的种类
作用域说明
singleton(单例)使用singleton定义的Bean 在Spring容器中只有一个实例,即:无论有多少个Bean引用它,都始终指向同一个对象。是Spring默认的作用域
prototype(原型)每次通过Spring 获取 prototype定义的 Bean时,容器都将创建一个新的Bean实例对象
request在一次HTTP请求中,容器会返回该Bean的同一个实例,对于不同的HTTP请求,会产生不同的Bean实例,而且该Bean仅在当前的HTTP Request 内有效
session在一次HTTP Session 请求中,容器会返回该Bean的同一个实例,对于不同的HTTP请求,会产生不同的Bean实例,而且该Bean仅在当前的HTTP Session 内有
globalSession在一个全局的HTTP Session 中容器会返回该Bean的同一个实例。仅在使用porlet 上下文时有效
application为每个ServeletContext 对象创建一个实例。仅在WEB相关的ApplicationContext中生效
websocket为每一个Websocket 对象创建一个实例。仅在web相关的ApplicationContext中生效

singleton和prototype是最常用的

在Spring的配置文件中,Bean的作用域是通过元素的scope属性来指定的,该属性值可以设置为:singleton、prototype、request、session、globalSession、application、websocket

配置文件中的格式:

<bean id = "XXXX" class = "XXXXX"  scope = "singleton/prototype/request/session/globalSession/application/websocket">
Bean 生命周期

Spring 容器可以管理singleton 作用域的 Bean的生命周期。在此作用域下,Spring容器能够准确地知道该Bean 是何时被创建的、何时初始化完成、何时被销毁的

对于prototype作用域的Bean ,Spring容器只负责创建,当容器创建了Bean实例后,Bean的实例就交给客户端的代码来管理了,Spring容器并不会来管理这些Bean的生命周期


		在校学习生,不定时更新。还请各位看官谅解。
(参考书籍:JAVA EE 企业级应用开发教程(Spring+SpringMVC+MyBatis))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值