码迷,mamicode.com
首页 > 编程语言 > 详细

Spring---Aop

时间:2020-04-25 18:58:25      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:ssr   runner   tst   hot   system   value   odi   test   使用场景   

Spring Aop介绍:

1.Aop介绍
    Spring Aop是面向切面编程,底层是动态代理。可以实现在不改变源码的情况下,对目标方法进行增强。
Spring Aop支持声明式事务,与编程式事务相比较,声明式事务最大的优点就是不需要通过编程的方式管
理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过
基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
    
    Spring Aop的典型使用场景:
        1.事务管理;
        2.日志记录;
        3.权限控制

2.Spring Aop术语:
        JoinPoint: 连接点:
            所有的方法都可以是连接点;
        Pointcut: 切入点:
            需要进行增强的方法就是切入点;
        Advice: 通知/增强 :
            增强的逻辑就是通知,通知需要切入到切入点中;
            通知分为:
                前置通知;
                后置通知;
                环绕通知;
                异常通知;
                最终通知;
        Aspect: 切面:
            切入点和通知的结合就是切面;
            
3.Aop的使用:
    1.创建工程,导入坐标依赖:
        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>

            <groupId>com.it</groupId>
            <artifactId>spring-aop</artifactId>
            <version>1.0-SNAPSHOT</version>


            <dependencies>
                <!--Spring核心容器-->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>5.0.2.RELEASE</version>
                </dependency>
                <!--SpringAOP相关的坐标-->
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>1.8.7</version>
                </dependency>

                <!--Spring整合单元测试-->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-test</artifactId>
                    <version>5.0.2.RELEASE</version>
                </dependency>
                <!--单元测试-->
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.12</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>


        </project>
    
    2.创建Dao接口,定义方法;
        public interface AccountDao {

            void save();

            Object delete();

            void findAll();

            void update();

            void findById();
        }
        
    3.创建Dao接口的实现类,重写接口方法(在这里,这些方法就是需要进行增强的方法)
        public class AccountDaoImpl implements AccountDao {
            public void save() {
                System.out.println("save....");
            }

            public Object delete() {
                System.out.println("delete....");
                return "success";
            }

            public void findAll() {
                //模拟耗时
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("findAll...");
            }

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

            public void findById() {
                System.out.println("findById.....");
                int i=1/0;
            }
        }
        
    4.创建切面类,类中定义增强逻辑方法:
        public class MyAspect {

            //前置通知,增强逻辑
            public void check(){
                System.out.println("权限校验。。。");
            }
            //后置通知,增强逻辑
            public void log(Object obj){
                System.out.println("日志记录。。。"+obj);
            }
            //环绕通知,增强逻辑
            public void showTime(ProceedingJoinPoint joinPoint) throws Throwable {
                //目标方法调用之前
                System.out.println("调用之前的时间:"+System.currentTimeMillis());
                //调用目标方法
                joinPoint.proceed();
                //目标方法调用之后
                System.out.println("调用之后的时间:"+System.currentTimeMillis());

            }
            //异常通知,增强逻辑
            public void throwException(Exception e){
                System.out.println("异常抛出通知========"+e.getMessage());
            }

            //最终通知,增强逻辑
            public void showFinal(){
                System.out.println("最终通知。。。");
            }

        }
        
    5.配置文件:
        在配置文件中注册Dao实现类和切面类;
        在配置文件中配置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:aop="http://www.springframework.org/schema/aop"
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
            <!--注册Dao-->
            <bean id="accountDao" class="com.it.dao.impl.AccountDaoImpl"></bean>
            <!--注册增强类-->
            <bean id="myAspect" class="com.it.aspect.MyAspect"></bean>

            <!--配置aop-->
            <aop:config>
                <!--配置切入点,目的是找到需要进行增强的方法-->
                <!--
                    expression:表达式:
                    execution():固定写法
                    第一个 * 号:表示任意的返回值;
                    第二个 * 号:表示包名com.it.aspect下的任意类
                    第三个 * 号:表示任意方法
                    (..):表示方法的任意参数
                -->
                <aop:pointcut id="point01" expression="execution(* com.it.dao.impl.AccountDaoImpl.save(..))"></aop:pointcut>
                <aop:pointcut id="point02" expression="execution(* com.it.dao.impl.AccountDaoImpl.delete(..))"></aop:pointcut>
                <aop:pointcut id="point03" expression="execution(* com.it.dao.impl.AccountDaoImpl.findAll(..))"></aop:pointcut>
                <aop:pointcut id="point04" expression="execution(* com.it.dao.impl.AccountDaoImpl.update(..))"></aop:pointcut>
                <aop:pointcut id="point05" expression="execution(* com.it.dao.impl.AccountDaoImpl.findById(..))"></aop:pointcut>
                <!--配置切面,找到对应的增强类-->
                <aop:aspect ref="myAspect">
                    <!--配置前置通知,将增强类的增强逻辑切入到被增强的方法中-->
                    <aop:before method="check" pointcut-ref="point01"></aop:before>
                    <!--后置通知,可以获得目标方法返回参数-->
                    <aop:after-returning method="log" pointcut-ref="point02" returning="obj"></aop:after-returning>
                    <!--配置环绕通知-->
                    <aop:around method="showTime" pointcut-ref="point03"></aop:around>
                    <!--配置异常通知,可以获取异常信息-->
                    <aop:after-throwing method="throwException" pointcut-ref="point04" throwing="e"></aop:after-throwing>
                    <!--最终通知-->
                    <aop:after method="showFinal" pointcut-ref="point05"></aop:after>
                </aop:aspect>


            </aop:config>
        </beans>
        
    6.编写测试:
        RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration(value = "classpath:applicationContext.xml")
        public class Test {

            @Autowired
            private AccountDao accountDao;

            @org.junit.Test
            public void fun(){
                accountDao.save();
            }

            @org.junit.Test
            public void fun02(){
                accountDao.delete();
            }

            @org.junit.Test
            public void fun03(){
                accountDao.findAll();
            }

            //测试异常通知
            @org.junit.Test
            public void fun04(){
                accountDao.update();
            }

            //测试最终通知
            @org.junit.Test
            public void fun05(){
                accountDao.findById();
            }


        }

        
    
        
            

 

Spring---Aop

标签:ssr   runner   tst   hot   system   value   odi   test   使用场景   

原文地址:https://www.cnblogs.com/lyle-liu/p/12774173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!