ssm-day03 aoptx

AOP

AOP指的是面向对象思想编程问题的一些补充和完善

soutp、soutv

解耦通俗理解就是把非核心代码剥出来,减少对业务功能代码的影响

设计模式是解决某些特定问题的最佳解决方案,后面一点要记得学这个!!!

cxk唱跳哈哈哈哈好损

相当于两家不同的中介公司

ProxyFactory factory = new ProxyFactory(new CalculatorLogImpl()); 详解这行代码

这行代码使用了Spring框架中的org.springframework.aop.framework.ProxyFactory类来创建一个代理对象。代理模式是面向切面编程(AOP, Aspect-Oriented Programming)中常用的一种设计模式,它允许在不修改目标对象代码的情况下,向其添加额外的行为或逻辑。

让我们详细分解一下这行代码:

ProxyFactory factory = new ProxyFactory(new CalculatorLogImpl());
  • ProxyFactory:这是Spring AOP包提供的一个工厂类,用于创建代理实例。它简化了代理的创建过程,并且提供了对JDK动态代理和CGLIB代理的支持。选择哪种代理方式取决于传递给ProxyFactory构造函数的对象类型。如果这个对象实现了接口,那么通常会使用JDK动态代理;如果没有实现任何接口,则会使用CGLIB代理。

  • new CalculatorLogImpl():这里创建了一个CalculatorLogImpl类型的实例,并将其作为参数传递给了ProxyFactory的构造函数。CalculatorLogImpl应该是你定义的一个实现了某些业务逻辑的类,可能还实现了某个接口(比如Calculator)。通过将这个实例传递给ProxyFactory,你可以为这个具体的业务逻辑类创建一个代理对象。

当你创建了ProxyFactory实例后,你可以进一步配置代理的行为,例如添加拦截器(advisors、interceptors)来定义横切关注点(如日志记录、事务管理等),然后调用getProxy()方法来获取最终的代理对象。下面是一个完整的例子,展示了如何为CalculatorLogImpl添加日志记录功能:

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
import org.springframework.aop.MethodBeforeAdvice;

// 假设Calculator是一个接口,而CalculatorLogImpl实现了这个接口
public class Example {
    public static void main(String[] args) {
        // 创建目标对象
        CalculatorLogImpl target = new CalculatorLogImpl();

        // 创建代理工厂
        ProxyFactory factory = new ProxyFactory(target);

        // 定义一个前置通知(Before Advice),用于在方法执行前打印日志
        MethodBeforeAdvice loggingAdvice = (method, args1, target1) -> {
            System.out.println("Executing method: " + method.getName());
        };

        // 创建一个Advisor,它将loggingAdvice应用到特定的方法上
        NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor();
        advisor.setAdvice(loggingAdvice);
        advisor.setMappedNames("add", "subtract");  // 只对"add"和"subtract"方法生效

        // 将Advisor添加到代理工厂
        factory.addAdvisor(advisor);

        // 获取代理对象
        Calculator proxy = (Calculator) factory.getProxy();

        // 使用代理对象调用方法
        proxy.add(5, 3);  // 输出: Executing method: add
        proxy.subtract(10, 4);  // 输出: Executing method: subtract
    }
}

在这个例子中,我们做了以下几件事:

  1. 创建了CalculatorLogImpl的目标对象。
  2. 使用ProxyFactory为该目标对象创建了一个代理工厂。
  3. 定义了一个简单的MethodBeforeAdvice,它会在目标方法执行之前打印一条消息。
  4. 创建了一个NameMatchMethodPointcutAdvisor,它将上述的MethodBeforeAdvice应用到名为addsubtract的方法上。
  5. Advisor添加到ProxyFactory中。
  6. 通过factory.getProxy()方法获取代理对象。
  7. 使用代理对象调用addsubtract方法,触发前置通知的日志记录行为。

通过这种方式,你可以在不改变CalculatorLogImpl原有代码的基础上,为其方法调用添加额外的行为,如日志记录、性能监控、安全性检查等。这种做法使得代码更加模块化和易于维护。

匿名内部类

OOP面向对象编程不能做到方法的局部修改,AOP可以完善

将多个不同类的相同点交叉起来

AOP就是解决非核心代码冗余问题

很吓人的比 喻

框架是一个技术的集合体

又一个很搞笑的比喻

aop功能也是基于ioc容器中的对象才能进行代理

在取值的时候直接用接口去取,因为后面在ioc容器中的就是实现类的“兄弟”代理类了,而不是实现类

几个插入位置 几个方法

增强也要放在ioc容器里面 @Component

@Aspect 说明它是一个切面

配置类形式 两种方式都行

导包的时候记得是到aspectj下的包

切点表达式作用:选中目标方法,所以它就是字符串的一个格式,通过这个格式匹配方法

统一为部分模糊、字打错了

这种不推荐

只要是跟spring功能有关系的类都要加IOC容器注解@Component

推荐用这种,方便维护

之前的JoinPoint joinPoint可以获取目标方法的信息,但是不能执行目标方法

环绕通知中的两个都可以

环绕通知一定要抛异常,方便拿到异常信息

切点+增强=切面

主要还是使用注解进行AOP的配置

场景一解决:根据id值指定获取

tx

所谓的声明式事务就是对编程式事务的一个封装

spring的事务管理就是对AOP的继承封装

类似游戏机插卡式

事务管理器:存放了事务的实现代码,最后交给spring的tx

 

比较 jdbc, dbutils, jdbcTemplate, mybatis, 和 hibernate,我们可以从以下几个方面进行对比:功能、使用场景、复杂度、性能、学习曲线等。

功能

  1. JDBC:

    • 功能: JDBC(Java Database Connectivity)是Java平台的标准数据库访问接口,提供了基本的数据库连接和操作功能。
    • 使用场景: 适用于直接操作数据库的简单应用。
  2. DBUtils:

    • 功能: Apache Commons DBUtils 是一个简化JDBC操作的工具包,提供了更简洁的数据库操作方法。
    • 使用场景: 适用于需要简化JDBC操作的场景,减少代码量。
  3. JdbcTemplate:

    • 功能: Spring框架中的JdbcTemplate是Spring提供的一个简化JDBC操作的类,提供了更高级的错误处理和资源管理。
    • 使用场景: 适用于使用Spring框架的应用,提供更高级的数据库操作支持。
  4. MyBatis:

    • 功能: MyBatis 是一个半自动化的持久层框架,支持SQL语句的编写,提供了对象关系映射(ORM)功能。
    • 使用场景: 适用于需要高性能且灵活控制SQL语句的应用。
  5. Hibernate:

    • 功能: Hibernate 是一个全自动化的持久层框架,提供了完整的ORM功能,可以将Java对象直接映射到数据库表。
    • 使用场景: 适用于需要高度抽象和简化数据库操作的复杂应用。

使用场景

  • JDBC: 直接操作数据库,适用于简单的数据库操作。
  • DBUtils: 简化JDBC操作,适用于需要减少代码量的场景。
  • JdbcTemplate: 适用于使用Spring框架的应用,提供更高级的数据库操作支持。
  • MyBatis: 适用于需要高性能且灵活控制SQL语句的应用。
  • Hibernate: 适用于需要高度抽象和简化数据库操作的复杂应用。

复杂度

  • JDBC: 相对简单,但需要手动管理资源和错误处理。
  • DBUtils: 简化了JDBC操作,但仍然需要手动编写SQL。
  • JdbcTemplate: 提供了更高级的错误处理和资源管理,但需要学习Spring框架。
  • MyBatis: 提供了ORM功能,但需要手动编写SQL,复杂度适中。
  • Hibernate: 提供了全自动化的ORM功能,复杂度较高,但可以大大简化数据库操作。

性能

  • JDBC: 性能直接取决于SQL语句的优化。
  • DBUtils: 性能与JDBC类似,但减少了代码量。
  • JdbcTemplate: 性能与JDBC类似,但提供了更好的资源管理。
  • MyBatis: 性能较高,因为可以手动优化SQL语句。
  • Hibernate: 性能取决于ORM映射的效率,通常比手动SQL略低。

学习曲线

  • JDBC: 学习曲线较低,但需要了解数据库操作的基本知识。
  • DBUtils: 学习曲线较低,但需要了解DBUtils的API。
  • JdbcTemplate: 学习曲线适中,需要了解Spring框架。
  • MyBatis: 学习曲线适中,需要了解SQL语句和MyBatis的配置。
  • Hibernate: 学习曲线较高,需要了解ORM概念和Hibernate的配置。

总结

  • JDBC: 最基础的数据库操作接口,适用于简单的应用。
  • DBUtils: 简化了JDBC操作,适用于需要减少代码量的场景。
  • JdbcTemplate: 适用于使用Spring框架的应用,提供更高级的数据库操作支持。
  • MyBatis: 提供了高性能且灵活控制SQL语句的功能,适用于需要高性能的应用。
  • Hibernate: 提供了全自动化的ORM功能,适用于需要高度抽象和简化数据库操作的复杂应用。

这段代码定义了一个 Spring 配置类 JavaConfig,它使用了 Java 配置(基于注解)来配置Spring容器中的Bean。具体来说,这段代码实现了数据库连接池(Druid)和 JdbcTemplate 的实例化,并且通过 @PropertySource 注解加载外部的属性文件来设置数据库连接信息。让我们逐行解析这段代码:

1. 包声明与导入

package com.atguigu.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
  • package com.atguigu.config;:指定了这个类所在的包。
  • import 语句:导入了必要的类和接口,包括 Druid 数据源、Spring 的配置注解以及 JdbcTemplate

2. 类声明与注解

@Configuration
@ComponentScan("com.atguigu")
@PropertySource("classpath:jdbc.properties")
public class JavaConfig {
  • @Configuration:标记这个类为一个配置类,表示它可以包含用于创建Spring应用上下文的@Bean方法。
  • @ComponentScan("com.atguigu"):告诉Spring在com.atguigu包及其子包中自动扫描并注册组件(如带有@Component@Service@Repository@Controller等注解的类)。这使得你可以无需显式地用@Bean注解来定义这些组件。
  • @PropertySource("classpath:jdbc.properties"):指示Spring从类路径下的jdbc.properties文件中加载属性值,这样就可以在代码中通过@Value注解来引用这些属性。

3. 属性注入

    @Value("${atguigu.driver}")
    private String driver;
    @Value("${atguigu.url}")
    private String url;
    @Value("${atguigu.username}")
    private String username;
    @Value("${atguigu.password}")
    private String password;
  • @Value("${...}"):用于将@PropertySource加载的属性值注入到字段中。这里的${}语法允许你引用jdbc.properties文件中的键值对。例如,${atguigu.driver}会替换为jdbc.properties文件中atguigu.driver对应的值。

4. 定义 DataSource Bean

    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
  • @Bean:标记这是一个Bean定义方法,Spring将会调用这个方法来创建并管理返回的对象作为Spring容器中的一个Bean。
  • DruidDataSource:这是阿里云提供的高性能连接池实现。在这个方法中,我们创建了一个DruidDataSource实例,并设置了它的基本属性,如驱动类名、URL、用户名和密码,这些都是从前面注入的属性中获取的。
  • return dataSource;:最后返回配置好的数据源对象,它会被Spring容器管理,并可以在其他地方通过依赖注入的方式获得。

5. 定义 JdbcTemplate Bean

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
  • @Bean:同样标记这是一个Bean定义方法。
  • JdbcTemplate:这是Spring框架提供的一个简化JDBC操作的类。在这里,我们创建了一个JdbcTemplate实例,并通过构造函数参数注入了之前定义的DataSource Bean。然后我们设置了JdbcTemplate的数据源,并返回这个对象。
  • jdbcTemplate.setDataSource(dataSource);:将数据源设置给JdbcTemplate,以便它可以使用这个数据源来执行SQL查询和更新操作。

总结

这段代码的主要作用是配置Spring应用程序的两个核心Bean:一个是DataSource,负责管理数据库连接;另一个是JdbcTemplate,提供了一种更简便的方式来执行JDBC操作。通过这种方式,开发者可以避免编写大量的重复代码,并且能够更加方便地管理和操作数据库。此外,通过使用@PropertySource@Value注解,数据库连接信息被外部化到了jdbc.properties文件中,这不仅提高了代码的可维护性,也便于在不同环境中进行配置管理。

真没听懂!!

回滚就代表事务不修改

隔离级别越高、影响程度越低、数据越安全

脏读:一个事务读取另外一个事务未提交的数据

不可重复读:一个事务读取另外一个事务提交的修改的数据

幻读:一个事务读取另外一个事务提交的插入的数据

mysql默认是第三个

截图软件Snipaste

记注解!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…

数据仓库的性能问题及解决之道

随着数据量不断增长和业务复杂度逐渐攀升,数据处理效率面临巨大挑战。最典型的表现是面向分析型场景的数据仓库性能问题越来越突出,压力大、性能低,查询时间长甚至查不出来,跑批跑不完造成生产事故等问题时有发生。当数据仓库出现…

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日,云和恩墨(北京)信息技术有限公司(以下简称:云和恩墨)的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司(以下简称:华为云)的 GaussDB 数据库完成了兼容性互…

分布式专题(4)之MongoDB快速实战与基本原理

一、MongoDB介绍 1.1 什么是MongoDB MongoDB是一个文档数据库(以JSON为数据模型),由C语言编写,旨在为WEB应用提供可扩展的高性能存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富&#xf…

03篇--二值化与自适应二值化

二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…

Linux下redis环境的搭建

1.redis的下载 redis官网下载redis的linux压缩包,官网地址:Redis下载 网盘链接: 通过网盘分享的文件:redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…

印闪网络:阿里云数据库MongoDB版助力金融科技出海企业降本增效

客户背景 上海印闪网络科技有限公司,于2017年1月成立,投资方包括红杉资本等多家国际知名风投公司。公司业务聚焦东南亚普惠金融,常年稳居行业头部。创始团队来自腾讯,中国团队主要由运营、风控及产研人员组成,核心成员…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”:深入剖析与误区澄清 引言 在与大语言模型(LLM)交互时,“prompt”(提示符)这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入,决定了模型的…

【解决】Vue配置了端口号 发布项目仍会改变

1 梗概 这里记录Vue配置了端口号,npm run serve 发布运行仍会选择其他端口,一般是配置的端口号1 2 解决方案 网上有些教程说是由于 portfonder 版本问题,需要降低版本,可能这个的确是个解决方案。 还有说在package.json 中配置 &q…

uniapp-在windows上IOS真机运行(含开发证书申请流程)

前期准备 1、Itunes [Windows 32位 iTunes]下载地址、所有版本的iTunes下载地址 [Windows 64位 iTunes]下载地址、所有版本的iTunes下载地址 2、爱思助手 https://www.i4.cn/ 3、typeC转Usb接口 (物理意义的设备接口) 4、Mac电脑(用来生成证书&am…

网络层分析

网络访问层仍受到传输介质的性质和相关适配器的设备驱动程序的影响很大。网络层与网络适配器的硬件性质几乎是完全分离的。为什么是几乎呢?该层不仅负责发送和接受网络数据,还负责在彼此不直接连接的系统之间转发和路由分组。查找最佳路由并选择适当的网…

罗技键鼠更换新台式机无蓝牙通过接收器安装

优联驱动下载: http://support.logitech.com.cn/zh_cn/software/unifying (下载安装后按照步骤一步步操作,匹配后即可使用) 向京东客服反馈后提供的驱动下载安装连接 有问题欢迎评论沟通~

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》

《Keras3 minist 手写数字AI模型训练22秒精度达到:0.97》 一、修改源码加上如下两条代码二、源码修改如下三、Keras3 minist 训练22秒结束,训练过程截图四、Keras3 minist 源码截图 一、修改源码加上如下两条代码 import os os.environ["KERAS_BAC…

装饰模式的理解和实践

在软件设计中,设计模式提供了一种可复用的解决方案,用于解决常见的设计问题。装饰模式(Decorator Pattern),也称为包装模式(Wrapper Pattern),是结构型设计模式之一。它通过一种对客…

游戏引擎学习第43天

仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步,探索运动方程,了解真实世界中的物理,并调整它们,以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟,而是找到最有趣…

Maven(生命周期、POM、模块化、聚合、依赖管理)详解

Maven构建项目的生命周期 在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试,部署等工作,这个过程就是项目构建的生命周期。虽然大家都在不停的做构建工作&…

第六届地博会开幕,世界酒中国菜美食文化节同期启幕推动地标发展

第六届知交会暨地博会开幕,辽黔欧三地馆亮点纷呈,世界酒中国菜助力地理标志产品发展 第六届知交会暨地博会盛大开幕,多地展馆亮点频出,美食文化节同期启幕推动地标产业发展 12月9日,第六届粤港澳大湾区知识产权交易博…

通过“思维链”提升ChatGPT提示词质量,更好的辅助学术论文

目录 1.写在开头 2.思维链是啥 1.写在开头 对于初步接触AIGC工具的宝子们,可以直接用最符合你习惯的方式去使用Kimi、ChatGPT这类AI工具。想到什么问题就问什么。对于比较简单直接的问题,不需要去想怎么写好提示词,直接在聊天窗口里表述你…

nacos bootstrap.yml 和 spring.config.import 加载配置的流程区别

相关依赖 springboot:2.7.15 nacos:2.2.3 bootstrap.yml加载方式 加载流程如下图所示 从图中可以看出,: 1.bootstrap.yml 的加载是在 BootstrapApplicationListener.onApplicationEvent 接收到 ApplicationEnvironmentPreparedEventEvent 事件后另起一个 Sprin…

高效项目托管指南:从本地到 GitHub 的完整流程

在现代软件开发中,将项目托管在 GitHub 上是一个常见且高效的方式。GitHub 不仅可以用作版本控制工具,还能帮助你与团队协作或展示自己的项目。本文将带你一步步完成项目的打包和上传。 高效项目托管指南:从本地到 GitHub 的完整流程 1. 准备…