研究所(后端)第二周学习感悟

研究所(后端)第二周学习感悟

一、基于Spring AOP模拟实现日志打印

  1. 理解

    简单理解spring aop:通过定义切入点(Pointcut)和通知(Advice),以决定何时执行特定的代码片段。例如,你可以在某个方法执行前后打印日志,而不需要在原始代码中显式添加这些日志语句,Spring AOP的主要作用是允许开发者在不修改源码的情况下对方法进行功能增强,这主要包括减少重复代码、提高开发效率并且便于维护。

  2. 切点表达式语法

    execution([修饰符]返回值类型包名.类名.方法名(参数))
    
    • 访问修饰符可以省略
    • 返回值类型、包名、类名、方法名可以使用星号*代表任意
    • 包名与类名之间一个点.代表当前包下的类,两个点…表示当前包及其子包下的类
    • 参数列表可以使用两个点…表示任意个数,任意类型的参数列表
  3. 通知的配置语法

    //注解方式
    @通知注解("切点表达式")
    
    <!--配置文件方式-->
    <aop:通知类型 method="切面类中方法名" pointcut="切点表达式"></aop:通知类型>
    
    
    名称标签注解说明
    前置通知<aop:before>@Before用于配置前置通知。指定增强的方法在切入点方法之前执行
    后置通知<aop:AfterReturning>@AfterReturning用于配置后置通知。指定增强的方法在切入点方法之后执行
    环绕通知<aop:Around>@Around用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
    异常抛出通知<aop:AfterThrowing>@AfterThrowing用于配置异常抛出通知。指定增强的方法在出现异常时执行
    最终通知<aop:After>@After用于配置最终通知。无论增强方式执行是否有异常都会执行
  4. 步骤(基于xml)

    • 导坐标
    • 创建目标类、接口类,在类的一个方法上应用切点
    • 创建切面类(这个类包含我们的日志增强方法)
    • 将目标类和切面类的对象创建权交给Spring框架处理
    • 在Spring的配置文件中,通过aop:aspectref元素将切面类与目标类建立关联,这样在运行时,切面的逻辑将被应用到目标类的实例上
    • 测试代码
  5. 步骤(基于注解的方式)更常用!

    • 导依赖

    • 创建目标接口和目标类(内部有切点)

      public interface MyService {  
          void doSomething();  
      } 
      
      @Service  
      public class MyServiceImpl implements MyService {  
          @Override  
          public void doSomething() {  
              System.out.println("Doing something...");  
          }  
      }
      
    • 创建切面类(内部有增强方法)

      @Aspect  
      @Component  
      public class LoggingAspect {  
          @Before("execution(* com.example.myapp.MyServiceImpl.doSomething(..))")  
          public void logBefore(JoinPoint joinPoint) {  
              System.out.println("Logging before the method is called...");  
          }  
      }
      
    • 配置织入关系,通过配置文件中的AOP配置,将切面类与目标类关联起来

      <aop:config>  
          <aop:aspect ref="loggingAspect">  
              <aop:pointcut id="myPointcut" expression="execution(* com.example.myapp.MyServiceImpl.doSomething(..))"/>  
              <aop:before pointcut-ref="myPointcut" method="logBefore"/>  
          </aop:aspect>  
      </aop:config>
      
    • 将目标类和切面类的对象创建权交给spring,并在配置文件中开启组件扫描和AOP的自动代理,扫描指定包下的类

    • 测试

使用到的注解:

  • @Aspect:这个注解表示该类是一个切面类。
  • @Component:这个注解表示该类是一个Spring组件,Spring会自动扫描并将其实例化。
  • @Before:这个注解表示在目标方法执行之前,要执行logBefore()方法。其中的表达式定义了切点(pointcut),即哪些方法会被这个切面所影响
  • @Pointcut:该注解用于定义切点。它指定了哪些方法或哪些位置应该被切面所影响。
  • @Around:该注解用于定义环绕通知。环绕通知是在目标方法执行之前和之后执行的逻辑。
  • @Configuration:该注解用于标记类为配置类。

二、基于Spring声明式事务管理模拟银行转账业务

  1. 理解

    通过注解或XML配置的方式,将事务处理与业务逻辑分离。在银行转账业务中,我们可以利用Spring的事务管理功能,实现转账业务的流程控制和异常处理,当转账业务发生异常时,Spring会自动回滚事务,保证转账业务的原子性和一致性。

  2. 步骤

    • 创数据库导坐标
    • 创模型类,dao接口,实现类,目标类
    • service接口,目标类
    • 配置jdbc.propertie
    • 写Spring配置文件(基于xml方式)
      • 在XML配置文件中定义事务管理器、服务和业务逻辑,并通过AOP来拦截服务和业务逻辑的方法调用,实现事务的管理
    • 基于注解方式(使用@Transactional注解)
    • 测试代码
  3. 区别

    • 使用@Transactional注解可以轻松地实现事务管理。只需要在希望进行事务处理的方法上添加这个注解。Spring会自动地根据这个注解来处理事务的开启、提交和回滚等操作。
    • 在XML配置文件中,需要定义事务管理器、服务和业务逻辑。通过AOP,拦截服务和业务逻辑的方法调用,并指定在这些方法调用时应该使用的事务管理器的相关属性。
    • 使用注解方式更加简洁,只需要在代码中添加注解,不需额外的XML配置,更加简单快速。如果需要更灵活和可配置性,使用xml更合适

三、实现SpringMVC入门案例

理解:Spring MVC是一个基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架。通过Spring MVC,我们可以轻松地实现模型-视图-控制器模式的Web应用。

四、实现SpringMVC多种类型数据响应

  1. SpringMVC的数据响应方式

    • 页面跳转

      直接返回字符串

      通过ModelAndView对象返回

    • 回写数据

      直接返回字符串

      返回对象或集合

  2. ModelAndView

    该类提供了模型数据和视图信息的封装,可以将处理结果返回给客户端。通过使用ModelAndView对象,控制器可以将模型数据传递给视图,并将视图名称和模型数据封装在一起返回给DispatcherServlet,最终呈现给客户端。这样可以简化控制器与视图之间的数据传递,提高代码的可读性和可维护性。

  3. RequestMapping

    • 用于处理请求地址映射
    • 当一个请求匹配到指定的URL路径时,该方法就会被调用以处理该请求
    • 类上,表示类中的所有响应请求的方法都以该地址作为父路径

五、 实现SpringMVC获取不同类型参数

  • @PathVariable注解进行请求路径中参数获取工作
  • @DateTimeFormat 用于声明一个对象属性或者方法参数会被格式化为日期或时间
  • @RequestHeader可以获得请求头信息
  1. 理解

    http://example.com/api?param1=value1&param2=value2
    

    用于HTTP请求中的查询字符串,客户端发送了一个GET请求到“http://example.com/api”,并在URL中附带了两个参数,分别是“param1”和“param2”,它们分别具有对应的值“value1”和“value2”。

  2. 获取基本类型参数

    • @ResponseBody:这个注解表示该方法的返回值将被直接写入HTTP响应的body中

    • @RequestParam:请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

      @RequestMapping("/param2")
       	@ResponseBody
          public void param2(int phoneId,@RequestParam("mNumber") String modelNumber){
           	System.out.println(phoneId);
              System.out.println(modelNumber);
          }
      
  3. 获取数组类型参数

    @RequestMapping("/param5")
    @ResponseBody
    public void param5(String[] nets){
    	System.out.println(Arrays.asList(nets));
    }
    
  4. 获取集合类型参数

    • 创建一个集合类型的参数

    • public class PhoneStoreDTO {
      
          private String storeName;
          private List<Phone> phoneList;
          //让用户可以获取到在特定店铺的所有手机的信息。
      
    • 在控制器的方法中使用@RequestParam@RequestBody注解来声明参数。如果期望通过请求参数列表来传递集合,使用@RequestParam;如果期望通过请求体来传递集合,使用@RequestBody

  5. DTO

    DTO (Data Transfer Object) 是一种设计模式,通常用于在应用程序的不同层之间传输数据。DTO 是一个简单的 Java 类,其字段对应于需要传输的数据。它可以帮助我们封装数据,使其在应用程序的不同部分之间传递。

  • 假设我们有一个用户数据,我们希望在不同的层之间传递,我们可以创建一个 UserDTO 类

    public class UserDTO {  
        private String username;  
        private String password;  
        private String email;  
      
        //UserDTO 类封装了用户的数据(用户名、密码和电子邮件),并提供了获取和设置这些数据的方法。然后,我们可以在应用程序的不同层之间传递 UserDTO 实例,以传输用户数据  
    }
    
  • 使用DTO的优点

    它可以使代码更加模块化和可维护。通过使用 DTO,我们可以更好地控制数据的封装和访问,特别是在涉及到敏感数据(如密码)的情况下,提高数据安全性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值