spring基本使用

文章目录

  • 1. ioc(Inversion of Control) | DI(Dependency Injection)
    • (1) maven坐标导包
    • (2) 编写配置文件bean.xml
    • (3) 配置bean
    • (4) 配置文件注入属性
  • 2. DI(dependency injection) 依赖注入(setter)其他属性
    • (1) 对象属性注入
    • (2) 数组属性输入
    • (3) 集合属性注入
    • (4) map集合注入
    • (5) 构造器注入
    • (6) 自动装配
  • 3. 注解定义bean和依赖注入
    • (1) 开启注解扫描功能(配置文件)
    • (2) 声明bean和注入属性
    • (3) 获取bean
    • (4) 注解注入
    • (5) 配置类代替配置文件
    • (6) 第三方bean配置
  • 4. AOP(Aspect Oriented Programming)面向切面编程
    • (1) 依赖导入
    • (2) 编写切面类
    • (3) 开启对aop的支持和注解扫描
    • (4) 编写测试类测试
    • (5) 插入点表达式
    • (6) 通知方法
      • 前置通知Before
      • 后置通知(AfterReturning)
      • 环绕通知(Around)
      • 异常后通知(AfterThrowing)
      • 最终通知(AfterAdvice)

1. ioc(Inversion of Control) | DI(Dependency Injection)

(1) maven坐标导包

  <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.22</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

(2) 编写配置文件bean.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"></beans>

(3) 配置bean

在bean.xml配置文件的中配置bean

<bean id="stu" class="com.xjy.pojo.student">
</bean>

获取注入的对象:

    @Testpublic void test1(){ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");student stu = context.getBean(student.class);stu.setName("小明");stu.setAge(18);stu.setGender('男');System.out.println(stu);}

(4) 配置文件注入属性

 <bean id="stu" class="com.xjy.pojo.student"><property name="name" value="小慧慧"></property><property name="age" value="18"></property><property name="gender" value=""></property></bean>

获取对象:

    @Testpublic void test1(){ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");student stu = context.getBean(student.class);System.out.println(stu);}

2. DI(dependency injection) 依赖注入(setter)其他属性

(1) 对象属性注入

    <bean id="address" class="com.xjy.pojo.Address"><property name="province" value="云南"></property><property name="city" value="昆明"></property><property name="specificPosition" value="云南大学"></property></bean><bean id="stu" class="com.xjy.pojo.student"><!--对象属性注入--><property name="address" ref="address"></property</bean>

(2) 数组属性输入

    <bean id="stu" class="com.xjy.pojo.student"><!--对象属性注入--><property name="address" ref="address"></property><!--数组属性数组--><property name="grades"><array><value>90</value><value>70</value><value>60</value></array></property></bean>

查看结果:
在这里插入图片描述

(3) 集合属性注入

        <!--list属性注入--><property name="course"><list><value>语文</value><value>数学</value><value>英语</value></list></property>

(4) map集合注入

        <!-- map集合注入--><property name="girlfriend"><map><entry key="小诗诗" value="温柔可爱灵力大方"></entry></map></property>

(5) 构造器注入

声明构造方法:

    public student(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}

声明bean(构造方法的参数需要和注入参数一一对应)

    <bean id="stu" class="com.xjy.pojo.student"><constructor-arg name="name" value="小诗诗"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg><constructor-arg name="gender" value=""></constructor-arg></bean>

(6) 自动装配

    <bean id="address" class="com.xjy.pojo.Address"><property name="province" value="云南"></property><property name="city" value="昆明"></property><property name="specificPosition" value="安宁"></property></bean><!--这里配置了自动装配,会到ioc中找是否有对应类型的bean,常用还可按照名称装配(byname)--><bean id="stu" class="com.xjy.pojo.student" autowire="byType"><!--对象属性注入-->
<!--        <property name="address" ref="address"></property>--></bean>

3. 注解定义bean和依赖注入

(1) 开启注解扫描功能(配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启注解扫描--><context:component-scan base-package="com.xjy.pojo"></context:component-scan><!--加载配置文件使用${}属性占位符引用配置文件属性--><context:property-placeholder location="jdbc.properties"/>
</beans>

(2) 声明bean和注入属性

@Component("address")   // 声明bean
@PropertySource("jdbc.properties") // 配置文件读取
public class Address {@Value("云南")   // 注入属性(可以使用${}引用配置文件属性)private String province;@Value("昆明")private String city;@Value("安宁")private String specificPosition;
}

(3) 获取bean

    @Testpublic void testAddressBean(){ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");Address address = (Address) ctx.getBean("address");System.out.println(address);}

(4) 注解注入

	// 可以配合@Qualifier("名称")进行指定注入@Autowiredprivate Address address;   

查看注入是否成功:

    @Testpublic void testStudent(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");student bean = context.getBean(student.class);System.out.println(bean);}

(5) 配置类代替配置文件

编写配置类:

@Configuration		// 相当于配置文件
@ComponentScan("com.xjy.pojo")   //相当于包扫描
public class beanConfig {}

通过配置文件获取:

    @Testpublic void test1(){ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(beanConfig.class);Address add = context.getBean(Address.class);System.out.println(add);}

(6) 第三方bean配置

在配置文件中配置bean:

    @Beanpublic ArrayList<String> stu(){return new ArrayList<>();}

4. AOP(Aspect Oriented Programming)面向切面编程

(1) 依赖导入

    <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.22</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.19</version></dependency>

(2) 编写切面类

@Component      // 将该类声明为bean
@Aspect         // 声明该类为切面类
public class stuAspect {@After("execution(* com.xjy.pojo.student.*(..))")  // 后置通知,->切入点表达式表示插入方法public void getCurrent(JoinPoint joinPoint){Class<? extends JoinPoint> aClass = joinPoint.getClass();System.out.println(aClass+"执行结束");}
}

(3) 开启对aop的支持和注解扫描

@Configuration
@EnableAspectJAutoProxy     // 开启aop的支持
@ComponentScan({"com.xjy.pojo","com.xjy.aspect"})// 扫描注解包
public class beanConfig {
}

(4) 编写测试类测试

    @Testpublic void stuTest() throws InterruptedException {ApplicationContext context = new AnnotationConfigApplicationContext(beanConfig.class);student stu = context.getBean(student.class);stu.getSum();}

(5) 插入点表达式

execution(修饰符 返回值 方法全限定名(方法参数) 异常类型)例如: (所有修饰符,所有返回值,com.examle.service中的所有类所有方法,所有参数)
execution(* com.example.service.*.*(..))

(6) 通知方法

前置通知Before

在目标方法执行前执行的通知。可以通过定义@Before注解的方法实现

后置通知(AfterReturning)

在目标方法成功执行后执行的通知。可以通过定义@AfterReturning注解的方法实现。

环绕通知(Around)

在目标方法执行前后都可以执行的通知,而且可以控制目标方法的执行。可以通过定义@Around注解的方法实现

@Component      // 将该类声明为bean
@Aspect         // 声明该类为切面类
public class stuAspect {@Pointcut("execution(* com.xjy.pojo.student.*(..))")public void cut(){}@Around("cut()")  // 前置通知,->切入点表达式表示插入方法public int getCurrent(ProceedingJoinPoint joinPoint) throws Throwable {long pre = System.currentTimeMillis();int result = (int) joinPoint.proceed();long end = System.currentTimeMillis();System.out.println(end-pre+"执行完毕");return result;}
}

测试运行:

    @Testpublic void stuTest() throws InterruptedException {ApplicationContext context = new AnnotationConfigApplicationContext(beanConfig.class);student stu = context.getBean(student.class);int sum = stu.getSum();System.out.println(sum);}

异常后通知(AfterThrowing)

在目标方法抛出异常时执行的通知。可以通过定义@AfterThrowing注解的方法实现

最终通知(AfterAdvice)

无论目标方法是否正常执行完成(包括正常返回或抛出异常),都会执行的通知。可以通过定义@After注解的方法实现。

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

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

相关文章

如何提交已暂存的更改到本地仓库?

文章目录 如何提交已暂存的更改到本地Git仓库&#xff1f;步骤1&#xff1a;确认并暂存更改步骤2&#xff1a;提交暂存的更改到本地仓库 如何提交已暂存的更改到本地Git仓库&#xff1f; 在Git版本控制系统中&#xff0c;当你对项目文件进行修改后&#xff0c;首先需要将这些更…

TCP协议数据传输过程及报文分析

目录 TCP数据的传输过程 建立连接&#xff08;三次握手&#xff09; 第一次握手 第二次握手 第三次握手 总结 数据传输 断开连接&#xff08;四次挥手&#xff09; 第一次挥手 第二次挥手 第三次挥手 第四次挥手 总结 最后 TCP数据的传输过程 TCP&#xff08;Tra…

SL3043耐压120V降压恒压 降48V 降24V 降12V 降5V 大电流10V芯片

SL3043是一款外驱MOSFET管可设定输出电流的降压型开关稳压器&#xff0c;具有以下特点&#xff1a; 1. 宽工作电压范围&#xff1a;SL3043可以在10V至120V的宽输入电压范围内工作&#xff0c;这使得它适用于多种不同的电源环境。 2. 大输出电流&#xff1a;该芯片能够提供最大…

五年Python从业者,谈谈Python的一些优缺点

前言 Python它是作为年轻的血液&#xff0c;融入到编程语言这个大家庭里面&#xff0c;作为具有年轻人的蓬勃朝气的python&#xff0c;那它同时就会有年轻人的桀骜焦躁。 今天就来谈谈Python的一些优缺点。 先从优点说起&#xff0c;我是把它分为5部分。 1.简单————Pyth…

Win11和WinRAR取消折叠菜单恢复经典菜单

这里写目录标题 前言1. Win11恢复经典右键菜单1.1 修改前1.2 恢复成经典右键菜单1.3 修改后1.4 想恢复怎么办&#xff1f; 2. WinRAR取消折叠菜单恢复经典菜单2.1 修改前2.2 修改恢复为经典菜单2.3 修改后2.4 想恢复怎么办&#xff1f; 前言 最近换回了Windows电脑&#xff0c…

大模型微调之 使用 LLaMA-Factory 微调 Llama3

大模型微调之 使用 LLaMA-Factory 微调 Llama3 使用 LLaMA Factory 微调 Llama-3 中文对话模型 安装 LLaMA Factory 依赖 %cd /content/ %rm -rf LLaMA-Factory !git clone https://github.com/hiyouga/LLaMA-Factory.git %cd LLaMA-Factory %ls !pip install "unsloth…

在Spring Boot应用中实现阿里云短信功能的整合

1.程序员必备程序网站 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 2.导入坐标 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.0</version></dependency><…

Redis面试题二(数据存储)

目录 1.redis 的数据过期策略 1. 惰性删除&#xff08;Lazy Expiration&#xff09; 2. 定期删除&#xff08;Periodic Expiration&#xff09; 3. 定时删除&#xff08;Timing-Based Expiration&#xff09; 实际应用中的组合策略 2.redis 有哪些内存淘汰机制 volatile&…

GhostNetV3:探索紧凑模型的训练策略

文章目录 摘要1、引言2、相关工作2.1、紧凑模型2.2、训练CNN的技巧包 3、预备知识4、训练策略4.1、重参数化4.2、知识蒸馏4.3、学习调度4.4、数据增强 5、实验结果5.1、重参数化5.2、知识蒸馏5.3、学习策略5.4、数据增强5.5、与其他紧凑模型的比较5.6、扩展到目标检测 6、结论 …

redis和mysql数据一致性方案

请求 A 更新数据 请求B读数据 在高并发情况下&#xff0c;A、B请求过程步骤相互穿插&#xff0c;就会出现图中的问题。 期望redis 的数据是11&#xff0c;最后变成了10 场景&#xff1a;先删除Redis&#xff0c;再更新 MySQL&#xff0c;不主动更新Redis&#xff0c;访问redi…

#ESP32S3R8N8建立工程(VSCODE)

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果

2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

No system certificates available. Try installing ca-certificates.

一、错误重现 Certificate verification failed: The certificate is NOT trusted. No system certificates available. Try installing ca-certificates. 具体如图 系统环境是ubuntu:22.04 ARM架构 二、解决方法 1、先不要更换镜像源 直接设置 apt update apt -y instal…

创新实训2024.04.24日志:RAG技术初探

1. 什么是RAG技术 RAG is short for Retrieval Augmented Generation。结合了检索模型和生成模型的能力&#xff0c;以提高文本生成任务的性能。具体来说&#xff0c;RAG技术允许大型语言模型&#xff08;Large Language Model, LLM&#xff09;在生成回答时&#xff0c;不仅依…

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming&#xff0c;也就是面向切面编程&#xff0c;是一种思想。它是针对OOP(面向对象编程)的一种补充&#xff0c;是对某一类事情的集中处理。比如一个博客网站的登陆验证功能&#xff0c;在用户进行新增、编辑、删除博…

算法设计优化——有序向量二分查找算法与Fibonacci查找算法

文章目录 0.概述1.语义定义2. 二分查找&#xff08;版本A&#xff09;2.1 原理2.2 实现2.3 复杂度2.4 查找长度 3.Fibonacci查找3.1 改进思路3.2 黄金分割3.3 实现3.4 复杂度分析3.5 平均查找长度 4. 二分查找&#xff08;版本B&#xff09;4.1 改进思路4.2 实现4.3 性能4.4 进…

YOLOv8常见水果识别检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff08;常见水果识别&#xff08;yolov8模型&#xff0c;从图像、视频和摄像头三种路径识别检测&#xff09;_哔哩哔哩_bilibili&#xff09; 资源包含可视化的水果识别检测系统&#xff0c;可识别图片和视频当中出现的六类常见的水果&#xff0c;包括&#xf…

【redis】非关系型数据库——Redis介绍与安装(windows环境)

目录 数据库架构的演化单体架构缓存(Memcached)MySQL集群缓存(Memcached可以)MySQL集群垂直拆分&#xff08;主从复制&#xff0c;读写分离&#xff09;缓存(Redis)MySQL集群垂直拆分分库分表 NoSQLNoSQL产生的背景性能需求MySQL的扩展性瓶颈方面什么是NoSQLNoSQL的特点主流的N…

下级平台级联EasyCVR视频汇聚安防监控平台后,设备显示层级并存在重复的原因排查和解决

视频汇聚平台/视频监控系统/国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时…

C语言进阶|单链表的实现

✈链表的概念和结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增加几节。…