spring基本使用

news/2024/5/19 20:43:29

文章目录

  • 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.mrgr.cn/p/35447046

相关文章

第三章:Memory Consistency Motivation and Sequential Consistency

chapter3:内存为什么需要consistency和顺序 Consistency 本章深入研究内存 consistency 模型,这些模型为程序员和实现者定义了共享内存系统的行为。这些模型定义了行为正确性,以便程序员知道期望什么,实现者知道提供什么。 1、共享内存行为存在的问题要了解为什么必须定义共…

sql_mode=only_full_group_by以及ANY_VALUE()

MySQL报错:sql_mode=only_full_group_by解决方法-- 查询自定义变量 sql_mode SELECT @sql_mode; -- 查询系统变量 sql_mode(会话变量) SELECT @@sql_mode; -- 查询当前会话变量 SELECT @@SESSION.sql_mode; -- 查询全局变量 select @@GLOBAL.sql_mode;SET @@SESSION.sql_mod…

Matlab软件使用教学

1. Matlab简介 Matlab&#xff08;Matrix Laboratory的缩写&#xff09;是一种由MathWorks公司开发的数值计算和可视化编程环境。它广泛应用于工程、科学研究、数学和教育等领域&#xff0c;因其强大的计算能力和丰富的工具箱而受到青睐。 2. 安装与启动 安装&#xff1a;从M…

Chartist.js饼图

基础代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/…

模拟集成电路设计系列博客——6.1.1 电阻串DAC

6.1.1 电阻串DAC 最直接的实现\(N-bit\) D/A转换器的方式是产生\(2^N\)个参考信号,并根据数字输入码,将合适的信号传递到输出。我们将这种D/A转换器成为基于解码器的转换器。 最早的8-bit集成MOS D/A转换器是基于通过一个开关网络选择一部分分段电阻串[Hamade,1978]。开关网络…

STM32单片机C语言模块化编程实战:LED控制详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 之前介绍了很多关于点灯的方法&#xff0c;比如…

Vetur cant find `tsconfig.json` or `jsconfig.json` in *****报错

解决Vscode报错 [Vetur can‘t find ‘tsconfig.json‘ or ‘jsconfig.json‘]报错原因翻译一下报错信息,"Vetur找不到tsconfig.json文件或者jsconfig.json文件". 首先Vetur只会扫描项目的根目录下的jsconfig或者tsconfig,如果没有这两个文件之一,就会报错. 如果你是…

Chartist.js条形图(三)

响应配置代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/l…

RoadBEV:鸟瞰图中的道路表面重建

1. 代码地址 GitHub - ztsrxh/RoadBEV: Codes for RoadBEV: road surface reconstruction in Birds Eye View 2. 摘要 本文介绍了RoadBEV&#xff1a;鸟瞰图中的道路表面重建。道路表面条件&#xff08;特别是几何形状&#xff09;极大地影响了自动驾驶汽车的驾驶性能。基于…

Acer宏碁掠夺者战斧300笔记本电脑PH315-52工厂模式原装Win10系统安装包 恢复出厂开箱状态 带恢复重置

宏碁掠夺者PH315-52原厂Windows10工厂包镜像下载&#xff0c;预装oem系统 链接&#xff1a;https://pan.baidu.com/s/1grmJzz6nW1GOaImY_ymXGw?pwdi286 提取码&#xff1a;i286 原厂W10系统自带所有驱动、PredatorSense风扇键盘控制中心、Office办公软件、出厂主题壁纸、系统…

nc扫描端口只显示开放端口号

需求:扫描 10.20.80.100 这台主机,10-1000端口范围内,哪些端口号是开放状态nc -vz 10.20.80.100 10-1000 2>&1 | grep succeeded

Chartist.js条形图(二)

多行标签代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/l…

容器操作

3. 数据管理 3.1 数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UnionFS,可以提供很多有用的特性:数据卷 可以在容器之间共享和重用 对 数据卷 的修改会立马生效 对 数据卷 的更新,不会影响镜像 数据卷 默认会一直存在,即使容器被删除注意:数据卷 的使用…

http忽略ssl认证

我们在发请求时&#xff0c;会遇到需要ssl证书验证的报错&#xff0c;针对该错误以及所使用的不同的创建连接的方式&#xff0c;进行ssl证书忽略 忽略SSL证书的流程 简介&#xff1a;需要告诉client使用一个不同的TrustManager。TrustManager是一个检查给定的证书是否有效的类…

Sealos 云主机正式上线,便宜,便宜,便宜!

我们基于 Sealos 云开发的能力,仅用三天时间就上线 Sealos 的云主机能力,现在不太懂容器的同学也可以在 Sealos 上开心的使用虚拟机了,本文先说 Sealos 云主机的优势,再聊聊我们是怎么这么快实现上线的,以及为什么我们要做这件事。目前只有广州可用区(腾讯云)上线了云主…

邮件安全不容忽视,教你如何防止邮件泄密!

邮件作为企业日常沟通的重要工具,却也是信息泄露的高风险环节。为了确保邮件传输的安全,可以通过集成华企盾DSC数据防泄密系统来增强邮件的安全性。下面是如何利用华企盾DSC系统防止邮件泄密的一些建议:使用邮件白名单功能:您可以设置邮件白名单,确保敏感文件只能发送到授…

k8s calico vxlan式详解

之前的文章讲了k8s ipip模式的使用以及流量路径&#xff0c;本篇文章主要是来讲解一下vxlan 模式下pod 流量是如何通信的。 一、ipip模式转vxlan 修改calico backend参数 将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp 修改calico controllers的configmap…

Python升级打怪(5)

链式调用:用一个函数的返回值作为另外一个函数参数 嵌套调用:一个函数在另一个函数定义里面&#xff0c;而调用该定义函数既可以使用在其里面的函数 在Pycharm中调试器的左下角能够看到函数之间的"调用栈" 调用栈里面描述了当前这个代码的函数之间&#xff0c;调用…

Chartist.js折线图(四)

线插值/平滑代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script></head><body><div class="ct-chart…

Yolov5 export.py实现onnx模型的导出

查了很多资料&#xff0c;很多用python代码写的&#xff0c;只需要这个库那个库的&#xff0c;最后都没成功。 不如直接使用Yolov5里面的 export.py实现模型的转换。 一&#xff1a;安装依赖 因为yolov5里面的requirments.txt是将这些转换模型的都注释掉了 所以需要解除注释…