spring boot AOP练习 @Aspect

2023-11-03

spring boot AOP练习 @Aspect

环境

		<!--  主要依赖     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

开启配置

/**
 * @author smxr
 * @date 2020/11/19
 * @time 11:11
 * @EnableAspectJAutoProxy(proxyTargetClass = true)
 * 这个为true时,则会使用 cglib 的动态代理方式;缺点:拓展类的实例用final修饰时,则无法进行织入
 * 默认使用的是jdk动态代理; 缺点:会有一点影响性能
 * 12/23:默认(proxyTargetClass = true不使用)时,当动态代理的对象是接口时,会使用jdk动态代理,如果对象是Class时使用cglib动态代理
 */
@Configuration
@EnableAspectJAutoProxy
public class ConfigBean {

    @Conditional(UserConditional.class)
    @Bean
    public User user(){
        System.out.println("张三加载中...........");
        User user = new User();
        user.setUserName("张三");
        return user;
    }
    @Conditional(UserConditional2.class)
    @Bean
    public User user2(){
        System.out.println("李四加载中...........");
        User user = new User();
        user.setUserName("李四");
        return user;
    }
}

在这里插入图片描述项目结构

@Aspect 切面类

/**
 * @author smxr
 * @date 2020/11/23
 * @time 10:33
 */
@Aspect
@Component
public class AspectUserService {
//    @Pointcut("execution( public * com.redis.service.impl.UserServiceImpl.sleep(..))")
    private void PointCut(){}
    @Before("execution(public * com.redis.service.UserService.sleep(..))")
    public void sleepBefore(JoinPoint joinPoint){
      //  System.out.println(joinPoint.toString());//输出结果:execution(void com.redis.service.impl.UserServiceImpl.sleep())
      // MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
       //String[] params = methodSignature.getParameterNames();// 获取参数名称
       //Object[] args = joinPoint.getArgs();// 获取参数值
        System.out.println("前置拦截开始了");//2
    }
    @After("execution(public * com.redis.service.UserService.sleep(..))")
    public void sleepAfter(JoinPoint joinPoint){
        System.out.println("后置拦截开始了");//4
    }
    @AfterReturning("execution(public * com.redis.service.UserService.sleep(..))")
    public void sleepAfterReturning(JoinPoint joinPoint){
        System.out.println("完成拦截开始了");//3
    }
    @AfterThrowing("execution(public * com.redis.service.UserService.sleep(..))")
    public void sleep(JoinPoint joinPoint){
        System.out.println("异常拦截开始了");
    }
    @Around("execution(public * com.redis.service.UserService.sleep(..))")
    public void sleepAround(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("前置环绕:运行......");//1
            proceedingJoinPoint.proceed();
            System.out.println("后置环绕:运行......");//5
        } catch (Throwable throwable) {
            System.out.println("环绕:运行异常......");
        }
    }
}

相关接口和实现类

/**
 * @author smxr
 * @date 2020/11/23
 * @time 10:20
 */
public interface UserService {
    public void eat();
    public void sleep();
    public void corporate_slave();
    public void speak(User user);
}

import com.redis.pojo.User;
import com.redis.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author smxr
 * @date 2020/11/23
 * @time 10:25
 */
@Service
public class UserServiceImpl implements UserService {
    @Override
    public void eat() {
        System.out.println("要去吃饭了......");
    }

    @Override
    public void sleep() {
        System.out.println("终于到了放松的时候了........");
    }

    @Override
    public void corporate_slave() {
        System.out.println("要去工作了.........");
    }

    @Override
    public void speak(User user) {
        System.out.println(user.getUserName()+"说:.......");
    }
}

测试及结果

@SpringBootTest
class SpringbootRedisApplicationTests {
    @Autowired
    UserServiceImpl userService;
    @Test
    void AOPTest(){
        userService.sleep();
    }
     -----------------------------------------------
前置环绕:运行......
前置拦截开始了
终于到了放松的时候了........
完成拦截开始了
后置拦截开始了
后置环绕:运行......

不知道有没有错,反正跑出来的顺序就这样的.

切面有参的AOP练习

AspectUserService.class

    //不关注 参数  
    @Around("execution(public * com.redis.service.UserService.speak(..))")
    public void speakAround(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("前置环绕:运行......");
            proceedingJoinPoint.proceed();
            System.out.println("后置环绕:运行......");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    //
    /*
    * 关注 参数
    * && args(user) 指定参数;要传入的参数
    * && bean(userServiceImpl) 指定要使用的容器组件名;即这个指定的(userServiceImpl)组件bean去调用,才能生效.
    */
    @Around("execution(public * com.redis.service.UserService.speak(..)) && args(user)")
    public void speakAround(ProceedingJoinPoint proceedingJoinPoint,User user){
        try {
            if (user.getUserAge()==69){
                System.out.println(user.getUserAge()+"老同志即将发言,请注意听讲!如果你大意了,就没有闪了");
            }else if (user.getUserAge()>69){
                System.out.println(user.getUserAge()+"老同志即将发言,请注意听讲!");
            }else {
                System.out.println(user.getUserName()+"的前置环绕即将说话:请注意听讲");
            }
            proceedingJoinPoint.proceed();
            if (user.getUserAge()==69){
                System.out.println(user.getUserAge()+"老同志发言完成,恭喜大家获取技能闪电五连变");
            }else {
                System.out.println(user.getUserName()+"的后置环绕完成!");
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

测试代码

    @Test
    void AOPTest1(){
        User user3 = new User();
        user3.setUserName("马老师");
        user3.setUserAge(69);
        userService.speak(user3);
        System.out.println("----------------分界线--------------------");
        User user4 = new User();
        user4.setUserName("老马");
        user4.setUserAge(80);
        userService.speak(user4);
    }
前置环绕:运行......
69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
马老师说:.......
69老同志发言完成,恭喜大家获取技能闪电五连变
后置环绕:运行......
----------------分界线--------------------
前置环绕:运行......
80老同志即将发言,请注意听讲!
老马说:.......
老马的后置环绕完成!
后置环绕:运行......
    //要注意指定的 && bean(userServiceImpl)  否则重新注入一个新的userServiceImpl2 是不能调用的
    @Autowired
    UserServiceImpl userService;

还是看下案例吧!
新注入一个userService2

@Configuration
@EnableAspectJAutoProxy
public class ConfigBean {

    @Conditional(UserConditional.class)
    @Bean
    public User user(){
        System.out.println("张三加载中...........");
        User user = new User();
        user.setUserName("张三");
        return user;
    }
    @Conditional(UserConditional2.class)
    @Bean
    public User user2(){
        System.out.println("李四加载中...........");
        User user = new User();
        user.setUserName("李四");
        return user;
    }
    @Bean
    public UserServiceImpl userService2(){
        UserServiceImpl userService2 = new UserServiceImpl();
        return userService2;
    }
}

原来的service 声明bean名字


/**
 * @author smxr
 * @date 2020/11/23
 * @time 10:25
 */
@Service(value = "userService")
public class UserServiceImpl implements UserService {
    @Override
    public void eat() {
        System.out.println("要去吃饭了......");
    }

    @Override
    public void sleep() {
        System.out.println("终于到了放松的时候了........");
    }

    @Override
    public void corporate_slave() {
        System.out.println("要去工作了.........");
    }

    @Override
    public void speak(User user) {
        System.out.println(user.getUserName()+"说:.......");
    }
}

测试及结果

@SpringBootTest
class SpringbootRedisApplicationTests {
    @Autowired
    UserServiceImpl userService;
    @Autowired
    UserServiceImpl userService2;

    @Test
    void AOPTest1(){
        User user3 = new User();
        user3.setUserName("马老师");
        user3.setUserAge(69);
        userService.speak(user3);
        System.out.println("----------------分界线--------------------");
        User user4 = new User();
        user4.setUserName("老马");
        user4.setUserAge(80);
        userService2.speak(user4);
    }

}

69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
马老师说:.......
69老同志发言完成,恭喜大家获取技能闪电五连变
----------------分界线--------------------
老马说:.......

上面的我把 无参的那个给注释掉了, 下面解开注释在跑一次

    //不关注 参数
    @Around("execution(public * com.redis.service.UserService.speak(..))")
    public void speakAround(ProceedingJoinPoint proceedingJoinPoint){
        try {
            System.out.println("前置环绕:运行......");
            proceedingJoinPoint.proceed();
            System.out.println("后置环绕:运行......");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    //
    /*
    * 关注 参数
    * && args(user) 指定参数;要传入的参数
    * && bean(userServiceImpl) 指定要使用的容器组件名;即这个指定的(userServiceImpl)组件bean去调用,才能生效.
    */
    @Around("execution(public * com.redis.service.UserService.speak(..)) && args(user)&& bean(userService)")
    public void speakAround(ProceedingJoinPoint proceedingJoinPoint,User user){
        try {
            if (user.getUserAge()==69){
                System.out.println(user.getUserAge()+"老同志即将发言,请注意听讲!如果你大意了,就没有闪了");
            }else if (user.getUserAge()>69){
                System.out.println(user.getUserAge()+"老同志即将发言,请注意听讲!");
            }else {
                System.out.println(user.getUserName()+"的前置环绕即将说话:请注意听讲");
            }
            proceedingJoinPoint.proceed();
            if (user.getUserAge()==69){
                System.out.println(user.getUserAge()+"老同志发言完成,恭喜大家获取技能闪电五连变");
            }else {
                System.out.println(user.getUserName()+"的后置环绕完成!");
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

测试和结果

69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
前置环绕:运行......
马老师说:.......
后置环绕:运行......
69老同志发言完成,恭喜大家获取技能闪电五连变
----------------分界线--------------------
前置环绕:运行......
老马说:.......
后置环绕:运行......

看代码来说如果指定了参数(&&args)和指定了运行的bean(&&bean) ,那么这个切面只有相应的bean才能被调用;
没有指定参数(&&args)和运行的bean(&&bean),那么只要这个实例被调用就,都会执行切面;
如果两个同时存在,那么都会被执行,有参的优先级较高,先执行将包含无参的;

挺好奇的,上面的代码他们的@Before,@After,@AfterReturning,他们什么时候执行?

先改下代码,新增

    @Before("execution(public * com.redis.service.UserService.speak(..))")
    public void speakBefore(JoinPoint joinPoint){
        System.out.println("前置拦截开始了");
    }
    @After("execution(public * com.redis.service.UserService.speak(..))")
    public void speakAfter(JoinPoint joinPoint){
        System.out.println("后置拦截开始了");
    }
    @AfterReturning("execution(public * com.redis.service.UserService.speak(..))")
    public void speakAfterReturning(JoinPoint joinPoint){
        System.out.println("完成拦截开始了");
    }

测试及结果

    @Test
    void AOPTest1(){
        User user3 = new User();
        user3.setUserName("马老师");
        user3.setUserAge(69);
        userService.speak(user3);
        System.out.println("----------------分界线--------------------");
        User user4 = new User();
        user4.setUserName("老马");
        user4.setUserAge(80);
        userService2.speak(user4);
    }

前置环绕:运行......
69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
前置拦截开始了
马老师说:.......
完成拦截开始了
后置拦截开始了
69老同志发言完成,恭喜大家获取技能闪电五连变
后置环绕:运行......
----------------分界线--------------------
前置环绕:运行......
前置拦截开始了
老马说:.......
完成拦截开始了
后置拦截开始了
后置环绕:运行......

阿狸! 什么鬼 ? 我注释掉新加在跑一次

前置环绕:运行......
69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
马老师说:.......
69老同志发言完成,恭喜大家获取技能闪电五连变
后置环绕:运行......
----------------分界线--------------------
前置环绕:运行......
老马说:.......
后置环绕:运行......

干掉代码在跑,加上代码在跑

69老同志即将发言,请注意听讲!如果你大意了,就没有闪了
前置环绕:运行......
前置拦截开始了
马老师说:.......
完成拦截开始了
后置拦截开始了
后置环绕:运行......
69老同志发言完成,恭喜大家获取技能闪电五连变
----------------分界线--------------------
前置环绕:运行......
前置拦截开始了
老马说:.......
完成拦截开始了
后置拦截开始了
后置环绕:运行......

反正挺好玩的! 我也没搞清楚 倒是是无参的先还是有参的先,
或者它们本来就是不分先后的,也许就不能一块用;
不过其他三个倒是挺正常的;先@Before,在@AfterReturning,最后@After

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot AOP练习 @Aspect 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 网络原理之初识

    目录 网络发展背景 独立模式 网络互联 局域网 广域网 网络通信基础 IP地址 端口号 协议 协议分层 OSI七层网络模型 TCP IP五层 四层 网络模型 物理层 数据链路层 网络层 传输层 应用层 封装和分用 网络发展背景 独立模式 独
  • Tensorflow 摄像头物体实时识别

    官方源码提供了图片的检测 但是实用性不高 所以对源码进行了修改 使用笔记本自带摄像头或者usb摄像头进行实时检测 第二张是摄像头实时物体识别 参考源 视频 https www youtube com watch v COlbP62 B U
  • 第41步 深度学习图像识别:Efficientnet建模(Tensorflow)

    一 写在前面 1 Efficientnet EfficientNet是Google在2019年提出的一种新的卷积神经网络架构 主要目标是提高模型的效率 即在保持或提高模型性能的同时 尽可能地降低模型的复杂性和计算需求 EfficientNe
  • 如何快速提高个人的计算机水平,如何进一步提高计算机水平

    文章 如何进一步提高计算机水平 周老师 您好 我是一名中学信息技术教师 我现在想进一步提高自己计算机专业方面的知识和能力 不知如何去做 我不是计算机专业毕业的 从事信息技术课程教学已两年 我对简单的Office 2000应用及计算机基本操作
  • 通过添加Access-Control-Allow-Origin首部字段,解决flask跨域问题

    今天在使用swagger测试接口的时候出现无法获取返回的问题 TypeError Origin http 10 8 15 49 18081 is not allowed by Access Control Allow Origin 查看日志
  • 树莓派接多个USB摄像头,使用opencv打开指定的某一个摄像头

    问题描述 在树莓派上使用多个USB摄像头时 如何确定各个摄像头所对应的id 比如 当有两个摄像头时 我尝试一个为cv2 VideoCapture 0 一个为cv2 VideoCapture 1 通过看捕获的图像 可以确定各摄像头的id 但这
  • attachInterrupt()函数

    attachInterrupt 函数介绍 attachInterrupt 函数是用于为Arduino开发板设置和执行ISR 中断服务程序 用的 ISR 中断服务程序 顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序
  • 【CF补题】Codeforces Round #784 (Div. 4)C++代码

    A include
  • idea连接kerberos认证的hive

    其实用dbeaver连接hive就可以了 但是呢 idea也有这个功能 本着研究下的想法就试试 结果最后成功了 最后记录下 参考文章 感觉不太行 PyCharm idea通过插件database连接带Kerberos的hive 不饿同学的博
  • 服装商品销售数据分析

    一 分析背景和数据来源 随着电商的快速发展 人们的购物行为占比也快速增加 作为电商卖家为了获取更多的用户并提升店铺销售量 可以结合产品销售情况和用户情况进行分析 得到有价值的信息 规划自己的销售策略 本文以淘宝天猫上服装商品购买情况数据为例
  • Qt绘制雷达图(卫星轨迹图)

    效果图 功能 使用QPainter绘制 雷达图主要包括 同心圆 十字架 刻度 不同颜色的圆圈 可以设置卫星的俯仰角 方位角 程序采用系统与卫星的结合 多种系统 n个卫星数据 进行显示 可自行搭配数据结构 监测卫星活动状态 定时清理无数据卫星
  • 数值概率算法

    基本概念 计算定积分 rand和srand 在解决设计问题时 有时会用到概率算法 概率算法允许在执行过程中随机的选择下一步的计算步骤 又是可使算法大大降低复杂度 提高算法效率 但有时也可能得不到问题的全部答案 基本概念 概率算法大致分为4类
  • 【Python】list.append()字典在for循环中数据覆盖的分析与解决

    问题 预期打印出来的list为 num 0 num 1 num 2 结果为 num 2 num 2 num 2 list dictionary num for i in range 3 dictionary num i list appen
  • 安装bootstrap

    导入软件源的 GPG key 并且添加 Yarn APT 软件源到你的系统 curl sS https dl yarnpkg com debian pubkey gpg sudo apt key add echo deb https dl
  • USB

    usb有主从设备之分 主设备有 pc 现在市面上的那些插u disk即可播放mp3的 mp3 之类的 usb 信号是差分信号 信号线为D D 在usb host 端 D D 各接一个15kohm 的下拉电阻 而在usb device端 这时
  • ue打开服务器文件速度很慢,看完大牛这篇文章,再遇到服务器反映慢的情况就不怕了...

    最近服务器反映很慢 查看服务器上的应用程序经常出现超时等等 而且还有时候出现卡死的情况 经过发现服务器I O压力很大 压力来自硬盘的I O访问已经达到100 最后原因是线上业务代码同一时间写入导致服务器硬盘I O爆表了 我这里纪录一下为了方
  • Hadoop集群搭建记录

    本文目录 写在前面 step1 安装openssh server step2 ssh文件夹的创建及生成密钥文件 step3 传送该文件 step4 slave1 slave2节点操作 step5 所有节点最终配置 免密登录成功 写在前面 本
  • 原来早就有java代码规范

    happy 最近几天 研究代码规范 想给给公司制定一个代码规范 公司很小 目前还没有代码规范 这个东西很烦人 也很难产生作用 小公司一般不采用吧 但现在为了提高代码质量 也就需要考虑了 今天 发现早在1997年 SUN公司就制定了java代
  • logit回归模型_混合logit模型(随机参数模型)的STATA应用及结果解读

    选择实验获得的数据主要通过离散选择模型来完成 离散选择模型中 最主要的是logit模型 之前已经介绍了二项logit模型回归的STATA实现 有修改 多项logit模型详解 多项logit模型回归系数解读 多项logit模型回归的检验 继续
  • spring boot AOP练习 @Aspect

    spring boot AOP练习 Aspect 环境