spring 注解&XML实现AOP编程

本文介绍了如何使用注解和XML方式在Spring中实现AOP编程。注解方式包括引入aop相关jar文件,开启aop注解以及使用@Aspect等注解定义切面和通知。XML方式则涉及引入aop命名空间,配置切面类和拦截方法。通过案例展示了两种方法的具体应用。
摘要由CSDN通过智能技术生成

注解方式实现AOP编程

注解方式步骤:

1) 先引入aop相关jar文件           (aspectj  aop优秀组件)                                      

spring-aop-3.2.5.RELEASE.jar    【spring3.2源码】

aopalliance.jar                 【spring2.5源码/lib/aopalliance】

aspectjweaver.jar               spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib

aspectjrt.jar                   spring2.5源码/lib/aspectj】或【aspectj-1.8.2\lib

注意:用到spring2.5版本的jar文件,如果用jdk1.7可能会有问题。

需要升级aspectj组件,即使用aspectj-1.8.2版本中提供jar文件提供。

2) bean.xml中引入aop名称空间(去文档中搜索xmln:aop)

3) 开启aop注解 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4) 使用注解

@Aspect                                                 指定一个类为切面类             

@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入点表达式

 

@Before("pointCut_()")                           前置通知: 目标方法之前执行

@After("pointCut_()")                            后置通知:目标方法之后执行(始终执行)

@AfterReturning("pointCut_()")                   返回后通知: 执行方法结束前执行(异常不执行)

@AfterThrowing("pointCut_()")                    异常通知:  出现异常时候执行

@Around("pointCut_()")                           环绕通知: 环绕目标方法执行

案例:

1)IUserDao 接口

package cn.itcast.aop_anno;

public interface IUserDao {
	public void save();
}
2)UserDao 实现了IUserDao接口

package cn.itcast.aop_anno;

import org.springframework.stereotype.Component;

@Component //方式IOC容器管理
public class UserDao implements IUserDao {
	public void save() {
		System.out.println("核心业务!保存");
	}
}
3)切面类 Aop

package cn.itcast.aop_anno;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect //指定当前类为切面类
public class Aop {//切面类
	@Pointcut("execution(* cn.itcast.aop_anno.*.*(..))")// 切面表达式
	public void pointCut_(){
		
	}
	@Before("pointCut_()")//拦截对切面表示式指定的方法..
	public void before(){
		System.out.println("before");
	}
	@After("pointCut_()")
	public void after(){
		System.out.println("after");
	}
}

4)bean.xml配置-->引入命名空间(去文档中搜索xmln:aop)

-->开启注解扫描

-->开启注解aop注解

<?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"
    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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        ">
        <!-- 开启扫描机制 -->
        <context:component-scan base-package="cn.itcast.aop_anno"></context:component-scan>
        <!-- 开启aop注解 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

5)测试类App---> 这里的返回值一定是接口IUserdao

package cn.itcast.aop_anno;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/aop_anno/bean.xml");
	@Test
	public void test(){
		IUserDao userdao=(IUserDao) ac.getBean("userDao");
		userdao.save();
	}
}
测试结果:


------------------------------------------深入理解----------------------------------------

1)如果UserDao不实现IUserDao接口

测试类改为:

package cn.itcast.aop_anno;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/aop_anno/bean.xml");
	@Test
	public void test(){
		UserDao userdao=(UserDao) ac.getBean("userDao");
		System.out.println(userdao.getClass());
		userdao.save();
	}
}
测试结果: -->返回结果一定是UserDao即是类 不是接口



xml方式实现AOP编程

xml实现AOP编程步骤:

Xml实现aop编程:

1) 引入jar文件  【aop 相关jar, 4个】

2) 引入aop名称空间

3)aop 配置

*配置切面类 (重复执行代码形成的类)

*aop配置

拦截哪些方法 / 拦截到方法后应用通知代码

案例:

IUserDao,UserDao,AOP类同上,--------->只是去掉注解..

1)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: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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        ">
       	<bean id="userDao" class="cn.itcast.aop_xml.UserDao"></bean>
        <!-- 切面类 -->
        <bean id="aop" class="cn.itcast.aop_xml.Aop"></bean>
        <!-- aop配置 -->
        <aop:config>
        	<!-- 切面表达式 -->
        	<aop:pointcut id="pc"  expression="execution(* cn.itcast.aop_xml.*.*(..))"/>
        	<!-- 切面 -->
        	<aop:aspect ref="aop">
        		<aop:before method="before" pointcut-ref="pc"/>
        		<aop:after method="after" pointcut-ref="pc"/>
        	</aop:aspect>
        </aop:config>
</beans>
2)测试类App

package cn.itcast.aop_xml;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/aop_xml/bean.xml");
	@Test
	public void test(){
		IUserDao userdao= (IUserDao) ac.getBean("userDao");
		System.out.println(userdao.getClass());
		userdao.save();
	}
}
运行结果:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值