Spring(九)--通知
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(九)--通知的更多相关文章
- spring事件通知机制详解
优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...
- Spring的通知类型,切入表达式写法
转载自 https://www.cnblogs.com/ltfxy/p/9882697.html Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方 ...
- Spring学习(十五)----- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
- Spring AOP通知实例 – Advice
Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-通知(Advice)API
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...
- 十三 Spring的通知类型,切入表达式写法
Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方 ...
- spring 九种设计模式
spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一 ...
- Spring的通知(Advice)
Spring提供了5种Advice类型: Interception Around:JointPoint前后调用 Before:JointPoint前调用 After Returning:JointPo ...
- spring添加通知配置
在项目里添加的spring配置文件 <bean id="beforeMethod" class="com.wxw.core.common.AdviceBefore& ...
- Spring切面通知执行的顺序(Advice Order)
问题描述 如果在Spring的程序中同时定义了环绕通知(Around)和前置通知(Before)..那么,有以下问题: 1.怎么让两个切面通知都起作用 2.或者让两者切面按自己指定的顺序进行执行? 3 ...
随机推荐
- C# socket 与网页通讯
class Program { static Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, Pr ...
- c++复习——一个小疑问
C++中,子类为什么不能访问基类的private数据? emmm 来自一个vegetable dog的疑问: 首先基类可以通过调用自身public成员函数来访问private 而子类又可 ...
- sh_05_列表遍历
sh_05_列表遍历 name_list = ["张三", "李四", "王五", "王小二"] # 使用迭代遍历列表 ...
- AcWing:246. 区间最大公约数(线段树 + 增量数组(树状数组) + 差分序列)
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 A[l],A[l ...
- 官网Windows 10安装程序驱动下载--截止:2019.01.06版本
说明:鉴于win7,8不可直接再下载原装iOS文件,这份共享程序包是为以后N年做的准备.如果N年后这个包还可以用,就可以省去很多麻烦. 百度网盘分享:https://pan.baidu.com/s/1 ...
- iview之avatar组件
avatar组件是一个获取网络路径图片的组件 它再vue中使用的话build时不会被打包,路径仍然为原来的路径 所以相对路径不会有效 如下: <Avatar style="margin ...
- Java基础教程免费分享
这是我自己早前听课时整理的Java全套知识,适用于初学者,也可以适用于中级进阶的人,你们可以下载,我认为是比较系统全面的,可以抵得上市场上90%的学习资料.讨厌那些随便乱写的资料还有拿出来卖钱的人!在 ...
- 第十四周课程总结 & 实验报告
一.JDBC JDBC概述 JDBC提供了一种与平台无关的用于执行SQL语句的标准JavaAPI,可以方便的实现多种关系型数据库的统一操作,它由一组用Java语言编写的类和接口组成 JDBC的主要操作 ...
- ActiveMQ配置文档
本文介绍一对一.一对多.持久化.非持久化消息配置方式 一.创建项目 导入jar 二.创建MQ.xml <!-- 配置JMS连接工厂 --> <bean id="connec ...
- Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Se ...