Day14AOP+虚拟机基础命令笔记

第一步:先引入pom文件依赖
<!--引入aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步: 准备目标资源(想要被Aop切面处理的资源)
package com.tedu.aopdemo.aop;

/**
 * Calculator:计算器
 */
public interface Calculator {
    int add(int a, int b);
    int sub(int a, int b);
    int mul(int a, int b);
    int div(int a, int b);
}
第三步:准备目标资源的实现类
package com.tedu.aopdemo.aop;

import org.springframework.stereotype.Component;

/**
 * Calculator的实现类
 */
@Component
public class CalculatorImpl implements Calculator{
    @Override
    public int add(int a, int b) {
        int result = a + b;
        return result;
    }

    @Override
    public int sub(int a, int b) {
        int result = a - b;
        return result;
    }

    @Override
    public int mul(int a, int b) {
        int result = a * b;
        return result;
    }

    @Override
    public int div(int a, int b) {
        if(b==0){
            throw new RuntimeException("除数不能为0");
        }
        int result = a / b;
        return result;
    }
}
第四步:定义一个切面类,用于在项目业务中动态添加逻辑
@Before:用于表达该方法逻辑是在执行实际方法之前切入并运行
@AfterReturning:表示切入点为实际方法调用完毕并返回结果后调用
@After:表示是在一个方法执行完毕后。无论该方法是否抛出异常,最后都会走该切面注意该切面不能获取方法返回值
@AfterThrowing:@AfterThrowing切入点是在实际方法抛出异常后进行
@Around:@Around 切入点结合了上述几个
所有切入点通常用异常处理机制来进行即可
package com.tedu.aopdemo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import javax.naming.event.ObjectChangeListener;
import java.util.Arrays;

/**
 * 定义一个切面类,用于在项目业务逻辑中动态添加逻辑
 */
@Component//该类也需要让Spring容器管理
@Aspect//使用该注解让Spring容器知道它是一个切面类
public class SysoutAspect {
//    /*
//        @Before是切面类中的一个切入点注解,用于表达该方法逻辑是在执行实际方法之前切入并运行
//        方法中需要传入切入点的描述信息(实际切入方法的签名):
//        访问修饰符 返回值类型 方法所属的类.方法名(参数列表)
//        public int CalculatorImpl.sub(..)      这里参数列表中的".."表示任意参数
//                      ^
//           引用类型实际要写完全限定名(包名.类名)
//
//        在方法签名中可以使用"*"模糊匹配,例如:
//        public int com.tedu.aopdemo.aop.CalculatorImpl.*(..)
//                                                       ^
//                                          表示CalculatorImpl中任意方法都要切入
//     */
//    @Before("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
//    public void before(JoinPoint joinPoint) {
//        /*
//            JoinPoint 切入点
//            该类用于描述当前切面切入的方法信息,通过它我们可以得知当前切面切入的方法所属的类,
//            方法名,参数等信息
//         */
//        //切入点方法所属的对象(我们切入的是CalculatorImpl的add方法,因此target是:CalculatorImpl)
        System.out.println("target"+joinPoint.getTarget());
//        //获取切入方法信息,(Signature签名,这里表示方法签名),通过Signature获取该方法名字(.getName())
        System.out.println(joinPoint.getSignature().getName());
//        //获取切入方法的参数(实参)
        System.out.println("参数:"+ Arrays.toString(joinPoint.getArgs()));
//        //获取切入点的方法名
//        String methodName = joinPoint.getSignature().getName();
//        //获取切入点该方法所属类的名字
//        String className = joinPoint.getTarget().getClass().getSimpleName();
//        //获取切入点调用方法实际传入的参数
//        String args = Arrays.toString(joinPoint.getArgs());
//        System.out.println("开始调用"+className+"."+methodName+"(),实参为:"+args);
//    }
//
//    /*
//        @AfterReturning表示切入点为实际方法调用完毕并返回结果后调用
//        该切入点方法除了可以获取切入点信息(joinPoint),
//        还可以获取实际方法调用后返回的结果(returnValue)
//     */
//    @AfterReturning(
//            value="execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))",
//            returning="returnValue"//说明将实际方法返回值传递给下面方法的哪个参数
//    )
//    public void afterReturning(JoinPoint joinPoint, Object returnValue) {
//        String methodName = joinPoint.getSignature().getName();
//        String className = joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"()执行完毕,返回值为:"+returnValue);
//    }
//
//    /*
//        @After切入点是在一个方法执行完毕后。
//        无论该方法是否抛出异常,最后都会走该切面
//        注意该切面不能获取方法返回值
//     */
//    @After("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
//    public void after(JoinPoint joinPoint){
//        String methodName = joinPoint.getSignature().getName();
//        String className = joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"()完毕!");
//    }
//    /*
//        @AfterThrowing切入点是在实际方法抛出异常后进行
//     */
//    @AfterThrowing(
//            value = "execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))",
//            throwing = "e"//指定将实际方法抛出的异常传递给下面方法的哪个参数
//    )
//    public void AfterThrowing(JoinPoint joinPoint,Exception e){
//        String methodName = joinPoint.getSignature().getName();
//        String className = joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"()抛出异常:"+e.getMessage());
//    }

    /*
        @Around 切入点结合了上述几个
        所有切入点通常用异常处理机制来进行即可
     */
    @Around("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getName();
        String args = Arrays.toString(joinPoint.getArgs());
        //@Before里切入的逻辑写在这里
        System.out.println(className + "." + methodName+"()开始执行,参数为:"+args);

        try {
            //实际方法执行,并接收该方法的返回值
            Object returnValue = joinPoint.proceed();//CalculatorImpl.add()执行。。(实际的方法去执行)

            //@AfterReturning
            System.out.println(className + "." + methodName+"()执行完毕");
            return returnValue;
        } catch (Throwable e) {
            //@AfterThrowing
            System.out.println(className + "." + methodName+"()出现异常:"+e.getMessage());
            throw new RuntimeException(e);
        } finally {
            //@After
            System.out.println(className + "." + methodName+"()最终执行完毕");
        }

    }

}

注意传参问题!!!

下面是调用图

 
pwd 命令
pwd--- Print Working Directory
[root@localhost ~]# pwd
/root
cd 命令
cd --- Change Directory
作用:切换工作目录
格式: cd [ 目标文件夹位置 ]
绝对路径:以 / 开头的路径( /etc/subject/java
相对路径:不以 / 开头的路径,相对当前所在位置而言( etc/car/bmw
[root@localhost ~]# cd /dev #切换至/dev目录(绝对路径)
[root@localhost dev]# pwd #查看当前工作目录
/dev
[root@localhost dev]# cd / #切换至根目录(绝对路径)
[root@localhost /]# pwd #查看当前工作目录
/
[root@localhost /]# cd boot #切换至boot目录(相对路径)
[root@localhost boot]# pwd
/boot
ls 命令
ls --- List
作用:查看目录里的内容,或者查看资料是否存在
格式: ls [ 选项 ] [ 目标 ]
[root@localhost boot]# cd / #切换至根目录
[root@localhost /]# pwd #查看当前工作目录
/
[root@localhost /]# ls #查看当前工作目录下有哪些数据
[root@localhost /]# cd /root/ #切换至/root目录(绝对路径)
[root@localhost ~]# ls #查看当前工作目录下有哪些数据
[root@localhost ~]# ls /opt/ #查看/opt目录中有哪些数据
[root@localhost ~]# ls /boot/ #查看/boot目录中有哪些数据
cd 命令与 ls 命令的高级使用
cd 命令高级使用
. 表示当前目录
.. 表示父目录(也就是上一级目录)
[root@localhost ~]# cd /etc/pki/tls #切换至/etc/pki/tls目录
[root@localhost tls]# pwd #查看当前工作目录
/etc/pki/tls
[root@localhost tls]# cd .. #切换至父目录(上一级目录)
[root@localhost pki]# pwd #查看当前工作目录
/etc/pki
[root@localhost pki]# cd .. #切换至父目录(上一级目录)
[root@localhost etc]# pwd #查看当前工作目录
/etc
[root@localhost etc]# cd .. #切换至父目录(上一级目录)
[root@localhost /]# pwd #查看当前工作目录
/
[root@localhost /]# cd .. #切换至父目录(上一级目录)
[root@localhost /]#pwd #还在根目录,因为根目录没有上一级目录
/
[root@localhost etc]# cd /etc/skel/ #切换至/etc/skel目录
[root@localhost skel]# cd ../.. #切换至父目录的父目录
[root@localhost /]# pwd #查看当前所在位置
/
~ : 表示用户的家目录
/root: 管理员用户 root 的家目录
/home: 存放 普通用户家目录 的目录
5.4.2 ls 命令高级使用
常用命令选项
-l :以长格式显示(显示详细属性)
-A :包括名称以 . 开头的隐藏文档
-d :显示目录本身 ( 而不是内容 ) 的属性
-h :提供易读的容量单位 (K M)
-R :递归显示内容
[root@localhost ~]# ls -l /etc/passwd #查看/etc/passwd详细属性
[root@localhost ~]# ls -l -h /etc/passwd #显示详细属性加上易读的单位
也可以将选项写到一起(复合选项)
[root@localhost ~]# ls -lh /etc/passwd
[root@localhost ~]# ls -ld /boot/ #显示目录本身的详细属性
[root@localhost ~]# ls -A /root/ #显示目录所有数据,包括隐藏文档
[root@localhost ~]# ls -R /opt/ #递归查看/opt/目录,分目录进行显示
[root@localhost ~]# ls --help #显示ls帮助信息
其他常用命令
pwd 命令 :查看当前所在路径;
mkdir 命令
mkdir 目录名 :创建单个目录;
mkdir 目录名 1 目录名 2 目录名 3 :创建多个目录;
mkdir -p 路径 :递归 [ 逐层 ] 创建目录 ;
rm 命令
删除时,要使用相对路径删除
rm -rf 目录 1 目录 2 目录 3 :一次性删除多个目录;
rm -rf 文件 1 文件 2 目录 3 : 一次性删除多个目录或者文件;
创建文件 touch
touch 文件名 : 创建单个文件
touch 文件名 1 文件名 2 文件名 3 : 创建多个文件
复制 cp
cp 文件名 路径
cp 文件名 /root/a/a.txt
剪贴 mv
mv 文件名 路径
mv 文件名 新文件名 : 重命名
关机和重启
关机: init 0
重启: init 6
vim 编辑器
使用流程
1. vim 文件名
2. a ,进入插入模式;
3. 正常编辑文件内容;
4. ESC ,进入浏览模式;
5. Shift + : , 进入命令行模式;
6. 输入对应命令
1. wq : 保存并退出;
2. q! : 不保存直接退出 .
常见问题
强行关闭 vim 终端产生 交换文件
ls -a
rm -rf 交换文件名
Ctrl + s 隐藏终端输出
Ctrl + q 显示终端内容
vim 常见操作
设置行号:命令行模式下输入 set nu
跳转行
浏览模式下操作
首行: gg
尾行: G
指定行: nG , 比如: 100G
复制粘贴行
复制: yy 2yy 8yy
粘贴: p
撤销操作:
浏览模式下, 按 u
gedit进入浏览器查看文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值