springAop注解式Demo

package AnnoAspect.Aspect;

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

/**
 * 切面类
 */
@Component
@Aspect
public class MyAspect2 {

    /**
     * 前置通知
     */
    @Before(value = "execution(* AnnoAspect.dao.*.save(..))")
    public  void before(){
        System.out.println("前置通知");
    }

    /**
     * 后置通知  并且拿到方法返回值
     */
    //@AfterReturning(value = "execution(* AnnoAspect.dao.*.delete(..))",returning = "result")
    @AfterReturning(value = "MyAspect2.ponitCut1()",returning = "result")//使用同一切入点注解
    public void afterReturn(Object result){
        System.out.println("后置通知"+result);
    }

    /**
     * 环绕通知
     */
    @Around(value = "execution(* AnnoAspect.dao.*.update(..))" )
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知前");
        Object proceed = joinPoint.proceed();
        System.out.println("环绕通知后");
        return proceed;
    }

    @AfterThrowing(value = "execution(* AnnoAspect.dao.*.find(..))",throwing = "e")
    public void throwing(Throwable e){
        System.out.println("异常抛出通知!!!");
        System.out.println(e.getMessage());//获得异常信息
    }

    @After(value = "execution(* AnnoAspect.dao.*.find(..))")
    public void After(){
        System.out.println("最终通知!!!");
    }

    //切入点注解   相当于有一个方法  有多种通知  相当于将切入点其封装下
    @Pointcut(value = "execution(* AnnoAspect.dao.*.delete(..)))")
    private void ponitCut1(){ }//方法并无实际意义

}
package AnnoAspect.dao;

import org.springframework.stereotype.Repository;

//这边不适用接口  考察aop的cglib动态代理
@Repository("orderDao")
public class OrderDao {

    public void save() {
        System.out.println("add order!");
    }

    public String delete() {
        System.out.println("delete order!");
        return "abc";
    }

    public void update() {
        System.out.println("update order!");
    }

    public void find() {
        System.out.println("find order!");
        int i=1/0;
    }

}
package AnnoAspect.test;

import AnnoAspect.dao.OrderDao;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml" )
public class Test {

    @Resource(name = "orderDao")
    private OrderDao orderDao;

    @org.junit.Test
    public void test1() {

        orderDao.delete();
    }
}

注意:这边目标类并没有实现接口,所以切面类进行增强的时候是通过cglib动态代理的方式进行方法的扩展增强!

<?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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--开启注解aop  自动产生代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    <!--扫描包-->
    <context:component-scan base-package="aop.*,AnnoAspect.*"></context:component-scan>

    <!-- 在配置文件中开启注解的AOP的开发============ -->
    <aop:aspectj-autoproxy/>

    <!-- 配置目标类================ -->
    <!--<bean id="productDao" class="aop.dao.ProductDaoImpl">
    </bean>-->

    <!-- 配置切面类================ -->
    <bean id="myAspect" class="aop.Aspect.Aspect"></bean>

    <!--通过aop配置对目标类增强-->
    <aop:config>
        <!--切入点  配置哪些类那些方法被增强-->
        <aop:pointcut id="p1" expression="execution(* aop.dao.ProductDaoImpl.save(..))"></aop:pointcut>
        <aop:pointcut id="p2" expression="execution(* aop.dao.ProductDaoImpl.delete(..))"></aop:pointcut>
        <aop:pointcut id="p3" expression="execution(* aop.dao.ProductDaoImpl.update(..))"></aop:pointcut>
        <aop:pointcut id="p4" expression="execution(* aop.dao.ProductDaoImpl.query(..))"></aop:pointcut>
        <!--通知  配置通知类-->
        <aop:aspect ref="myAspect" >
            <!--前置通知-->
            <aop:before method="checkPri" pointcut-ref="p1"></aop:before>
            <aop:after-returning method="logPrint" pointcut-ref="p2" returning="result"></aop:after-returning>
            <aop:around method="watch" pointcut-ref="p3"></aop:around>
            <aop:after-throwing method="afterAfterThrowing" pointcut-ref="p4" throwing="ex"></aop:after-throwing>
            <aop:after method="after" pointcut-ref="p2" ></aop:after>
        </aop:aspect>
    </aop:config>
</beans> 

注解式aop要配置上这句话,pom文件所引入的jar包与上一篇文章一致

原文地址:https://www.cnblogs.com/Danial7777777/p/10704807.html

时间: 2024-10-20 03:48:43

springAop注解式Demo的相关文章

《SpringMVC从入门到放肆》八、SpringMVC注解式开发(基本配置)

上一篇我们结束了配置式开发,配置式开发目前在企业中用的并不是很多,大部分企业都在使用注解式开发,所以今天我们就来学习注解式开发.所谓SpringMVC注解式开发是指,处理器是基于注解的类的开发方式.对于每一个定义的处理器,无需在配置文件中逐个注册,只需在代码中通过对类与方法的注解,便可完成注册. 一.注册组件扫描器 这里说的组件即处理器,需要指定处理器所在的基本包. <?xml version="1.0" encoding="UTF-8"?> <b

AOP注解式拦截

1. 自己定义的拦截注解 package com.spring.aop; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(R

SpringMVC学习系列(9) 之 实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

注解式控制器

注解式控制器 Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated,建议不再使用了 Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解: @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定: @M

springmvc 实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

SpringMVC入门之注解式控制器

上面一篇写的是配置式的控制器现在已经不推荐使用了,其实注解式控制器和它的差不多只不过 更简洁而已! 1.还是在web.xml中进行配置DispatcherServlet <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-para

SpringMVC 实现注解式权限验证 1

一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface HandlerInterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; v

SpringMVC(9)实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

SpringBoot —— AOP注解式拦截与方法规则拦截

AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用方式主要有两种:注解式拦截与方法规则拦截,具体使用如下文所示. 一.创建一个简单springboot 2.03项目,添加aop依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId