Spring-aop 基于Aspectj 表达式配置AOP

11 篇文章 0 订阅

基于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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值