spring的核心配置
Spring框架的核心配置主要包括以下几个方面:
依赖注入(Dependency Injection, DI)
依赖注入是Spring的核心特性之一,它通过将依赖(如对象、服务等)注入到组件中,实现了组件间的松耦合。
常见的依赖注入方式:
-
构造器注入(Constructor Injection)
java复制
public class Car {private Engine engine;public Car(Engine engine) {this.engine = engine;} }在Spring配置文件中:
xml复制
<bean id="engine" class="com.example.Engine"/> <bean id="car" class="com.example.Car"><constructor-arg ref="engine"/> </bean> -
Setter注入(Setter Injection)
java复制
public class Car {private Engine engine;public void setEngine(Engine engine) {this.engine = engine;} }在Spring配置文件中:
xml复制
<bean id="engine" class="com.example.Engine"/> <bean id="car" class="com.example.Car"><property name="engine" ref="engine"/> </bean> -
字段注入(Field Injection)
java复制
public class Car {@Autowiredprivate Engine engine; }此方式不推荐用于核心组件,因为它会破坏测试和代码的可读性。
基于XML的配置
这是Spring最传统的配置方式,通过XML文件定义Bean和其他配置。
xml复制
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个Bean --><bean id="userService" class="com.example.UserService"/><!-- 定义另一个Bean,并注入依赖 --><bean id="userController" class="com.example.UserController"><property name="userService" ref="userService"/></bean>
</beans>
基于注解的配置
这是一个更现代的方式,通过Java注解(如@Component, @Service, @Repository, @Autowired等)来定义和配置Bean。
java复制
// 使用@Component注解定义一个Bean
@Component
public class UserService {// ...
}// 使用@Autowired注解注入依赖
@Service
public class UserController {@Autowiredprivate UserService userService;
}
在主程序或配置类中启用注解扫描:
java复制
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {// ...
}
Spring Boot的自动配置
Spring Boot通过自动配置(如@EnableAutoConfiguration)简化了Spring框架的使用。
java复制
@SpringBootApplication // 启用自动配置、组件扫描和配置文件
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
配置类(Java-Based Configuration)
通过Java类(配合@Configuration注解)来配置Bean,这是一种类型安全的方式。
java复制
@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}@Beanpublic UserController userController(UserService userService) {UserController controller = new UserController();controller.setUserService(userService);return controller;}
}
配置文件(如application.properties或application.yml)
用于存储应用程序的配置参数,支持多种格式和环境配置。
application.properties示例:
properties复制
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
application.yml示例:
yaml复制
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secret
AOP(面向切面编程)
Spring支持通过AOP实现横向业务逻辑的抽取(如日志、事务等)。
定义切面:
java复制
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Method " + joinPoint.getSignature().getName() + " is executing.");}
}
事务管理
Spring支持声明式事务管理(基于注解或XML配置)。
基于注解的事务管理:
java复制
@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public void saveUser(User user) {userRepository.save(user);}
}
基于XML的事务管理:
xml复制
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="get*" read-only="true"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="userServicePointcut" expression="execution(* com.example.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointcut"/>
</aop:config>
总结
Spring的核心配置主要围绕依赖注入、配置方式(XML、注解、Spring Boot自动配置、Java配置类)、AOP、事务管理等展开。通过合理配置,可以构建灵活、可维护的企业级应用。
相关文章:
spring的核心配置
Spring框架的核心配置主要包括以下几个方面: 依赖注入(Dependency Injection, DI) 依赖注入是Spring的核心特性之一,它通过将依赖(如对象、服务等)注入到组件中,实现了组件间的松耦合。 常见…...
leetcode:942. 增减字符串匹配(python3解法)
难度:简单 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中: 如果 perm[i] < perm[i 1] ,那么 s[i] I 如果 perm[i] > perm[i 1] ,那么 s[i] D 给定一个字符串 s ࿰…...
【智驭未来】使用Deepseek进行业务系统集成场景分析
DeepSeek已经出来了一段时间,各系统厂商纷纷加入对他的支持行列,有使用他来进行数据智能预测分析的,有使用他来进行系统知识智能问答的,有进行多语言处理和文档智能解析的,也有开发工具支持AI代码生成的。根据厂商产品…...
探秘Transformer系列之(3)---数据处理
探秘Transformer系列之(3)—数据处理 接下来三篇偏重于工程,内容略少,大家可以当作甜点 _。 0x00 概要 有研究人员认为,大模型的认知框架看起来十分接近卡尔弗里斯顿(Karl Friston)描绘的贝叶斯大脑。基于贝叶斯概率…...
cesium视频投影
先看效果 使用cesium做视频投影效果,而且还要跟随无人机移动而移动,我现在用定时器更新无人机的坐标来实现效果具体代码如下: 1、CesiumVideo3d.js(某个cesium技术群大佬分享的) // import ECEF from "./CoordinateTranslate"; le…...
[算法学习笔记]1. 枚举与暴力
一、枚举算法 定义 枚举是基于已有知识来猜测答案的问题求解策略。即在已知可能答案的范围内,通过逐一尝试寻找符合条件的解。 2. 核心思想 穷举验证:对可能答案集合中的每一个元素进行尝试终止条件:找到满足条件的解,或遍历完…...
Burp Suite基本使用(web安全)
工具介绍 在网络安全的领域,你是否听说过抓包,挖掘漏洞等一系列的词汇,这篇文章将带你了解漏洞挖掘的热门工具——Burp Suite的使用。 Burp Suite是一款由PortSwigger Web Security公司开发的集成化Web应用安全检测工具,它主要用于…...
RabbitMQ 3.12.2:单节点与集群部署实战指南
前言:在当今的分布式系统架构中,消息队列已经成为不可或缺的组件之一。它不仅能够实现服务之间的解耦,还能有效提升系统的可扩展性和可靠性。RabbitMQ 作为一款功能强大且广泛使用的开源消息中间件,凭借其高可用性、灵活的路由策略…...
【故障处理】- 11G expdp导出缓慢 + Streams AQ: enqueue blocked on low memory等待事件
【故障处理】- 11G expdp导出缓慢 Streams AQ: enqueue blocked on low memory等待事件 一、概述二、故障原因三、解决方法 一、概述 该问题的数据库版本是11.2.0.4,执行expdp导出的时候,小表导出非常缓慢,同时有Streams AQ: enqueue blocke…...
mac相关命令
显示和隐藏usr等隐藏文件文件 terminal输入: defaults write com.apple.Finder AppleShowAllFiles YESdefaults write com.apple.Finder AppleShowAllFiles NO让.bashrc每次启动shell自动生效 编辑vim ~/.bash_profile 文件, 加上 if [ -f ~/.bashrc ]; then. ~/.bashrc fi注…...
30 款 Windows 和 Mac 下的复制粘贴软件对比
在日常电脑操作中,复制粘贴是极为高频的操作,一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件,并对比它们的优缺点,同时附上官网下载地址,方便大家获取软件。 Pa…...
MYSQL下载安装及使用
MYSQL官网下载地址:https://downloads.mysql.com/archives/community/ 也可以直接在服务器执行指令下载,但是下载速度比较慢。还是自己下载好拷贝过来比较快。 wget https://dev.mysql.com/get/Downloads/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 1…...
《仙台有树》里的馅料(序)
《仙台有树》一起追剧吧(二):馅料合集概览 ●德爱武美玩,全面发展 ●猜猜我是谁&真假美清歌 ●失忆的风还是吹到了仙台 ●霸道师徒强制收&你拜我,我拜你,师徒徒师甜蜜蜜 ●霸道总裁强制爱 ●仙台有…...
C语言题目:链表数据求和操作
题目描述 读入10个复数,建立对应链表,然后求所有复数的和。 输入格式 无 输出格式 无 样例输入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1 1 样例输出 2323i 代码功能概述 createNode 函数: 创建一个包含 10 个复数节点的链表。 每个…...
如何在不依赖函数调用功能的情况下结合工具与大型语言模型
当大型语言模型(LLM)原生不支持函数调用功能时,如何实现智能工具调度?本文通过自然语言解析结构化输出控制的方法来实现。 GitHub代码地址 核心实现步骤 定义工具函数 使用tool装饰器声明可调用工具: from langcha…...
统信服务器操作系统V20 1070A 安装docker新版本26.1.4
应用场景: 硬件/整机信息:x86平台、深信服超融合平台 OS版本信息:统信V20 1070a 1.获取docker二进制包 链接: https://pan.baidu.com/s/1SukBlra0mQxvslTfFakzGw?pwd5s5y 提取码: 5s5y tar xvf docker-26.1.4.tgz groupadd docker ch…...
【Linux】文件系统:文件fd
🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.回顾C文件接口02.系统文件I/O02.1 openflags 参数(文件打开模式)标记位传参1. 访问模式(必须指定一个)2. 额外控制标志…...
电脑系统损坏,备份文件
一、工具准备 1.U盘:8G以上就够用,注意会格式化U盘,提前备份U盘内容 2.电脑:下载Windows系统并进行启动盘制作 二、Windows启动盘制作 1.微软官网下载启动盘制作工具微软官网下载启动盘制作工具https://www.microsoft.com/zh-c…...
View Binding小记
View Binding 1.简介 View Binding 是 Android 开发中的一项功能,它允许开发者以类型安全的方式直接访问布局文件中的视图,而无需使用 findViewById View Binding 生成的绑定类中的字段类型与布局文件中的视图类型完全一致,避免了 findVie…...
Python网络运维自动化:从零开始学习NetDevOps
零基础入门NetDevOps,让网络运维更简单、更高效。 Python网络运维自动化 1.从理论到实战:从基础理论入手,通过实战案例教学,手把手教读者掌握Python网络运维自动化,解决运维工作中的日常问题,提升运维效率…...
公网远程家里局域网电脑过程详细记录,包含设置路由器。
由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…...
网络安全示意图 网络安全路线图
其实网络安全本身的知识点并不算难,但需要学的东西比较多,如果想要从事网络安全领域,肯定是需要系统、全面地掌握清楚需要用到的技能的。 自学的方式基本是通过看视频或者相关的书籍,不论是什么方法,都是很难的&#…...
【多线程异步和MQ有什么区别?】
多线程异步和MQ有什么区别? 多线程异步MQ(消息队列)多线程异步与MQ的区别多线程异步 概念: 多线程异步是指在单个应用程序内部创建和管理多个线程,这些线程并行处理任务。 多线程主要用于提升应用程序的性能,特别是在处理计算密集型任务(如科学计算、图像处理、数据分…...
Annie导航2.0 新增加5个模版 开源免授权
新增5个模版 修复部分模版样式问题 采用最新技术tinkphp8.0 php8.1 mysql5.7 Funadmin框架 后台一键式统计访问人数 网站设置 分类设置 网站管理 工具管理 友情链接 广告管理 [color=var(–comiis-color)]联系方式 主题管理 配置多套模版随意切换 已更新市面上热门的几个模版...
Spring AI发布!让Java紧跟AI赛道!
1. 序言 在当今技术发展的背景下,人工智能(AI)已经成为各行各业中不可忽视的重要技术。无论是在互联网公司,还是传统行业,AI技术的应用都在大幅提升效率、降低成本、推动创新。从智能客服到个性化推荐,从语…...
一个简洁高效的Flask用户管理示例
Flask-Login 是 Flask 的用户管理扩展,提供 用户身份验证、会话管理、权限控制 等功能。 适用于: • 用户登录、登出 • 记住用户(“记住我” 功能) • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…...
HTML之JavaScript Form表单事件
HTML之JavaScript Form表单事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…...
[文末数据集]ML.NET库学习010:URL是否具有恶意性分类
文章目录 ML.NET库学习010:URL是否具有恶意性分类项目主要目的和原理项目概述主要功能和步骤总结数据集地址ML.NET库学习010:URL是否具有恶意性分类 项目主要目的和原理 项目主要目的: 本项目的目的是通过分析URL的特征,构建一个机器学习模型来判断给定的URL是否具有恶意…...
百度地图接入DeepSeek技术解析:AI如何重塑地图搜索体验?
百度地图接入DeepSeek技术解析:AI如何重塑地图搜索体验? 百度地图接入DeepSeek技术解析:AI如何重塑地图搜索体验?引言一、技术背景与核心能力1.1 DeepSeek的技术优势1.2 百度地图API的技术底座 二、技术实现路径2.1 系统架构设计2…...
C语言——深入理解指针(2)(数组与指针)
文章目录 数组名的理解使用指针访问数组一维数组传参的本质冒泡排序二级指针指针数组指针数组模拟二维数组 数组名的理解 之前我们在使用指针访问数组内容时,有这样的代码: int arr[10]{1,2,3,4,5,6,7,8,9,10}; int* p&arr[0];这里我们使用&ar…...
