码迷,mamicode.com
首页 > 编程语言 > 详细

spring 注解&XML实现AOP编程

时间:2015-07-31 01:26:17      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:spring

注解方式实现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();
	}
}
运行结果:

技术分享



版权声明:本文为博主原创文章,未经博主允许不得转载。

spring 注解&XML实现AOP编程

标签:spring

原文地址:http://blog.csdn.net/u014010769/article/details/47159341

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!