Spring之Advice通知

Spring原生的经典模式  实现AOP
advice :通知
 前置通知:在目标方法执行之前执行!不能改变方法的执行流程和结果!
            实现MethodBeforeAdvice接口!
 后置通知:在目标方法执行之后执行!不能改变方法的执行流程和结果!
            实现AfterReturningAdvice接口!
 环绕通知:方法的拦截器!进入了方法体,能改变方法的执行流程和结果!
             实现MethodInterceptor接口!
 异常通知: 当我们的目标方法发生异常才会被执行!
            实现ThrowsAdvice接口!

如果想在项目中使用各种通知,必须引入需要的pom文件节点!
   01.aop联盟
   <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
   02. spring整合aop的jar
      <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-aop</artifactId>
             <version>${spring.version}</version>
       </dependency>

1. 创建需要的dao接口

2. 创建需要的daoImpl实现类

3. 创建前置增强类

4. 创建后置增强类

5. 创建环绕增强类

6. 创建异常增强类和自定义异常类

7. 配置spring.xml文件

 <!--01. 配置目标对象   实际肯定是配置UserServiceImpl-->
<bean id="userDaoImpl" class="com.xdf.dao.UserDaoImpl"/> <!--02.配置各种通知-->
<!--001.前置通知-->
<bean id="beforeAdvice" class="com.xdf.advice.BeforeAdvice"/>
<!--002.后置通知-->
<bean id="afterAdvice" class="com.xdf.advice.AfterAdvice"/>
<!--003.环绕通知-->
<bean id="aroundAdvice" class="com.xdf.advice.AroundAdvice"/>
<!--004.异常通知-->
<bean id="exceptionAdvice" class="com.xdf.advice.ExceptionAdvice"/> <!--03.需要配置代理工厂bean,来创建代理类! 从而把各种通知织入到目标对象的目标方法中-->
<bean id="userProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--注册了目标对象-->
<property name="targetName" value="userDaoImpl"/>
<!--注册通知-->
<property name="interceptorNames">
<array>
<value>beforeAdvice</value><!--前置通知-->
<value>afterAdvice</value><!--后置通知-->
<value>aroundAdvice</value><!--环绕通知-->
</array>
</property>
</bean> <!--再次创建一个工厂 来为异常对象服务 因为一个工厂无法为多个对象服务-->
<bean id="exceptionProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--注册了目标对象-->
<property name="targetName" value="userDaoImpl"/>
<!--注册通知-->
<property name="interceptorNames">
<array>
<value>exceptionAdvice</value><!--异常通知-->
</array>
</property>
</bean> </beans>

8. 创建测试类

@Test //前置通知
public void testBefore(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
/**
* 获取的是代理工厂 返回的是目标对象
*/
UserDao userDao= context.getBean("userProxy",UserDao.class);
userDao.eat();
System.out.println("***********************");
userDao.sleep(); }
@Test //后置通知
public void testAfter(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
UserDao userDao= context.getBean("userProxy",UserDao.class);
userDao.eat();
}
@Test //环绕通知
public void testAround(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
UserDao userDao= context.getBean("userProxy",UserDao.class);
String result=userDao.eat();
System.out.println(result);
}
@Test //异常通知
public void testException(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
UserDao userDao= context.getBean("exceptionProxy",UserDao.class);
try {
userDao.login("aa","admin");
}catch (MyException ex){
ex.printStackTrace();
}
}

  面对以上案例  发现几个问题:

    1.每个代理工厂只能给一个目标对象服务!实际开发过程中,不止一个目标对象!

    2.不能实现给  指定的  主业务增强!

    3.测试类getBean的时候还是获取的代理!应该是service层对象才对!

   以上问题怎么解决呢?想知道的话,下次再来吧!哈哈~~(先让我们的大脑旋转起来吧!)

Spring(九)--通知的更多相关文章

  1. spring事件通知机制详解

    优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...

  2. Spring的通知类型,切入表达式写法

    转载自  https://www.cnblogs.com/ltfxy/p/9882697.html Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方 ...

  3. Spring学习(十五)----- Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  4. Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  5. 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-通知(Advice)API

    本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...

  6. 十三 Spring的通知类型,切入表达式写法

    Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方 ...

  7. spring 九种设计模式

    spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一 ...

  8. Spring的通知(Advice)

    Spring提供了5种Advice类型: Interception Around:JointPoint前后调用 Before:JointPoint前调用 After Returning:JointPo ...

  9. spring添加通知配置

    在项目里添加的spring配置文件 <bean id="beforeMethod" class="com.wxw.core.common.AdviceBefore& ...

  10. Spring切面通知执行的顺序(Advice Order)

    问题描述 如果在Spring的程序中同时定义了环绕通知(Around)和前置通知(Before)..那么,有以下问题: 1.怎么让两个切面通知都起作用 2.或者让两者切面按自己指定的顺序进行执行? 3 ...

随机推荐

  1. zTree 节点展开

    var treeObj = $("#treeDemo"); $.fn.zTree.init(treeObj, setting, Znode1); zTree_Menu = $.fn ...

  2. python 数据库插入操作

    数据库插入操作 以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录: #!/usr/bin/python # -*- coding: UTF-8 -*- import MyS ...

  3. C# 获取系统信息

    public string GetMyOSName()        {            //获取当前操作系统信息            OperatingSystem MyOS = Envir ...

  4. Angular 主从组件

    此刻,HeroesComponent 同时显示了英雄列表和所选英雄的详情. 把所有特性都放在同一个组件中,将会使应用“长大”后变得不可维护. 你要把大型组件拆分成小一点的子组件,每个子组件都要集中精力 ...

  5. MariaDB 默认是禁止远程访问的 我们改掉它

    查询用户账号信息: select User, host from mysql.user; 现在只显示  root账户中的host项是localhost表示该账号只能进行本地登录,我们需要修改权限,输入 ...

  6. Mysql超强卸载

    1.控制面板——>所有控制面板项——>程序和功能,卸载mysql server! 2.删除MySQL文件,尤其是ProgramData里面的隐藏文件MySQL,我当时没有删除,重新安装My ...

  7. LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵

    题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, ...

  8. JVM系列2:HotSpot虚拟机对象

    1.对象创建过程: ①.类加载检查:当java虚拟机遇到一条new指令时,首先会去检查该指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析.初始化过,如果没 ...

  9. vue问题二:vue打包时产生的问题

    vue项目打包问题:vue中默认的config/index.js的配置的详细理解: 参考文档:https://blog.csdn.net/qq_34611721/article/details/809 ...

  10. spring BeanUtils.copyProperties只拷贝不为null的属性

    在MVC的开发模式中经常需要将model与pojo的数据绑定,apache和spring的工具包中都有BeanUtils,使用其中的copyProperties方法可以非常方便的进行这些工作,但在实际 ...