项目结构与依赖

首先,我们需要添加 Spring 核心依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version>
</dependency>

项目结构如下:

com.example
├── config          // 配置类包
│   └── Config.java // 主配置类
├── entity          // 实体类包
│   └── Emp.java    // 员工实体类
└── Main.java       // 程序入口

核心注解解析

Java Config 主要通过以下注解实现 XML 配置的功能:

Java Config 注解对应 XML 配置说明
@Configuration<beans>标识当前类为配置类,对应 XML 配置文件
@Bean<bean>声明一个 Bean 对象,方法名默认作为 Bean 的 id
@ComponentScan<context:component-scan>配置组件扫描路径
@ImportResource<import>导入 XML 配置文件
@PropertySource<context:property-placeholder>导入属性配置文件
@Import<import>导入其他配置类

代码实现

1. 实体类定义

首先创建一个简单的实体类Emp

package com.example.entity;public class Emp {int id;String name;@Overridepublic String toString() {return "Emp{" +"id=" + id +", name='" + name + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Emp() {}public Emp(int id, String name) {this.id = id;this.name = name;}
}

2. 配置类定义

创建配置类Config,替代传统的applicationContext.xml

package com.example.config;import com.example.entity.Emp;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.*;/*
@Configurable对应于applicationContext.xml
@Bean对应于.xml中<bean id=""></bean>
@ComponentScan("com.wgy")对应于.xml中<context:component-scan base-package=""/>扫注解(创类的注解)
@ImportResource("classpath:applicationContext.xml")对应于.xml中<import resource="classpath:"/>
@PropertySource("classpath:db.properties")对应于.xml中<context:property-placeholder location="classpath:db.properties"/>。可以在@Value("${?}")中写值
@Import(Other.class)  整合多个java-config
*/
@Configurable
public class Config {@Bean   //若未指定注解name属性,则bean的id = "方法名"public Emp emp(){Emp emp = new Emp(1,"张三");return emp;}
}

3. 主程序入口

创建主程序类,初始化 Spring 容器并获取 Bean:

package com.example;import com.example.config.Config;
import com.example.entity.Emp;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {/*ClassPathXmlApplicationContext和AnnotationConfigApplicationContext都是Spring框架中用于创建IoC容器的实现类。一个应用只需一个ioc容器!*/AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);Emp stu = applicationContext.getBean("emp", Emp.class);System.out.println(stu);}
}

运行结果

运行Main类的main方法,控制台将输出:

Emp{id=1, name='张三'}

这表明我们成功通过 Java Config 配置创建了 Spring 容器,并从容器中获取到了Emp对象。

扩展说明

  1. 容器初始化方式

    • 传统 XML 配置使用ClassPathXmlApplicationContext
    • 注解配置使用AnnotationConfigApplicationContext
  2. Bean 的命名规则

    • @Bean注解未指定name属性时,默认以方法名作为 Bean 的 id
    • 可以通过@Bean(name = "customName")指定自定义名称
  3. 配置类的组合

    • 可以使用@Import注解导入其他配置类
    • 对于大型项目,建议按功能模块拆分多个配置类

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

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

相关文章

用无标签语音自我提升音频大模型:SI-SDA 方法详解

用无标签语音自我提升音频大模型:SI-SDA 方法详解 在语音识别和处理领域,近年来大模型(Large Language Models, LLMs)的发展迅速,为语音任务带来了新的突破。然而,语音信号的复杂性使得这些模型在特定领域中表现不佳。如何在没有标注数据的情况下提升音频大模型的表现?…

开源工具新玩法:cpolar提升Penpot协作流畅度

文章目录前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动Penpot容器3. 本地使用Penpot进行创作4. 公网远程访问本地Penpot4.1 内网穿透工具安装4.2 创建远程连接公网地址5. 固定Penpot公网地址前言 你是否也曾因商业设计软件的高昂费用而放弃团队协作&#xff1f;或者…

DINOv2 vs DINOv3 vs CLIP:自监督视觉模型的演进与可视化对比

近年来&#xff0c;自监督学习在计算机视觉领域取得了巨大进展&#xff0c;推动了无需人工标注即可学习强大视觉表示的视觉基础模型&#xff08;Vision Foundation Models&#xff09;的发展。其中&#xff0c;DINOv2 和 CLIP 是两个极具影响力的代表性工作&#xff0c;而最新的…

并发编程——05 并发锁机制之深入理解synchronized

1 i/i--引起的线程安全问题 1.1 问题思考&#xff1a;两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; public class SyncDemo {private static int counter 0;public static void increment()…

数字接龙(dfs)(蓝桥杯)

非常好的联系dfs的一道题目&#xff01; 推荐看这位大佬的详解——>大佬详细题解 #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std;const int N 2e5 10,M20; int a[M][M]; bool val[M][M]; i…

[光学原理与应用-318]:职业 - 光学工程师的技能要求

光学工程师需具备扎实的专业知识、熟练的软件操作能力、丰富的实践经验、良好的沟通协作与项目管理能力&#xff0c;以及持续学习和创新能力&#xff0c;以下是具体技能要求&#xff1a;一、专业知识与理论基础光学基础知识&#xff1a;熟悉光学原理、光学材料、光学仪器等基础…

万字详解架构设计:业务架构、应用架构、数据架构、技术架构、单体、分布式、微服务都是什么?

01 架构要素结构连接在软件行业&#xff0c;对于什么是架构一直有很多的争论&#xff0c;每个人都有自己的理解。不同的书籍上、不同的作者&#xff0c;对于架构的定义也不统一&#xff0c;角度不同&#xff0c;定义不同。此君说的架构和彼君理解的架构未必是一回事。因此我们在…

使用Docker搭建StackEdit在线MarkDown编辑器

1、安装Docker# 安装Docker https://docs.docker.com/get-docker/# 安装Docker Compose https://docs.docker.com/compose/install/# CentOS安装Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA2、安装StackEdit2.1、方式1详见&#xff1a; https://benweet.github.…

【C++详解】用哈希表封装实现myunordered_map和 myunordered_set

文章目录一、框架分析二、封装框架&#xff0c;解决KeyOfT三、⽀持iterator的实现四、const迭代器五、实现key不支持修改六、operator[ ]七、一些补充(reserve和rehash)八、源码一、框架分析 SGI-STL30版本源代码中没有unordered_map和unordered_set&#xff0c;SGI-STL30版本是…

【 MYSQL | 基础篇 四大SQL语句 】

摘要&#xff1a;本文先介绍数据库 SQL 的核心概念&#xff0c;接着阐述 SQL 通用语法与 DDL、DML、DQL、DCL 四大分类&#xff0c;随后详细讲解各类语句操作&#xff0c;包括 DDL 的数据库与表操作及数据类型&#xff0c;DML 的数据增删改&#xff0c;DQL 的查询语法与功能&am…

Transformer 模型在自动语音识别(ASR)中的应用

文章目录自动语音识别&#xff08;ASR&#xff09;简介简要介绍TransformerTransformer 在 ASR 中的应用基于“语音识别模型整体框架图”的模块介绍1. 音频采集模块&#xff08;Audio Acquisition Module&#xff09;2. 音频预处理模块&#xff08;Audio Preprocessing Module&…

集成电路学习:什么是SSD单发多框检测器

SSD:单发多框检测器 SSD(Single Shot MultiBox Detector)是一种高效的目标检测算法,它通过单一网络实现对象检测,具有快速且准确的特点。以下是关于SSD的详细解析: 一、SSD的技术特点 1、单一网络检测: SSD通过单一的前向传播过程预测不同尺度的边界框和类别概率…

【车载开发系列】汽车零部件DV与PV试验的差异

【车载开发系列】汽车零部件DV与PV试验的差异 【车载开发系列】汽车零部件DV与PV试验的差异【车载开发系列】汽车零部件DV与PV试验的差异一. 概念说明二. DV测试&#xff08;Design Verification 设计验证测试&#xff09;三. PV测试&#xff08;Performance Verification 性能…

如何在阿里云百炼中使用钉钉MCP

本文通过阿里云百炼钉钉MCP配合&#xff0c;完成钉钉AI表格&#xff08;多维表&#xff09;数据管理 &#xff0c;其他AI开发工具可参照本文完成部署。 准备工作 在正式开始前&#xff0c;需要提前了解什么是钉钉MCP&#xff0c;详情请参考钉钉服务端API MCP 概述。已经注册了…

【lucene】SpanNearQuery中的slop

在`SpanNearQuery`中,`slop`的定义比你描述的稍微复杂一些。以下是一些更准确的解释和分析: 1. `slop`的定义 `SpanNearQuery`的`slop`参数指的是两个`SpanTermQuery`(或更一般的`SpanQuery`子句)之间允许的最大“不匹配位置”的数量。具体来说: - 不匹配位置:指的是第…

sqli-labs通关笔记-第64关 GET数值型SQL盲注(双括号闭合 130次探测机会)

目录 一、代码审计 1、源码分析 2、SQL注入风险分析 &#xff08;1&#xff09;联合SQL注入方法&#xff08;不可行&#xff09; &#xff08;2&#xff09;报错SQL注入方法&#xff08;不可行&#xff09; &#xff08;3&#xff09;总结 二、渗透实战 1、渗透准备 2…

每日一题——力扣498 对角线遍历

力扣498 对角线遍历 问题分析给定一个 m x n 矩阵&#xff0c;我们需要按照对角线顺序遍历所有元素。对角线遍历的特点是&#xff1a; 每条对角线上元素的行索引与列索引之和为常数遍历方向交替变化&#xff1a;奇数对角线&#xff08;从右上到左下&#xff09;&#xff0c;偶数…

【单例模式】

概述一个类不管创建多少次对象&#xff0c;永远只能得到该类型的一个对象的实例。常用到的比如日志模块 &#xff0c;数据库模块饿汉&#xff1a;在类加载时就创建单例对象&#xff0c;因此它是线程安全的&#xff0c;因为对象的创建在程序启动时就已经完成&#xff0c;不存在多…

Unity开发如何实现换装技术

一、3D换装方案SkinnedMeshRenderer组件替换&#xff08;最常用&#xff09;适用场景&#xff1a;角色需要保持骨骼动画&#xff0c;更换服装/武器等实现步骤&#xff1a;1.准备模型&#xff1a;所有服装需使用相同骨骼结构&#xff08;建议在建模软件中绑定到同一套骨骼&#…

RabbitMQ面试精讲 Day 29:版本升级与平滑迁移

【RabbitMQ面试精讲 Day 29】版本升级与平滑迁移 在“RabbitMQ面试精讲”系列的第29天&#xff0c;我们聚焦于一个在中高级系统架构与运维面试中极具分量的话题——RabbitMQ的版本升级与平滑迁移。随着业务发展和RabbitMQ自身功能演进&#xff08;如从经典集群到Quorum队列、从…