spring基本使用

news2025/1/17 4:52:01

文章目录

  • 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>

获取注入的对象:

    @Test
    public 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>

获取对象:

    @Test
    public 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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://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

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

(4) 注解注入

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

查看注入是否成功:

    @Test
    public 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 {
    
}

通过配置文件获取:

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

(6) 第三方bean配置

在配置文件中配置bean:

    @Bean
    public 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) 编写测试类测试

    @Test
    public 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;
    }
}

测试运行:

    @Test
    public 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.coloradmin.cn/o/1622916.html

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

相关文章

JAVASE8中基本数据类型

本篇文章基于有过一部分的C语言基础的&#xff0c;还望大家理解 在进入到学习之前我们必须要清楚的是在JAVASE中数据类型与C语言中的数据类型基本上是相同的,接下来我们先来对8中数据类型进行简要介绍&#xff0c;他们分别是&#xff1a; 如果大家之前了解过C语言那么对于基本数…

【FP7208-RGBWY五路调光方案】 单节锂电池LED升压恒流驱动调光芯片FP7208,PWM内部转模拟调光,无频闪顾虑低亮无抖动

文章目录 方案背景 二、RGBWY五路调光调色芯片FP7208 1.芯片参数 2.单颗芯片五路调光应用原理 调光调色信号注意事项&#xff1a; 3.五路调光应用电路图DEMO实物图 4.RGBWY调光调色详解 总结 方案背景 近年来随着技术的不断进步&#xff0c;越来越多的产品需要适应小型化和便携…

系统试运行报告(上线运行报告Word原件2024)

一、试运行目的 软件项目试运行的主要目的是在实际应用环境中对软件系统进行全面检验&#xff0c;确保其满足设计要求和用户需求&#xff0c;同时发现和解决潜在的问题&#xff0c;为正式投入使用做好准备。通过试运行&#xff0c;我们可以&#xff1a; 验证软件系统的稳定性…

ONES 功能上新|ONES Wiki 新功能一览

支持在 ONES Wiki 页面中使用分栏进行横向排版&#xff0c;丰富排版方式&#xff0c;帮助用户以更丰富的版式展示内容。 应用场景&#xff1a; 页面的布局对内容的阅读有很大的影响。当页面中有图文混排的需求时&#xff0c;可以通过分栏来组织页面结构&#xff0c;以更清晰、更…

LabVIEW学习记录 - 实时显示时间

LabVIEW操作 - 实时显示时间 在程序框图&#xff0c;选择函数->定时->格式化日期/时间字符串 该函数的使用手册说明&#xff1a; 鼠标选择“格式化日期/时间字符串”->创建->输入控件->输入格式 查看时间代码格式&#xff1a; 编程->定时->获取时间日…

cad中快速计算多个矩形面积的方法

1、输入命令reg&#xff0c;选中矩形创建面域 2、输入命令uni,选中刚刚创建的面域&#xff0c;组合成一个面域 3、输入命令&#xff1a;LI &#xff0c;选中面域&#xff0c;即可查看面积和周长 需注意的一点&#xff0c;开始创建的矩形或者多段线要在一个面内&#xff0c;就是…

word常用的文件格式有哪些?word格式文件删除了怎么恢复

在数字文档处理的世界中&#xff0c;Microsoft Word以其丰富的格式选项和强大的编辑功能赢得了广大用户的青睐。但与此同时&#xff0c;误删或丢失Word格式文件的情况也时有发生。本文将深入探讨Word常用的文件格式有哪些&#xff0c;同时分享如何恢复误删的Word文件&#xff0…

浏览器的工作原理

参考&#xff1a;渲染页面&#xff1a;浏览器的工作原理 - Web 性能 | MDN (mozilla.org) Web 性能 | MDN (mozilla.org) Web性能影响因素 首先有两个&#xff0c;一个是网络延迟&#xff0c;一个是大部分情况下浏览器都是单线程执行的 保障页面快速加载的最大威胁是网络延迟…

MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

文章目录 前言2 核心功能2.1 条件构造器2.1.1 Wrapper2.1.2 QueryWrapper2.1.3 UpdateWrapper2.1.4 LambdaQueryWrapper 2.2 自定义SQL2.2.1 基本用法2.2.2 多表关联 2.3 Service接口2.3.1 IService2.3.1.1 save2.3.1.2 remove2.3.1.3 update2.3.1.4 get2.3.1.5 list2.3.1.6 co…

主成分分析PCA原理以及特征

一、PCA原理 原始数据 x ∈ R N x\in R^N x∈RN&#xff0c;经过PCA投影后的数据 y A x &#xff0c; y ∈ R P yAx&#xff0c;y\in R^P yAx&#xff0c;y∈RP 其中&#xff0c; A ∈ R P N A\in R^{P\times N} A∈RPN 二、PCA特征 1、降低数据的维度 2、提取数据的特征…

imx6ull----IIC--AP3216C

概念 IIC总共有两条线&#xff0c;一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S&#xff0c;快速模式下可以达到 400Kb…

嵌入式Linux driver开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

Postman 工具发送请求的技巧与实践

在开发和测试 API 时&#xff0c;发送 JSON 格式的请求是一个常见需求。 在 Postman 中构建和发送 JSON 请求 创建一个新的请求 首先&#xff0c;在 Postman 启动界面上找到并点击 “New” 按钮&#xff0c;选择 “HTTP Request” 来开始新建一个请求。这一步骤允许你定义请…

解决office2016专业增强版 “你的许可证并非正版,你可能是盗版软件的受害者“

问题描述&#xff1a;安装完office后,用kms已经激活成功&#xff0c;但是一直在上面显示“你的许可证不是正版&#xff0c;并且你可能是盗版软件的受害者&#xff0c;使用正版Office,避免干扰并保护你的文件安全。” 尝试过网上的各种方法都没用&#xff0c;后面发现是用的HEU …

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 引入外部css/js代码编辑器的使用Handler 方法使用介绍Style 用法示例LifeCycle 生命周期介绍 数据模型方…

2024年航空航天与工业技术国际学术会议(IACAIT 2024)

2024年航空航天与工业技术国际学术会议(IACAIT 2024) 2024 International Conference on Aerospace and Industrial Technology 一、【会议简介】 2024年航空航天与工业技术国际学术会议&#xff0c;将汇集全球顶尖专家&#xff0c;探讨前沿技术。 这次会议主题为“航空航天与…

idea - 配置模板消息

这是要用到的模板代码 " $DATE$ 自定义表示参数&#xff0c;后续会定义参数的值" " $END$ 表示应用该模板后&#xff0c;光标的位置"/**** author lyj* date $DATE$*/Testpublic void test$END$(){}这是配置完之后&#xff0c;输入test然后回车&#xff0c…

如何使用 Dolphin Anty 设置代理

文章目录 Dolphin Anty是什么? 为什么要使用代理? 使用 Dolphin Anty 浏览器设置 Smartdaili 代理 与动态住宅代理集成 与数据中心代理集成 Dolphin Anty 中的配置 Smartdaili 代理与 Dolphin Anty 反检测浏览器 Dolphin Anty 和 Smartdaili 代理服务可帮助你增强数字身份保护…

LearnOpenGL(五)之变换

一、缩放&#xff08;Scaling&#xff09; 把缩放变量表示为 (S1,S2,S3)&#xff0c; 将任意向量 (x,y,z) 定义一个缩放矩阵&#xff0c;缩放公式&#xff1a; 二、位移 和缩放矩阵一样&#xff0c;在44矩阵上有几个特别的位置用来执行特定的操作&#xff0c;对于位移来说它们…

IDEA安装JAVA_HOME报错、启动界面卡死的解决方案

1、起因 在使用一段时间社区版的IDEA后&#xff0c;发现有些功能无法正常使用&#xff0c;于是打算安装正版旗舰版IDEA&#xff08;狗头&#xff09;。 2、JAVA_HOME报错 结果发现安装完后&#xff0c;经过一段操作&#xff0c;IDEA无法正常启动&#xff0c;报错如下&#x…