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. hdu 4451 Dressing 衣服裤子鞋 简单容斥

    Dressing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. poj 1064 高精度 二分

    Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32191 Accepted: 6888 Descrip ...

  3. Linux命令-文件管理(二)

    Linux命令-文件管理(二) Linux gitview命令 Linux gitview命令用于观看文件的内容,它会同时显示十六进制和ASCII格式的字码. 语法:gitview [-bchilv] ...

  4. linux查看端口占用情况,python探测端口使用的小程序

    Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND PID USER ...

  5. 深入理解Vuex 模块化(module)

    todo https://www.jb51.net/article/124618.htm

  6. linux文档与目录的相关命令

    Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来 ...

  7. 191028DjangoORM之多表操作

    一.多表操作之一对多 models.py from django.db import models class Book(models.Model): name = models.CharField( ...

  8. Linux如何安装卸载软件

    Linux 中如何卸载已安装的软件. Linux软件的安装和卸载一直是困扰许多新用户的难题.在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程 序” 来实现.与其相类 ...

  9. MyExcel 2.2.0 版本发布,支持公式导出

    MyExcel,是一个集导入.导出.加密Excel等多项功能的java工具包. 相关链接 MyExcel 的详细介绍:点击查看 MyExcel 的下载地址:点击下载

  10. linux系统问题排查

    通常linux系统出问题了 先看系统日志 tail -f /var/log/messages