六、Spring AOP -- (四)XML方式实现Aop

一、XML方式实现AOP,步骤

 	
 	1. 引入jar文件  【aop 相关jar, 4个】
	2. 引入aop名称空间
	3. aop 配置
			配置切面类 (重复执行代码形成的类)
			aop配置
				引入切面类	
				拦截哪些方法 / 拦截到方法后应用通知代码
				

二、XML方式实现AOP,详解

2.1 AOP的XML配置
	
	<!-- 切面类:关注点代码,即抽取的重复代码组成的类 -->
	<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
	
	<!-- Aop配置 -->
	<aop:config>
			
			<!-- 切面类 -->
			<aop:aspect ref="myAop">
				<!-- 前置通知 ,目标方法之前执行-->
				<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
				
				<!-- 后置通知 ,目标方法之后执行(无论是否有异常,都执行)-->
				<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
				<!-- 环绕 -->
				<aop:around method="around"	pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
				<!-- 返回后通知 ,目标方法之后执行(目标方法有异常,就不执行)-->
				<aop:after-returning method="afterReturing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
				
				<!-- 异常通知 ,目标方法抛出异常之后才执行-->
				<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
			</aop:aspect>
	</aop:config>

	
	前置通知:
			<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			method 用于指定切面类中的方法名
			pointcut 用于指定切入点表达式
	
	后置通知:
			<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>


2.2 切入点的设置
2.2.1 直接指定切入点表达式
<?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:context="http://www.springframework.org/schema/context"
    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.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="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
	
	<!-- 切面类:关注点代码,即抽取的重复代码组成的类 -->
	<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>

	<aop:config>
		<aop:aspect ref="myAop">
				<aop:after method="after1" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
				<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
		</aop:aspect>
	</aop:config>
	
	
	
</beans>

2.2.2 引用切入点表达式
<?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:context="http://www.springframework.org/schema/context"
    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.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="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
	
	<!-- 切面类:关注点代码,即抽取的重复代码组成的类 -->
	<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
	
	<!-- Aop配置 ,直接指定切入点表达式-->	
	<aop:config>
		<aop:pointcut expression="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))" id="myPoint"/>
		<aop:aspect ref="myAop">
				<aop:after method="after1" pointcut=""/>
				<aop:after-throwing method="afeterThrowing" pointcut-ref="myPoint"/>
		</aop:aspect>
	</aop:config>
	
	
	
</beans>

2.3 案例
>>>>>> applicationContext.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:context="http://www.springframework.org/schema/context"
    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.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="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
	
	<!-- 切面类:关注点代码,即抽取的重复代码组成的类 -->
	<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
	
	<!-- Aop配置 -->
	<aop:config>
			
			<!-- 切面类 -->
			<aop:aspect ref="myAop">
				<!-- 前置通知 ,目标方法之前执行-->
				<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
				
				<!-- 后置通知 ,目标方法之后执行(无论是否有异常,都执行)-->
				<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
				<!-- 环绕 -->
				<aop:around method="around"	pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
				<!-- 返回后通知 ,目标方法之后执行(目标方法有异常,就不执行)-->
				<aop:after-returning method="afterReturing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
				
				<!-- 异常通知 ,目标方法抛出异常之后才执行-->
				<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
			
			</aop:aspect>
	</aop:config>
	
</beans>

>>>>>> UserDao .java
public class UserDao implements IUserDao{


	@Override
	public void save() {
		System.out.println("DB  保存");	
	}

}
>>>>>> Aop.java
public class Aop {
	
//	@Pointcut("execution(* org.jsoft.d_proxy_f_aop_anno.UserDao.*(..))")
//	public void point1() {
//		
//	}
	
	//前置通知:在调用目标方法之前执行
	//@Before("point1()")
	public  void begin() {
		System.out.println("开启事务");
	}
	
	//后置通知:在调用目标方法结束之后执行【无论目标方法是否出现异常,都执行】
	//@AfterReturning("point1()")
	public  void end() {
		System.out.println("关闭事务");
	}
	
	//返回后通知:在调用目标方法结束之后执行【出现异常不执行】
	//@AfterReturning("point1()")
	public void afterReturing() {
		System.out.println("afterReturing");
	}
	
	//异常通知:执行目标方法之后执行,目标方法抛出异常,就不执行【出现异常才执行】
	//@AfterThrowing("point1()")
	public void  afeterThrowing() {
		System.out.println("afeterThrowing");
	}
	
	//环绕通知
	//@Around("point1()")
	public void around(ProceedingJoinPoint point) throws Throwable {
		System.out.println("环绕前");
		point.proceed();
		System.out.println("环绕后");
	}
}

>>>>>> App.java
public class App {
	
	public static void main(String[] args) {
		
		ApplicationContext ac=new ClassPathXmlApplicationContext("org/jsoft/d_proxy_g_aop_xml/applicationContext.xml");
		
		IUserDao proxy =(IUserDao) ac.getBean("userDao");
		proxy.save();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值