【Spring -02学习】

news2024/11/25 14:24:45

Spring 笔记记录

    • 1. spring整合mybatis 注解开发
    • 2. spring整合junit
    • 3. IOC底层核心原理
      • 3.1 层次结构
      • 3.2 组件扫描器
      • 3.3 自定义导入器
      • 3.4 自定义注册器
      • 3.5 bean初始化过程解析
    • 4.AOP配置
      • 4.1 AOP核心概念
      • 4.2 AOP入门案例
        • 4.2.1 XML方式
        • 4.2.2 注解方式
      • 4. 3 切入点的三种形式
      • 4.4 五种通知类型
      • 4.5 通知顺序
      • 4.6 通知获取参数数据
      • 4.7 利用AOP测接口执行时间
    • 5. 静态代理 装饰着模式
    • 6. 动态代理
    • 7. cglib--动态代理
    • 8. AOP织入时机
    • 9 Spring对事物的管理
      • 9.1 Spring事务核心对象
      • 9.2 PlatformTransactionManager
      • 9.3 TranasactionDefinition
      • 9.4 TranasactionStatus
      • 9.5 事务控制方式
        • 1. 编程式
        • 2.声明式xml
        • 3.声明式 注解

1. spring整合mybatis 注解开发

在这里插入图片描述

1.引入依赖
 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>
    </dependencies>
    2.resources下编写properties文件,用于连接数据库
    jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false
jdbc.username=root
jdbc.password=root
3.使用注解@PropertySource引入数据库配置文件,使用注解@Bean创建DruidDataSource
@PropertySource("classpath:jdbc.properties")
public class JDBCConfig {
    @Value("${jdbc.driver}")
    private String Driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Bean("dataSource")
    public DruidDataSource getDataSource(){
        DruidDataSource ds=new DruidDataSource();
        ds.setDriverClassName(Driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return  ds;
    }
}
4.使用注解@Bean创建SqlSessionFactoryBeanMapperScannerConfigurer ,分别用来配置数据源和扫描实体类bean以及mapper映射文件
public class MyBatisConfig {
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){
        SqlSessionFactoryBean sessionFactoryBean=new SqlSessionFactoryBean();
        sessionFactoryBean.setTypeAliasesPackage("com.zfz.bean");
        sessionFactoryBean.setDataSource(dataSource);
        return sessionFactoryBean;
    }
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
        MapperScannerConfigurer msc=new MapperScannerConfigurer();
        msc.setBasePackage("com.zfz.mapper");
        return msc;
    }
}
5.使用以下注解引入上述两个配置,并指明spring扫描基础包
@Configuration
@ComponentScan("com.zfz")
@Import({JDBCConfig.class,MyBatisConfig.class})
public class SpringConfig {
}
6.写dao层接口
public interface AccountMapper {
    @Insert("    insert into account(name, money)\n" +
            "        values (#{name}, #{money})")
    void save(Account account);
    @Delete("  delete\n" +
            "        from account\n" +
            "        where id = #{id}")
    void delete(Integer id);
    @Update(" update account\n" +
            "        set name=#{name},\n" +
            "            money=#{money}\n" +
            "        where id = #{id}")
    void update(Account account);
    @Select("      select *\n" +
            "        from account")
    List<Account> findAll();
    @Select("    select *\n" +
            "        from account\n" +
            "        where id = #{id}")
    Account findById(Integer id);
}
7.service层接口
public interface AccountService {
    void save(Account account);
    void delete(Integer id);
    void update(Account account);
    List<Account> findAll();
    Account findById(Integer id);
}
8.service实现及注入dao

@Service("accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountDao;

    @Override
    public void save(Account account) {
        accountDao.save(account);
    }

    @Override
    public void delete(Integer id) {
        accountDao.delete(id);
    }

    @Override
    public void update(Account account) {
        accountDao.update(account);
    }

    @Override
    public List<Account> findAll() {
        return accountDao.findAll();
    }

    @Override
    public Account findById(Integer id) {
        return accountDao.findById(id);
    }
}
9.测试
public class AccountApp {
    public static void main(String[] args) {
        ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService accountService = (AccountService) ctx.getBean("accountService");
        List<Account> all = accountService.findAll();
        for (Account account : all) {
            System.out.println(account);
        }
        DruidDataSource dataSource = (DruidDataSource) ctx.getBean("dataSource");

        System.out.println(dataSource);
    }
}

输出成功:
在这里插入图片描述

2. spring整合junit

在这里插入图片描述
在这里插入图片描述
使用注解开发

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {SpringConfig.class})
public class AccountServiceTest {
    @Autowired
    private AccountService accountService;
    @Test
    public void findById(){
        Account byId = accountService.findById(1);
        Assert.assertEquals("Mike",byId.getName());
    }
}

3. IOC底层核心原理

3.1 层次结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 组件扫描器

在测试中排除非自己写的bean,只需要能够加载启动自己方法的bean,其他的排除;比如我只测试dao层或者service层接口,但是我不需要让他们整个都跑,只需要排除即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 自定义导入器

应用场景:当bean很多很多时,需要自己写导入器加载bean
在这里插入图片描述
在这里插入图片描述
自定义导入器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 自定义注册器

为了明白ComponentScan注解的作用
在这里插入图片描述

3.5 bean初始化过程解析

在这里插入图片描述
在这里插入图片描述
问题又来了:其中一个bean加载需要干很多事情,这个时候FcatoryBean来了
在这里插入图片描述
在这里插入图片描述

4.AOP配置

在这里插入图片描述
在这里插入图片描述

4.1 AOP核心概念

  1. 不论是接口中的方法还是实现的方法都叫连接点
    在这里插入图片描述
  2. 能被抽走共性功能的方法叫切入点
    在这里插入图片描述
  3. 通知 指的是被抽走共性功能以后剩下的代码
    在这里插入图片描述
  4. 切面指的就是 共性代码从哪里被抽走的 与非共性代码(通知)之间的关系
    在这里插入图片描述
  5. 被简化出来的运行对象叫 目标对象,这个目标对象需要被抽走的共性代码才能运行
    在这里插入图片描述
  6. 原始的共性代码放回到目标功能中的过程叫做织入
    在这里插入图片描述
  7. 目标对象类变成的心得类的过程–>叫做代理
    在这里插入图片描述
  8. 现在得到的类现在的类根据之前目标对象的类创建出来的东西都有,但是还可以无中生有,引入新的东西,这个代理类可以凭空出现,这个动作叫引入
    在这里插入图片描述
    在这里插入图片描述
    开发中需要做的是绿色的东西:
    在这里插入图片描述
    在这里插入图片描述

4.2 AOP入门案例

4.2.1 XML方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.导入依赖
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
2.把共性功能抽离出来,写到一个类中
这里是接口实现的一句话抽取
    @Override
    public void save() {
//        System.out.println("共性功能");
        System.out.println("userService running");
    }        
3. 写抽取的代码,制作通知类,在类中定义一个方法用于完成共性功能
public class AopAdvice {
    public  void function(){
        System.out.println("共性功能");
    }
}
4.这时候spring还不知道这之间的关系,现在做配置,将上面抽离出的共性功能类配置成一个bean,然后开启aop的命名空间支持,然后配置AOP
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启命名空间-->
<bean id="userService" class="com.zfz.service.impl.UserServiceImpl">
</bean>
<!--    配置通知bean-->
<bean id="myAdvice" class="com.zfz.aop.AopAdvice"></bean>
<!--配置aop-->
    <aop:config>
<!--        配置切入点-->
        <aop:pointcut id="pt" expression="execution(* *..*(..))"/>
<!--        配置切面(切入点与通知的关系)-->
        <aop:aspect ref="myAdvice">
            <aop:before method="function" pointcut-ref="pt"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

4.2.2 注解方式

在这里插入图片描述

1.@EnableAspectJAutoProxy 开启注解配置
@Configuration
@ComponentScan("com.zfz")
@EnableAspectJAutoProxy
public class SpringConfig {
}
2.切面类配置
@Component
@Aspect
public class AopAdvice {
    @Pointcut("execution(* *(..))")
    public void pt(){
    }
    @Before("pt()")
    public  void before(){
        System.out.println("共性功能");
    }
}

4. 3 切入点的三种形式

在这里插入图片描述

在这里插入图片描述

4.4 五种通知类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 通知顺序

不论是前置还是后置,配置顺序就是它的基本顺序
在这里插入图片描述

4.6 通知获取参数数据

方式一:
在这里插入图片描述
方式二:
在这里插入图片描述
=
只有这两种一定有返回值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.7 利用AOP测接口执行时间

在这里插入图片描述

5. 静态代理 装饰着模式

@Component("userService")
public class UserServiceImpl implements UserService {

    @Override
    public void save() {
//        System.out.println("共性功能");
        System.out.println("水泥墙");
    }
}
public class decorator implements UserService{
    private UserService userService;

    public decorator(UserService userService){
        this.userService=userService;
    }
    @Override
    public void save() {
        userService.save();
        System.out.println("刮大白");
    }
}

在这里插入图片描述

6. 动态代理

在这里插入图片描述
在这里插入图片描述

public class UserServiceProxy {
    public  static UserService getServiceProxy( UserService userService){
        UserService service = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
                new Class[]{UserService.class}, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object invoke = method.invoke(userService, args);
                        System.out.println("刮大白22");
                        System.out.println("贴壁纸22");
                        return invoke;
                    }
                });
        return service;
    }
}
public class App {
    public static void main(String[] args) {
        UserService userService=new UserServiceImpl();
        UserService userService1=UserServiceProxy.getServiceProxy(userService);
        userService1.save();
    }
}

7. cglib–动态代理

动态字节码文件
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. AOP织入时机

在这里插入图片描述

9 Spring对事物的管理

在这里插入图片描述
在这里插入图片描述

9.1 Spring事务核心对象

在这里插入图片描述
在这里插入图片描述

9.2 PlatformTransactionManager

在这里插入图片描述

9.3 TranasactionDefinition

在这里插入图片描述

9.4 TranasactionStatus

在这里插入图片描述

9.5 事务控制方式

实现案例:
在这里插入图片描述

业务层实现:主要是转钱的接口实现,要么都成功要么都失败

1. 编程式

在这里插入图片描述

   public void transfer(String outName, String inName, Double money) {
        PlatformTransactionManager ptm = new DataSourceTransactionManager(dataSource);
        TransactionDefinition td = new DefaultTransactionDefinition();
        TransactionStatus ts = ptm.getTransaction(td);
        accountMapper.inMoney(outName, money);
        int i = 1 / 0;
        accountMapper.outMoney(inName, money);
        //提交事务
        ptm.commit(ts);
    }

2.声明式xml

通知类:
在这里插入图片描述
在这里插入图片描述

3.声明式 注解

记得开:@EnableAspectJAutoProxy
@Configuration
@ComponentScan("com.zfz")
@EnableAspectJAutoProxy
@Import({JDBCConfig.class,MybatisConfig.class})
public class SpringConfig {
}
//通知类
@Component
@Aspect
public class AdviceT {
    @Autowired
    private DataSource dataSource;
    @Pointcut("execution(* *transfer(..))")
    public void pt(){}
    @Around("pt()")
    public Object test(ProceedingJoinPoint joinPoint) throws Throwable {
        PlatformTransactionManager ptm = new DataSourceTransactionManager(dataSource);
        TransactionDefinition td = new DefaultTransactionDefinition();
        TransactionStatus ts = ptm.getTransaction(td);
        Object proceed = joinPoint.proceed();
        ptm.commit(ts);
        return proceed;
    }
}

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

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

相关文章

基于Python爬虫+K-means机器学习算法今日热点新闻推荐系统——热点推荐、热词呈现及个性化分析(含全部工程源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境相关库下载 模块实现1. 数据爬取2. 新闻处理与聚类3. 新闻推荐 系统测试1. 数据准备2. 文本聚类3. 热点新闻推荐 工程源代码下载其它资料下载 前言 本项目基于网络爬虫技术&#xff0c;用于爬取新闻…

01-创建项目-工具使用备忘录

创建项目 Keil5 &#xff08;编写程序工具&#xff09;生成输出hex文件 STC-ISP &#xff08;下载程序辅助工具&#xff09;辅助功能生成代码下载程序到单片机中运行 Keil5 &#xff08;编写程序工具&#xff09; 创建项目 创建好目录文件夹 选择对应芯片型号 不用自动生成启…

VMware虚拟机迁移到阿里云

1. 前言 最近公司内部研发部门有几台jenkins build机器运行在VMware平台上面&#xff0c;由于本地VMware平台底层计算资源不足导致虚拟机运行速度特别慢&#xff0c;每次版本发布都要build好久&#xff0c;而且VMware有时候计算资源不足&#xff0c;还会自动给占用资源大的机器…

nginx中的防盗链原理

一、什么是资源盗链 资源盗链是指内容不在自己服务器上&#xff0c;而通过技术手段&#xff0c;绕过别人的限制&#xff0c;将别人的内容&#xff0c;比如热门的图片放到自己页面上&#xff0c;展示给用户&#xff0c;以此来盗取别人网站的流量&#xff0c;即蹭流量。 简而言…

Mybatis【Map传参与模糊查询】

使用 Map 传参 当我们的实体类或者对应的数据库表的字段过多时&#xff0c;应当考虑使用Map&#xff01; 我们之前通过对象传递参数来实现增改时&#xff0c;是通过传递对象做参数 来实现的&#xff1a; 我们在测试类中调用接口中的方法后&#xff0c;UserMapper.xml 会自动根…

阿里云短信发送接口实现

使用阿里云短信接口发送验证码 1. 引入依赖 springboot 工程引入web 引入 lombok 关键代码引入 <!--阿里云短信服务--> <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.23<…

记录一次重装windows11没有WiFi驱动的排错错误示范

机器是自己组装的台式机&#xff1a; 查看主板的幸好&#xff0c;机箱我是没看懂&#xff0c;然后台式机 bios或者 msinfo32都可以查看 显示&#xff1a; 如下的页面进行查询&#xff1a; 下载 windows的驱动程序和工具包&#xff0c;结果显示华硕官网没有对应的驱动&#xf…

在线Markdown编辑器

一直在寻找一款好用的在线Markdown编辑器&#xff0c;但是好像没有比较知名的简洁的&#xff0c;寻思自己赶紧搞一个&#xff0c;于是找了项目&#xff0c;手动搞了一个上线了&#xff0c;效果不错&#xff0c;特性拉满。欢迎试用 支持“标准” Markdown / CommonMark 和 Gith…

点云可视化

pcl::visualization::CloudViewer 与 pcl::visualization::PCLVisualizer的区别 pcl::visualization::CloudViewer是一个简单的点云查看器类&#xff0c;提供了一个简单的接口来在窗口中显示点云数据。它可以快速地显示点云&#xff0c;并且只需要几行代码即可实现简单的点云查…

数据结构与算法:链表、树、图、堆、散列表

1 链表 链表是线性数据结构&#xff08;数据元素之间存在着“一对一”关系&#xff09;&#xff0c;链表中的每个元素是一个包含数据data和引用字段的对象&#xff0c;引用字段只有next为单向链表&#xff0c;同时又prev和next为双向链表。 1.1 链表基本操作 链表读取第 i 个…

java集合体系结构笔记

java集合的特点&#xff1a; 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变。 单列数据&#xff1a; 双列数据&#xff1a; 单列数据集合存储实现接口Collection 双列数据集合存储实现接口Map 单列数据集合&#xff0c;数据值可重复存储实…

git杀手级功能 —— 分支管理

目录 分支介绍 创建分支 切换分支 和并分支 删除分支 合并冲突 分支管理策略 分支策略 bug分支 其他问题 强行删除临时分支 结语 分支介绍 在版本回退里发现&#xff1a;每次提交&#xff0c;git都会把它们穿成一条时间线&#xff0c;而这条时间线就可以理解为一个分支…

数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

Percona Toolkit调优神器安装与使用 Percona Toolkit安装 本文基于Percona Toolkit 3.2.0&#xff0c;理论支持所有版本。 Percona Toolkit是一款MySQL世界里面非常实用的工具套件&#xff0c;如何安装它。 Windows系统 不支持。详见https://forums.percona.com/discussion/…

vue 一直运行 /sockjs-node/info?t=解决办法

sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。 服务端&#xff1a;sockjs-node&#xff08;https://github.com/sockjs/sockjs-node&#xff09;客户端&…

短视频抖音账号矩阵系统源码开发者自研(二)

一、短视频账号矩阵系统源码开发储存集群化开发运转更快 短视频账号矩阵系统源码开发采用储存集群化开发&#xff0c;可以显著提高系统的运转速度和效率。通过优化储存结构和算法&#xff0c;系统能够更快地处理短视频账号数据&#xff0c;确保用户能够流畅地浏览和观看短视频…

6.4 原子引用

1、什么是原子引用 原子引用以cas的方式实现控制多线程之前的同步&#xff0c;从而保证多线程的安全性 原子引用主要有以下三个类 AtomicReferenceAtomicStampReferenceAtomicMarkableReference 2、demo演示 Slf4j(topic "c.Test35") public class Test35 {pub…

C++day2

一、类和结构体的区别 成员访问权限&#xff1a;类中的成员默认是私有的&#xff0c;需要使用访问修饰符&#xff08;如public、private、protected&#xff09;来显式指定访问权限。而结构体中的成员默认是公共的&#xff0c;即可以直接访问。 继承&#xff1a;类支持继承&am…

面向对象高级实战演练之银行系统

面向对象高级实战演练之银行系统 实现功能&#xff1a; 1. 银行管理员(使用管理员密码)查看所有用户信息 2. 进入银行系统提示功能 3. 用户密码管理 4. 账户开户/销户 5. 存款/取款 6. 用户间转账 7. 用户余额查询 8. 常见错误检查和提示代码实现&#xff1a; import random…

【LeetCode】动态规划 刷题训练(六)

文章目录 123. 买卖股票的最佳时机 III题目解析零笔交易一笔交易两笔交易 状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 188. 买卖股票的最佳时机 IV题目解析状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 53. 最大子数组和状态转…