基于Aspectj 表达式配置AOP(推荐使用)
- 基于配置文件
1.添加切面对象(aspect对象)
2.把切面对象交给spring
3.配置文件<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- spring扫描包 --> <context:component-scan base-package="com.chair" /> <aop:config> <!-- 配置切入点 --> <aop:pointcut id="切点id" expression="Aspectj 表达式" /> <!-- 配置切面 把增强用到方法上面 --> <aop:aspect ref="切面对象id"> <!-- 前置通知 --> <aop:before method="切面对象方法" pointcut-ref="切点id" /> <!-- 后置通知 --> <aop:after-returning method="切面对象方法" pointcut-ref="切点id" /> <!-- 异常通知 --> <aop:after-throwing method="切面对象方法" pointcut-ref="切点id" /> <!-- 环绕通知 --> <aop:around method="切面对象方法" pointcut-ref="切点id" /> </aop:aspect> </aop:config> </beans>
新建切面对象方法:
package com.liuxi.test.morn;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
//切面对象。用来执行切的方法。前置后置,环绕
@Component
public class AspectjAop {
private void astQian() {
System.out.println("前置通知方法");
}
private void astHou() {
System.out.println("后置通知方法");
}
Object object = null;
// 环绕通知方法
private Object hrtz(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕通知---钱");
object = point.proceed();// 执行原有逻辑
System.out.println("环绕通知---后");
return object;
}
}
自动注入Client对象;
package com.liuxi.test.morn;
import org.springframework.stereotype.Component;
@Component
public class Client {
private String name;
private int money;
public void maidongxiClient() {
// TODO Auto-generated method stub
System.out.println("2222客户买东西");
}
public void maiClient() {
System.out.println("卖客户2");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
新建xml bean config文件,添加配置:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- spring扫描包 -->
<context:component-scan
base-package="com.liuxi.test.morn" />
<aop:config>
<!-- 配置切入点 切点id:随便写(自己定义的)Aspectj 表达式(和自动代理配置一样可是表达式写法不一样 -->
<!-- 表达式格式:访问修饰符?(可写可不写) 返回值类型 包名.类名.方法名(参数类型)加点点表示匹配所有参数 异常模式?可写可不写 -->
<!-- 配置切入点 -->
<aop:pointcut id="pointcut"
expression="execution(* com.liuxi.test.morn.Client.maidongxiClient(..))" />
<aop:pointcut id="pointcut2"
expression="execution(* com.liuxi.test.morn.Client.maiClient(..))" />
<!-- 配置切面 切面对象,里面是切面的方法 -->
<aop:aspect ref="aspectjAop">
<!-- 前置通知 -->
<aop:before method="astQian" pointcut-ref="pointcut" />
<!-- 后置通知 -->
<aop:after-returning method="astHou" pointcut-ref="pointcut" />
<!-- 异常通知 -->
<!-- <aop:after-throwing method="hrtz" -->
<!-- pointcut-ref="pointcut" /> -->
<!-- 环绕通知 -->
<aop:around method="hrtz" pointcut-ref="pointcut2" />
</aop:aspect>
</aop:config>
</beans>
测试执行类:
package com.liuxi.test.morn;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test5 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");
Client client = (Client) context.getBean("client");
client.maidongxiClient();
}
}
- 基于注解配置
1.添加切面对象(aspect对象)(加上注解)
2.把切面对象交给spring
3.配置文件
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- spring扫描包 -->
<context:component-scan base-package="com.chair" />
<!-- 自动代理 -->
<aop:aspectj-autoproxy />
</beans>
常用通知
@Before[MethodBeforeAdvice]: 前置通知, 在方法执行之前执行
@After [AfterReturningAdvice]: 返回通知, 在方法返回结果之后执行
@AfterThrowing [ThrowsAdvice]: 异常通知, 在方法抛出异常之后
@Around[MethodInterceptor]: 环绕通知, 围绕着方法执行
添加切面对象,加上注解
package com.liuxi.test.morn2;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
//添加切面对象(aspect对象)(加上注解)
//2.把切面对象交给spring
@Aspect
@Component
public class AspectZJ {
@Before(value = "execution(* com.liuxi.test.morn2.Client.maiClient(..))")
private void aaaa() {
// TODO Auto-generated method stub
System.out.println("我是前置通知注解");
}
}
引用上面的client。
新建xml bean config文件 app2:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- spring扫描包 -->
<context:component-scan base-package="com.liuxi.test.morn2" />
<!-- 自动代理 -->
<aop:aspectj-autoproxy />
</beans>
测试执行类:
package com.liuxi.test.morn2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test6 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app2.xml");
Client client = (Client) context.getBean("client");
client.maiClient();
}
}