spring 注解&XML实现AOP编程

注解方式实现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();
	}
}

运行结果:

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

时间: 2024-11-02 23:36:01

spring 注解&XML实现AOP编程的相关文章

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

spring注解开发及AOP

Spring的bean管理(注解) 注解介绍 1 代码里面特殊标记,使用注解可以完成功能 2 注解写法 @注解名称(属性名称=属性值) 3 注解使用在类上面,方法上面 和 属性上面 Spring注解开发准备 1 导入jar包 (1)导入基本的jar包 (2)导入aop的jar包 2 创建类,创建方法 3 创建spring配置文件,引入约束 (1)第一天做ioc基本功能,引入约束beans (2)做spring的ioc注解开发,引入新的约束 <beans xmlns:xsi="http://

spring 学习之二 AOP编程

AOP概念 AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展, 面向切面编程的好处就是不需要增加源代码就可以进行功能扩展. AOP术语 --joinpint(连接点): 指那些被拦截到的点,在spring中,这些点指的是方法 --pointcut(切入点) : 指要对哪些连接点进行拦截定义,即对哪些方法做扩展处理 --advice(通知/增强) : 通知是指拦截到joinp

使用spring方式来实现aop编程

1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 面向对

Spring 使用xml配置aop

1.xml文件需要引入aop命名空间 2.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:aop="http://www

Spring注解驱动开发-AOP、Tx和Servlet3.0

1 AOP 1.1 什么是AOP? 在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式. 底层就是动态代理. 1.2 AOP的应用 步骤: ①定义一个目标类以及目标方法. ②定义一个切面类,以及前置通知.后置通知等,使用各自的注解将通知织入到目标方法上. ③将目标类和切面类注册到容器中. ④在切面类上标注@Aspect注解,来告诉Spring这是一个切面类. ⑤在配置类上加上@EnableAspectJAutoProxy开启AspectJ自动代理. 示例: MathCalcu

Spring注解驱动开发--AOP功能测试

前言 Spring的AOP指的是在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式[动态代理]. AOP功能测试 ①导入AOP模块 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </depend

spring注解方式配置AOP

applicationContext.xml里添加: <aop:aspectj-autoproxy/>

Spring 注解方式的AOP

需要引进相关的jar包 spring-aop-3.2.5.RELEASE.jar     aopalliance.jar         aspectjweaver.jar