Spring aop注解方式和xml配置方式
本文内容纲要:Spring aop注解方式和xml配置方式
- 需要加入jar包
cglib.jar aspectjweaver.jar aspectjrt.jar aopalliance-1.0.jar
2.aop理解
- 注解方式
(1). 接口BusinessService
package com.cn.service;public interface BusinessService {
public void save(String name);
public void update(String name, Integer id);
public String getName(Integer id);
}
(2).类BusinessServiceImpl实现BusinessService接口
package com.cn.service;public class BusinessServiceImpl implements BusinessService{
public String getName(Integer id) {
// TODO Auto-generated method stub
System.out.println("我是save()方法");
return "myname";
}
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("我是save()方法");
}
public void update(String name, Integer id) {
// TODO Auto-generated method stub
System.out.println("我是update()方法");
}
}
(3).定义面向切面的类MyInterceptor
package com.cn.service;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyInterceptor {
@Pointcut("execution(* com.cn.service.*.save*(..))")
//第一个* 说明方法的类型
//第二个* 说明包下的所有的类 如果是包下类和自包中的类* com.cn..*.save*(..))
//(..)方法中的参数
private void anyMethod() {
}// 定义一个切入点
@Pointcut("execution(* com.cn.service.*.update*(..))")
private void doMethod() {
}// 定义一个切入点
@Before("anyMethod()&&args(name)")
public void doAccessCheck(String name) {
System.out.println(name);
System.out.println("前置通知");
}
/* @AfterReturning("anyMethod()") */
@AfterReturning("anyMethod()")
public void doAfter() {
System.out.println("后置通知");
}
@After("anyMethod()")
public void after() {
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrow() {
System.out.println("例外通知");
}
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入环绕通知");
Object object = pjp.proceed();// 执行该方法
System.out.println("退出方法");
return object;
}
@Around("doMethod()")
public Object doBasic(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入环绕通知...");
Object object = pjp.proceed();// 执行该方法
System.out.println("退出方法...");
return object;
}
}
(4).测试类
package com.cn.service;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AopTest {
public static void main(String args[]) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
BusinessService service = (BusinessService) ctx.getBean("service");
service.save("555");
service.update("123", 589);
}
}
运行结果:
555
前置通知
进入环绕通知
我是save()方法
后置通知
退出方法
最终通知
进入环绕通知...
我是update()方法
退出方法...
3.xml方式
<?xml version="1.0" encoding="UTF-8"?><beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:config>
<aop:aspect id="TestAspect" ref="myInterceptor">
<aop:pointcut id="servicem" expression="execution(* com.cn.service.BusinessService.*(..))" />
<aop:before pointcut-ref="servicem" method="doAccessCheck"/>
<aop:after pointcut-ref="servicem" method="after"/>
<aop:around pointcut-ref="servicem" method="doBasicProfiling"/>
<aop:after-throwing pointcut-ref="servicem" method="doAfterThrow" throwing="ex"/>
</aop:aspect>
</aop:config>
<bean id="myInterceptor" class="com.cn.service.MyInterceptor"/>
<bean id="service" class="com.cn.service.BusinessServiceImpl"></bean>
</beans>
package com.cn.service;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
public class MyInterceptor {
public void doAccessCheck(JoinPoint jp) {
//System.out.println(jp.getTarget().getClass().getName());
System.out.println("前置通知");
}
/* @AfterReturning("anyMethod()") */
public void doAfter(JoinPoint jp) {
System.out.println("后置通知");
}
public void after(JoinPoint jp) {
System.out.println("最终通知");
}
public void doAfterThrow(JoinPoint jp,Throwable ex) {
System.out.println("例外通知");
}
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入环绕通知");
Object object = pjp.proceed();// 执行该方法
System.out.println("退出方法");
return object;
}
public Object doBasic(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入环绕通知...");
Object object = pjp.proceed();// 执行该方法
System.out.println("退出方法...");
return object;
}
}
本文内容总结:Spring aop注解方式和xml配置方式
原文链接:https://www.cnblogs.com/jiaokaige/p/3467567.html
以上是 Spring aop注解方式和xml配置方式 的全部内容, 来源链接: utcz.com/z/296903.html