多种方式实现AOP
一、使用代理工厂完成声明式增强
1.创建业务接口
public interface IdoSomeService {
public void doSomething();
}
2.创建接口实现类
public class IdoSomeServiceImpl implements IdoSomeService{
@Override
public void doSomething() {
System.out.println("真实业务");
}
}
3.创建切面类
/**
* 切面
*/
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("前置增强");
}
}
4.编写applicationContext.xml配置文件
<!--注入业务Bean-->
<bean id="idoSomeService" class="cn.spring.proxyfactory.IdoSomeServiceImpl"></bean>
<!--增强:切面-->
<bean id="myBeforeAdvice" class="cn.spring.proxyfactory.MyBeforeAdvice"></bean>
<!--使用代理工厂实现增强-->
<bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--将增强和业务织入 到一起 -->
<property name="target" ref="idoSomeService"></property>
<!--拦截增强类-->
<property name="interceptorNames" value="myBeforeAdvice"></property>
</bean>
5.创建测试类
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取代理工厂
IdoSomeService idoSomeService=(IdoSomeService)context.getBean("proxyFactory");
idoSomeService.doSomething();
}
}
二、使用代理工厂完成环绕增强
1.创建业务接口
public interface IdoSomeService {
public void doSomething();
}
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService{
@Override
public void doSomething() {
System.out.println("真实业务");
}
}
3.创建切面类
public class MyAroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("环绕前");
//调用核心业务方法也可以获取方法内的参数 也可以获取目标对象
Object proceed = methodInvocation.proceed();
Object aThis = methodInvocation.getThis();
System.out.println(aThis);
System.out.println("环绕后");
return proceed;
}
}
4.编写applicationContext.xml配置文件
环绕增强
<bean id="idoSomeService" class="cn.spring.around.IdoSomeServiceImpl"></bean>
<bean id="myAroundAdvice" class="cn.spring.around.MyAroundAdvice"></bean>
<bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--将增强和业务织入到一起-->
<property name="target" ref="idoSomeService"></property>
<property name="interceptorNames" value="myAroundAdvice"></property>
<!--更换代理方式 proxyTargetClass默认值为false 默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib-->
<property name="proxyTargetClass" value="true"></property>
</bean>
4.创建测试类
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取代理工厂
IdoSomeService idoSomeService=(IdoSomeService)context.getBean("proxyFactory");
idoSomeService.doSomething();
}
三、使用工厂代理工厂完成异常增强
1.创建业务接口
public interface IdoSomeService {
public void doSomething() throws Exception;
}
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService {
@Override
public void doSomething() throws Exception{
int result=5/0;
System.out.println("真实业务");
}
}
3.创建切面类
public class MyThrowAdvice{
public void afterThrowing(Exception ex){
System.out.println("=====发生了异常,执行增强操作===============");
}
}
4.编写applicationContext.xml配置文件
<!--环绕增强-->
<bean id="idoSomeService" class="cn.spring.around.IdoSomeServiceImpl"></bean>
<bean id="myAroundAdvice" class="cn.spring.around.MyAroundAdvice"></bean>
<bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--将增强和业务织入到一起-->
<property name="target" ref="idoSomeService"></property>
<property name="interceptorNames" value="myAroundAdvice"></property>
<!--更换代理方式 proxyTargetClass默认值为false 默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib-->
<property name="proxyTargetClass" value="true"></property>
</bean>
5.创建测试类
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取代理工厂
IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService");
try{
idoSomeService.doSomething();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("2222222222222");
}
四、使用代理工厂实现最终增强
1.创建业务接口
public interface IdoSomeService {
public void doSomething() throws Exception;
}
2.创建业务接口实现类
public class IdoSomeServiceImpl implements IdoSomeService {
@Override
public void doSomething() throws Exception{
int result=5/0;
System.out.println("真实业务");
}
}
3.创建切面类
public class MyThrowAdvice{
public void afterAdvice(){
System.out.println("======执行最终异常===============");
}
}
4.编写applicationContext.xml配置文件
<bean id="idoSomeService" class="cn.spring.throwadvice.IdoSomeServiceImpl"></bean>
<bean id="myAdvice" class="cn.spring.throwadvice.MyThrowAdvice"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* *..throwadvice.*.*(..))"/>
<aop:aspect ref="myAdvice">
<aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="pointcut"></aop:after-throwing>
<aop:after method="afterAdvice" pointcut-ref="pointcut"></aop:after>
</aop:aspect>
</aop:config>
5.创建测试类
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取代理工厂
IdoSomeService idoSomeService=(IdoSomeService)context.getBean("idoSomeService");
try{
idoSomeService.doSomething();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("2222222222222");
}
多种方式实现AOP的更多相关文章
- 特性attribute,声明和使用attribute,应用attribute,AOP面向切面,多种方式实现AOP
1 特性attribute,和注释有什么区别2 声明和使用attribute3 应用attribute4 AOP面向切面5 多种方式实现AOP ---------------------------- ...
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- idea打包jar的多种方式
这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-a ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- PDO多种方式取得查询结果
PDO多种方式取得查询结果 01 December 2009 1:26 Tuesday by Sjolzy PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括: 数组(数值或关联数组) ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
随机推荐
- Kubernetes学习之k8s
k8s是什么 云原生 越来越多的开发者不仅使用容器作为应用部署和运行的载体,还积极使用了与容器这个应用载体天生匹配的微服务的架构,并依靠容器调度编排引擎的帮助,以保持对外部的敏捷性,这种容器化的微服务 ...
- KeyValue对RDDs
创建KeyValue对RDDs 使用函数map,返回keyvalue对 例如,包含数行数据的RDD,那每行的第一个单词作为keys. sparl.txt中的内容如下: hello ! hello wo ...
- Hadoop集群常用的shell命令
Hadoop集群常用的shell命令 Hadoop集群常用的shell命令 查看Hadoop版本 hadoop -version 启动HDFS start-dfs.sh 启动YARN start-ya ...
- 2018年蓝桥杯java b组第六题
标题:递增三元组 给定三个整数数组A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN],请你统计有多少个三元组(i, j, ...
- Android之SOAP协议与WebService服务器交互,解决超时的问题
网络搜索大部分不能实际解决问题.特意将解决方法写下.创建MyAndroidHttpTransport 类 , package com.example.omhandroid.lib; import or ...
- 03-css的继承性和层叠性
一.继承性 css中所谓的继承,就是子集继承父级的属性. 可以继承的属性:color.font-xxx.text-xxx.line-xxx.(主要是文本级的标签元素) 但是,像一些盒子元素属性,定位的 ...
- C++学习笔记二、头文件与源文件
头文件 .h 与源文件 .ccp 的区别 .h 文件一般是用来定义的,比如定义函数.类.结构体等: .cpp 文件则是对头文件的定义进行实现. include .h文件,可以调用你声明的函数.类等.当 ...
- 五、springboot 简单优雅是实现邮件服务
前言 spring boot 的项目放下小半个月没有更新了,终于闲下来可以开心的接着写啦. 之前我们配置好mybatis 多数据源的,接下来我们需要做一个邮件服务.比如你注册的时候,需要输入验证码来校 ...
- Azure pipeline 配置根据条件执行脚本
Azure pipeline 配置根据条件执行脚本 Intro 我的应用通过 azure pipeline 来做持续集成,之前已经介绍了根据不同分支去打包不同的package,具体的就不再这里详细介绍 ...
- 星之小说下载器Android版
原本是想在酷安上架的,然而审核不通过..只能通过网页方式宣传了 一款使用Jsoup开源库网络爬虫的APP,将在线阅读的小说解析,把小说全本下载为txt文件 由于使用爬虫技术,所以下载的速度不是很理想, ...