连接点(JoinPoint) ,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点。其他如AspectJ还可以让你在构造器或属性注入时都行,不过那不是咱们关注的,只要记住,和方法有关的前前后后都是连接点。

方式一:xml方式配置

1.配置xml文件

    <bean id="dataSourceExchange" class="com.ooper.www.datasource.DataSourceExchange"/> <!--辅助功能bean-->
<aop:config>
<aop:pointcut id="dataSourcePointcut" expression="execution(* com.ooper.www.service.Impl.AccountServiceImpl.*(..))"/> <!-- 指定核心业务功能 -->
<aop:aspect ref="dataSourceExchange"> <!--指定辅助功能 -->
<aop:before pointcut-ref="dataSourcePointcut" method="before"/><!-- 执行核心任务之前执行 -->
<aop:after pointcut-ref="dataSourcePointcut" method="after"/><!-- 执行核心任务之后执行 -->
</aop:aspect>
</aop:config>

2. 辅助功能java代码

package com.ooper.www.datasource;
import org.aspectj.lang.JoinPoint; public class DataSourceExchange { public void before(JoinPoint point) { //获取目标对象的类类型
Class<?> aClass = point.getTarget().getClass();
String c = aClass.getName();
String[] ss = c.split("\\.");
//获取包名用于区分不同数据源
String methodName = ss[5]; if ("AccountServiceImpl".equals(methodName)) {
DataSourceHolder.setDbType(DataSourceEnum.DS2.getKey());
System.out.println("数据源:"+DataSourceEnum.DS2.getKey());
} else {
DataSourceHolder.setDbType(DataSourceEnum.DS1.getKey());
System.out.println("数据源:"+DataSourceEnum.DS1.getKey());
}
} /**
* 执行后将数据源置为空
*/
public void after(JoinPoint point) {
System.out.println("point:" + point);
DataSourceHolder.setDbType(null);
}
}

方式二:注解方式

1.xml配置文件

      <!-- 注解方式实现AOP -->

      <!-- 激活自动代理功能   -->
<!-- 代理方式1:采用JDK代理 -->
<aop:aspectj-autoproxy/>
<!-- 代理方式2:cglib代理 -->
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<!-- 找到被注解了的切面类,进行切面配置 -->
<context:component-scan base-package="com.how2java.aspect"/>
<context:component-scan base-package="com.how2java.controller"/>

2.注解配置切面代码

package com.how2java.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component; /**spring AOP
此段小代码演示了spring aop中@Around @Before @After三个注解的区别
* @Before是在所拦截方法执行之前执行一段逻辑。@After 是在所拦截方法执行之后执行一段逻辑。@Around是可以同时在所拦截方法的前后执行一段逻辑。
* @author Administrator
* 通过aop拦截后执行具体操作
*/
@Aspect
@Component
public class LogIntercept { // @Pointcut("execution(* com.how2java.controller..*.*(..))")
public void recordLog(){} @Before("execution(* com.how2java.controller..*.*(..))")
// @Before("recordLog()")
public void before() {
this.printLog("已经记录下操作日志@Before 方法执行前");
} @Around("execution(* com.how2java.controller..*.*(..))")
// @Around("recordLog()")
public Object around(ProceedingJoinPoint pjp) throws Throwable{
this.printLog("已经记录下操作日志@Around 方法执行前");
Object obj = pjp.proceed();
this.printLog("已经记录下操作日志@Around 方法执行后");
return obj;
} @After("execution(* com.how2java.controller..*.*(..))")
// @After("recordLog()")
public void after() {
this.printLog("已经记录下操作日志@After 方法执行后");
} private void printLog(String str){
System.out.println(str);
}
}
package com.how2java.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; @Aspect // 注解表示这是一个切面
@Component //表示这是一个bean,由Spring进行管理,使用注解时一定要使用@component或者@Repository、@Controller、@Service中一个去声明,将切面类放入到spring容器中,不然就去xml中显式写一个bean,不然的话就会报错,无法实现切面功能。 public class LoggerAspect {
@Around(value = "execution(* com.how2java.controller..*.*(..))")
//表示对com.how2java.controller 这个包中的所有方法进行切面操作
/* AOP(execution表达式)
*
* execution(* com.how2java.controller..*.*(..))
解释如下:
符号 含义
execution() 表达式的主体;
第一个”*“符号 表示返回值的类型任意;
com.how2java.controller AOP所切的服务的包名,即,我们的业务部分
包名后面的”..“ 表示当前包及子包
第二个”*“ 表示类名,*即所有类。此处可以自定义,下文有举例
.*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型 */
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start log:" + joinPoint.getSignature().getName());
Object object = joinPoint.proceed();//就是将来与某个核心功能编织之后,用于执行核心功能的代码
System.out.println("end log:" + joinPoint.getSignature().getName());
return object;
}
}

spring AOP的两种配置方式的更多相关文章

  1. (一)spring aop的两种配置方式。

    sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...

  2. spring ----> aop的两种实现方式

    实现1:基于xml package com.rr.spring3.interf; //接口 public interface SayHello { public void sayHello(); } ...

  3. spring AOP的两种配置

    xml配置 定义要被代理的方法的接口 public interface TestAop { public void print(String s); } 实现上述接口 public class Tes ...

  4. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  5. hibernate 一对一 one to one的两种配置方式

    hibernate中one-to-one两种配置方式 标签: hibernateHibernateone-to-one 2013-02-19 17:44 11445人阅读 评论(1) 收藏 举报  分 ...

  6. spring AOP的两种代理

    本篇记录下spring AOP的两种代理,为下一篇AOP实现做下铺垫. 1.JDK动态代理  2.cglib代理 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2.如果目标对象 ...

  7. Hibernate中双向多对多的两种配置方式

    Hibernate中双向多对多的两种配置方式 1.建立多对多双向关联关系 package cn.happy.entitys; import java.util.HashSet; import java ...

  8. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  9. 学习JavaWeb aop两种配置方式

    aop aop:面向切面编程,它可以解决重复代码. aop有两种方式: 一..xml方式 1.在springmvc-servlet.xml中配置aop,应用bean文件: <!--aop配置-- ...

随机推荐

  1. Docker学习笔记 - Docker容器的网络基础

    一.虚拟网桥 docker0 docker0 是 linux的虚拟网桥,守护进程通过docker0给容器提供网络连接的各种服务. 网桥是数据链路层设备,通常ip地址是网络层的设置.linux的虚拟网桥 ...

  2. django的models模型 关联关系和关系查询

    模型类关系 关系字段类型 关系型数据库的关系包括三种类型: ForeignKey:一对多,将字段定义在多的一端中. ManyToManyField:多对多,将字段定义在两端中. OneToOneFie ...

  3. Lua编写wireshark插件初探——解析Websocket上的MQTT协议

    一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...

  4. fetch简明学习

    前面的话 Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应.它还提供了一个全局 fetch()方法,该方法提供了一种简单,合乎逻辑的方式来跨网 ...

  5. golang微信公众号请求获取信息

    初次用golang在公众号中获取信息,记录一下 看了下文档,粗略的写了个demo,如下: func HttpGet(c*gin.Context) { var param GetType if er:= ...

  6. python——常用模块

    python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...

  7. CMDB开发

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  8. linux添加硬盘分区挂载教程

    基本步骤:分区--格式化--挂载--写入文件 1.首先用fdisk -l命令查看添加的硬盘名称,可以看到sdb为新增的硬盘 [root@oracle ~]# fdisk -l Disk /dev/sd ...

  9. spark2.1:在RDD[unit].foreach(s=>{})内部调用sparkSession对象抛出NullPointException

    问题代码: val sample_data_combine_result=List( (0,(List(FitModel(4022,1447.92,-8.38983306721434,2.0),Fit ...

  10. Spark:将RDD[List[String,List[Person]]]中的List[Person]通过spark api保存为hdfs文件时一直出现not serializable task,没办法找到"spark自定义Kryo序列化输入输出API"

    声明:本文转自<在Spark中自定义Kryo序列化输入输出API>   在Spark中内置支持两种系列化格式:(1).Java serialization:(2).Kryo seriali ...