AOP XML方式配置

1、导包

2、创建Interface

public interface IUserDao {
	void save();
}

3、创建Dao

public class UserDao implements IUserDao {

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("-------------------我是原始方法,不要改变我哈");
	}

}

public class OrderDao {
	public void save(){
		System.out.println("------------------我是OrderDao SAVE方法,CGLIB");
	}
}

4、创建AOP

public class Aop {

	public void pointCut_(){
	}
	

	public void begin(){
		System.out.println("目标方法执行前");
	}
	

	public void after(){
		System.out.println("目标方法执行后’");
	}
	

	public void afterReturning() {
		System.out.println("afterReturning()");
	}
	

	public void afterThrowing(){
		System.out.println("afterThrowing()");
	}
	

	public void around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("环绕前");
		pjp.proceed();  
		System.out.println("环绕后");
	}
}

5、配置Bean.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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	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.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
     	 http://www.springframework.org/schema/tx/spring-tx.xsd">

	<context:component-scan base-package="dialiXML"></context:component-scan>	
	<bean id="userDao" class="dialiXML.UserDao"></bean>
	<bean id="orderDao" class="dialiXML.OrderDao"></bean>
	
	<!-- 设置切面类 -->
	<bean id="aop" class="dialiXML.Aop"></bean>
	
	
	<!-- bean.xml中引入aop名称空间 ,见上面名称空间 xmlns:aop-->
	
	<aop:config>
		<!-- 定义一个切入点表达式 -->
		<aop:pointcut expression="execution(* dialiXML.*.*(..))" id="pt"/>
		<aop:aspect ref="aop">
			<!-- 环绕通知 -->
			<aop:around method="around" pointcut-ref="pt"/>
			<!-- 前置通知: 在目标方法调用前执行 -->
			<aop:before method="begin" pointcut-ref="pt"/>
			<!-- 后置通知: -->
			<aop:after method="after" pointcut-ref="pt"/>
			<!-- 返回后通知 -->
			<aop:after-returning method="afterReturning" pointcut-ref="pt"/>
			<!-- 异常通知 -->
			<aop:after-throwing method="afterThrowing" pointcut-ref="pt"/>
		</aop:aspect>
	</aop:config>
</beans>     

6、测试

public void testAOP(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("dialiXML/bean.xml");
		IUserDao userDao = (IUserDao) ac.getBean("userDao");
		userDao.save();
		System.out.println(userDao.getClass());
		System.out.println("\n-----\n");
		
		OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
		orderDao.save();
		System.out.println(orderDao.getClass());
	}

结果:

环绕前
目标方法执行前
-------------------我是原始方法,不要改变我哈
环绕后
目标方法执行后’
afterReturning()
class com.sun.proxy.$Proxy3

-----

环绕前
目标方法执行前
------------------我是OrderDao SAVE方法,CGLIB
环绕后
目标方法执行后’
afterReturning()
class dialiXML.OrderDao$$EnhancerByCGLIB$$1403676d

附加:

切入点表达式:

切入点表达式,

           可以对指定的“方法”进行拦截;  从而给指定的方法所在的类生层代理对象。

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<!-- dao 实例 -->
	<bean id="userDao" class="cn.itcast.g_pointcut.UserDao"></bean>
	<bean id="orderDao" class="cn.itcast.g_pointcut.OrderDao"></bean>
	
	<!-- 切面类 -->
	<bean id="aop" class="cn.itcast.g_pointcut.Aop"></bean>
	
	<!-- Aop配置 -->
	<aop:config>
		
		<!-- 定义一个切入点表达式: 拦截哪些方法 -->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.*.*(..))" id="pt"/>-->
		
		<!-- 【拦截所有public方法】 -->
		<!--<aop:pointcut expression="execution(public * *(..))" id="pt"/>-->
		
		<!-- 【拦截所有save开头的方法 】 -->
		<!--<aop:pointcut expression="execution(* save*(..))" id="pt"/>-->
		
		<!-- 【拦截指定类的指定方法, 拦截时候一定要定位到方法】 -->
		<!--<aop:pointcut expression="execution(public * cn.itcast.g_pointcut.OrderDao.save(..))" id="pt"/>-->
		
		<!-- 【拦截指定类的所有方法】 -->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.*(..))" id="pt"/>-->
		
		<!-- 【拦截指定包,以及其自包下所有类的所有方法】 -->
		<!--<aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/>-->
		
		<!-- 【多个表达式】 -->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.save()) || execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.save()) or execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
		<!-- 下面2个且关系的,没有意义 -->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.save()) && execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
		<!--<aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.save()) and execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
		
		<!-- 【取非值】 -->
		<!--<aop:pointcut expression="!execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>-->
		<aop:pointcut expression=" not execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>
		
		<!-- 切面 -->
		<aop:aspect ref="aop">
			<!-- 环绕通知 -->
			<aop:around method="around" pointcut-ref="pt"/>
		</aop:aspect>
	</aop:config>
</beans>    



猜你喜欢

转载自blog.csdn.net/wjy0629/article/details/78294741
今日推荐