03-Spring-依赖注入+bean的作用域(单例、多例)

本文介绍Spring框架中的依赖注入方法,包括基本类型的注入、集合类型的注入等,并详细解析了不同作用域如Singleton、Prototype等对Bean实例的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 、依赖注入
案例
  1. 实体类
public class User {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;
}

public class Address {
    private String address;
}
  1. beans.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="address" class="com.nuc.pojo.Address">
        <property name="address" value="山西"></property>
    </bean>

    <bean id="user" class="com.nuc.pojo.User">
        <property name="name" value="小明"></property>
        <property name="address" ref="address"></property>
        <property name="books">
            <array>
                <value>三国</value>
                <value>水浒</value>
                <value>西游记</value>
                <value>红楼梦</value>
            </array>
        </property>
        <property name="hobbys">
            <list>
                <value>吃饭</value>
                <value>睡觉</value>
            </list>
        </property>
        <property name="card">
            <map>
                <entry key="red" value=""></entry>
                <entry key="blue" value=""></entry>
                <entry key="black" value=""></entry>
            </map>
        </property>
        <property name="games">
            <set>
                <value>LOL</value>
                <value>CF</value>
                <value>4399</value>
            </set>
        </property>
        <property name="wife">
            <null/>
        </property>
        <property name="info">
            <props>
                <prop key="sex"></prop>
                <prop key="age">20</prop>
            </props>
        </property>
    </bean>
</beans>
  1. 普通注入

    使用

  2. Bean注入

    将上述value属性改为ref

  3. 数组注入

    在property标签中嵌套array;array中使用value进行元素定义

  4. List注入

    嵌套list标签;list中嵌套value

  5. Map注入

     <map>
        <entry key="red" value=""></entry>
        <entry key="blue" value=""></entry>
        <entry key="black" value=""></entry>
    </map>
    
  6. Set注入

    <set>
       <value>LOL</value>
       <value>CF</value>
       <value>4399</value>
    </set>
    
  7. null

    <property name="wife">
        <null/>
    </property>
    
  8. Properties

    <props>
         <prop key="sex"></prop>
         <prop key="age">20</prop>
    </props>
    
二、扩展方式注入
  1. p命名空间注入,可以直接注入属性的值:相当于 property

    1. 导入 xmlns:p=“http://www.springframework.org/schema/p”

    2. <bean id="userService" class="com.nuc.service.UserServiceImpl" p:userDao-ref="userDao" />
      
  2. c命名空间注入,通过构造器注入:相当于 construct-args

    1. 导入 xmlns:c=“http://www.springframework.org/schema/c”

    2. <bean id="userThr" class="com.nuc.pojo.UserThr" c:userThr="hahaha" />
      
三、bean的作用域

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .

img

几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

Singleton

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

 <bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

测试:

 @Test
 public void test03(){
     ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml");
     User user = (User) context.getBean("user");
     User user2 = (User) context.getBean("user");
     System.out.println(user==user2);
 }

单例模式,所以输出true

Prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

 <bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  
Request

当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

 <bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

Session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

 <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

timestamp, hostname, api, model, precision, input_tokens, output_tokens, prefill_time, prefill_rate, decode_time, decode_rate, memory 20250518 15:24:27, lyan-desktop, mlc, HF://dusty-nv/Llama-3.2-1B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.015906775333333335, 1152.1491596025971, 1.4829113754540684, 86.31680311712834, 1077.296875 20250518 15:28:46, lyan-desktop, mlc, HF://dusty-nv/Llama-3.2-3B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.03446315800000001, 531.902004795764, 3.269266599979003, 39.152582515347646, 1181.3359375 20250518 15:35:20, lyan-desktop, mlc, HF://dusty-nv/Llama-3.1-8B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.07374422466666666, 248.6317380453315, 6.871479741816272, 18.62775617455641, 1304.65625 20250518 15:41:21, lyan-desktop, mlc, HF://dusty-nv/Llama-2-7b-chat-hf-q4f16_ft-MLC, MLC, 20, 128, 0.06836841133333334, 292.5336252554004, 6.002553366173228, 21.32425965156252, 1055.89453125 20250518 15:43:42, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-0.5B-Instruct-q4f16_ft-MLC, MLC, 1, 114, 0.009421591, 106.18970215740416, 0.8550749830796254, 133.7521586434499, 1119.296875 20250518 15:46:37, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-1.5B-Instruct-q4f16_ft-MLC, MLC, 19, 115, 0.01937756733333334, 980.6365887546056, 1.610312740818777, 71.24470297966548, 1148.78515625 20250518 15:52:09, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-7B-Instruct-q4f16_ft-MLC, MLC, 19, 128, 0.06954662866666667, 273.19829106044574, 6.629001840209975, 19.309103655140483, 1232.62890625 20250518 15:56:17, lyan-desktop, mlc, HF://mlc-ai/gemma-2-2b-it-q4f16_1-MLC, MLC, 13, 128, 0.08149855200000002, 135.47223927944813, 3.651719763653544, 35.05265878612133, 1350.98828125 20250518 16:00:08, lyan-desktop, mlc, HF://dusty-nv/Phi-3.5-mini-instruct-q4f16_ft-MLC, MLC, 12, 128, 0.037959572000000004, 275.3450370674631, 3.610325953511811, 35.45386568470883, 1004.4296875 20250518 16:03:11, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-135M-Instruct-q4f16_ft-MLC, MLC, 14, 128, 0.01486336666666667, 815.9287017266039, 0.659275389312336, 194.22638971451948, 1062.95703125 20250518 16:06:26, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-360M-Instruct-q4f16_ft-MLC, MLC, 14, 110, 0.016463410333333334, 732.8045080487393, 0.6842916086847877, 160.87697704944213, 1115.4140625 20250518 16:09:36, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-1.7B-Instruct-q4f16_ft-MLC, MLC, 14, 128, 0.02005880666666667, 625.9932727795469, 1.973092667128609, 64.87279019410019, 1018.12890625 20250518 16:17:01, lyan-desktop, mlc, HF://dusty-nv/Llama-3.2-1B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.015236920000000001, 1202.960634832396, 1.44522712928084, 88.56740168877337, 1056.38671875 20250518 16:21:33, lyan-desktop, mlc, HF://dusty-nv/Llama-3.2-3B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.034624267, 529.7432062949644, 3.259655160272966, 39.267977634764236, 1194.76953125 20250518 16:28:13, lyan-desktop, mlc, HF://dusty-nv/Llama-3.1-8B-Instruct-q4f16_ft-MLC, MLC, 18, 128, 0.07327828566666668, 250.12485665218432, 6.834818684976378, 18.72763683946975, 1302.98046875 20250518 16:34:42, lyan-desktop, mlc, HF://dusty-nv/Llama-2-7b-chat-hf-q4f16_ft-MLC, MLC, 20, 120, 0.06829140233333333, 292.8626724860238, 5.599301619388121, 21.43515084814026, 1058.5234375 20250518 16:36:59, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-0.5B-Instruct-q4f16_ft-MLC, MLC, 7, 128, 0.008347386333333333, 779.5177224666528, 0.9061044315380578, 141.3598096817907, 1082.25390625 20250518 16:40:09, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-1.5B-Instruct-q4f16_ft-MLC, MLC, 19, 108, 0.018811383, 1010.1042056478245, 1.492941049692798, 72.67303515868629, 1129.6015625 20250518 16:46:27, lyan-desktop, mlc, HF://dusty-nv/Qwen2.5-7B-Instruct-q4f16_ft-MLC, MLC, 19, 119, 0.07009660033333334, 271.06619029022124, 6.142558513069099, 19.427134623721756, 1245.9453125 20250518 16:50:39, lyan-desktop, mlc, HF://mlc-ai/gemma-2-2b-it-q4f16_1-MLC, MLC, 13, 126, 0.08088827000000001, 136.36136642323896, 3.5498229806472006, 35.397779561694016, 1370.6953125 20250518 16:54:27, lyan-desktop, mlc, HF://dusty-nv/Phi-3.5-mini-instruct-q4f16_ft-MLC, MLC, 12, 128, 0.03716280366666667, 283.0125363745294, 3.586102897889764, 35.69345110773751, 1019.16796875 20250518 16:57:24, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-135M-Instruct-q4f16_ft-MLC, MLC, 20, 128, 0.008601623333333334, 2363.705761481012, 0.5499296702152231, 232.7570912557338, 1054.53125 20250518 17:00:34, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-360M-Instruct-q4f16_ft-MLC, MLC, 8, 112, 0.008005688666666667, 752.27271816386, 0.666063508656693, 168.79378782298483, 1106.52734375 20250518 17:03:35, lyan-desktop, mlc, HF://dusty-nv/SmolLM2-1.7B-Instruct-q4f16_ft-MLC, MLC, 20, 111, 0.02133993233333334, 952.7117527879018, 1.685485941457729, 65.8915225054968, 1010.81640625 output as table
最新发布
05-20
### 如何将以提供的时间戳、主机名、API、模型、精度、输入/输出标记数、填充时间和速率等性能数据以表格形式展示 在处理此类需求时,可以利用编程语言(如 Python 或其他工具)将这些字段整理成结构化的表格。以下是实现这一目标的具体方法: #### 数据准备阶段 假设已有的数据是一个字典列表的形式,其中每一项代表一组记录的数据点。每组数据包含多个键值对,如 `timestamp` (时间戳), `hostname` (主机名),以及其他的指标。 #### 表格构建逻辑 通过 Pandas 库能够轻松创建并显示表格。Pandas 是一种强大的数据分析库,在 Python 中广泛用于操作和呈现数据集。下面给出一段代码示来演示如何完成此任务: ```python import pandas as pd # 假设这是我们的原始数据样本 data = [ { 'Timestamp': '2023-10-01T12:00:00Z', 'Hostname': 'serverA', 'API': '/api/v1/data', 'Model': 'ResNet50', 'Accuracy': 98.7, 'Input_Tokens': 1000, 'Output_Tokens': 500, 'Padding_Time': 0.2, 'Rate': 150.0 }, { 'Timestamp': '2023-10-01T12:05:00Z', 'Hostname': 'serverB', 'API': '/api/v1/predict', 'Model': 'BERT-base', 'Accuracy': 96.3, 'Input_Tokens': 800, 'Output_Tokens': 400, 'Padding_Time': 0.1, 'Rate': 120.0 } ] # 将数据转换为 DataFrame 对象 df = pd.DataFrame(data) # 显示表格 print(df.to_markdown(index=False)) ``` 这段脚本首先定义了一个包含两行测试数据的数组 `data[]` ,接着将其转化为 Pandas 的 DataFrame 结构以便于后续的操作与可视化[^4]。最后调用了 `.to_markdown()` 方法生成易于阅读的 Markdown 格式的表格输出。 #### 输出效果预览 运行以上程序后得到如下样式的表格输出: | Timestamp | Hostname | API | Model | Accuracy | Input_Tokens | Output_Tokens | Padding_Time | Rate | |---------------------|----------|----------------|-----------|----------|--------------|---------------|--------------|--------| | 2023-10-01T12:00:00Z | serverA | /api/v1/data | ResNet50 | 98.7 | 1000 | 500 | 0.2 | 150.0 | | 2023-10-01T12:05:00Z | serverB | /api/v1/predict| BERT-base | 96.3 | 800 | 400 | 0.1 | 120.0 | 这种格式非常适合嵌入文档或者报告中作为清晰直观的表现方式[^5]。 #### 注意事项 当实际应用时需注意以下几点: - 确保所有字段名称一致且无拼写错误; - 如果某些字段可能缺失,则应提前设定默认值或采取适当措施处理空缺情况; - 针对大规模数据集考虑优化内存占用及计算效率等问题;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值