`
sunjiesh
  • 浏览: 100501 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring AOP概念学习(二)-单独代理

阅读更多

      这几天一直没有时间写博客,今天正好抽空,现在继续上一篇文章,来整理一下个人心得,希望可以给初学者帮助,即使没有帮助,也希望大家共同交流。

      下面开始进入正题,这篇文章主要讲解的是有关于Spring AOP中的Advices的实现,首先介绍的是通过接口实现的advice,其余实现将在后面几篇文章中介绍。

      1、定义基本的advice Bean以及要被调用的类

 

    定义Advice Bean

package com.javaeye.sunjiesh.aop;

import java.lang.reflect.Method;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

public class AdviceTest implements MethodBeforeAdvice,AfterReturningAdvice,MethodInterceptor,ThrowsAdvice{

	/**
	 * 调用方法之前执行
	 * Before Advice
	 */
	@Override
	public void before(Method arg0, Object[] arg1, Object arg2)
			throws Throwable {
		System.out.println("调用before");
	}

	/**
	 * 调用方法之后执行
	 * After Advice
	 */
	@Override	
	public void afterReturning(Object arg0, Method arg1, Object[] arg2,
			Object arg3) throws Throwable {
		System.out.println("调用afterReturning");
	}

	/**
	 * Around Advice
	 */
	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		Object result=null;
		System.out.println("around 调用before之前");
		
		result=arg0.proceed();
		
		System.out.println("around 调用afterReturning之后");
		return result;
	}
	
	public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass) {
    	System.out.println("ThrowAdvice 记录异常...........");
    }
	
}

 

    接口类

package com.javaeye.sunjiesh.proxy;

public interface IHello {

	void hello();
	
	void helloA(String a);
	
	void helloB(String b);
}

 

    实现类

package com.javaeye.sunjiesh.proxy;

public class HelloImpl implements IHello {

	@Override
	public void hello() {
		// TODO Auto-generated method stub
		System.out.println("hello in HelloImpl");
	}

	@Override
	public void helloA(String a) {
		// TODO Auto-generated method stub
		System.out.println("helloA in HelloImpl,parameter is "+a);
	}

	@Override
	public void helloB(String b) {
		// TODO Auto-generated method stub
		System.out.println("helloB in HelloImpl,parameter is "+b);
	}

}
 

      2、在配置文件中声明我们的bean(文件名:spring-beans.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:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 代理 -->
	<bean id="helloImpl" class="com.javaeye.sunjiesh.proxy.HelloImpl"></bean>

<!-- 声明四种通知类型,其实就是你想加入到其他被代理程序执行逻辑中的代码 -->
	<bean id="adviceTest" class="com.javaeye.sunjiesh.aop.AdviceTest" />
<!-- 基础的通知使用,这里强行给helloSpeaker1加上了advice通知 -->
	<bean id="aaa" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="helloImpl"></property>
		<property name="interceptorNames">
			<list>
				<value>adviceTest</value>
			</list>
		</property>
	</bean>
</beans>

 

    3、在main函数中调用

package com.javaeye.sunjiesh.aop;

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

import com.javaeye.sunjiesh.proxy.IHello;

public class AopMain {

	/** 对于给基本的spring bean强行指定一批advice方法的调用展示 **/
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"spring-beans.xml");
		IHello h = (IHello) ctx.getBean("aaa");
		h.helloA("测试一");

		System.out.println("======开始进行测试二=========");
		try {
			h.helloB("测试二");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

    4、控制台的显示

around 调用before之前
调用before
helloA in HelloImpl,parameter is 测试一
调用afterReturning
around 调用afterReturning之后
======开始进行测试二=========
around 调用before之前
调用before
helloB in HelloImpl,parameter is 测试二
调用afterReturning
around 调用afterReturning之后
 

    备注:如果Advice Bean实现ThrowsAdvice接口,则一定要实现afterThrowing方法,否则会报错。

0
0
分享到:
评论

相关推荐

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    spring aop4.3.10

    Spring AOP 4.3.10 是一个重要的版本,它是Spring框架的一部分,专注于面向切面编程(Aspect-Oriented Programming, AOP)。AOP是一种编程范式,它旨在提高软件设计的模块化,通过将关注点分离为独立的切面来实现。...

    spring aop

    在Spring AOP中,切面可以由一个单独的类定义,这个类包含了通知和其他元数据。 - **通知(Advice)**:通知是在特定连接点上执行的代码,即切面的逻辑。Spring支持五种类型的通知:前置通知(Before)、后置通知...

    Spring(十六) AOP(五)--和AOP(二)类似的切面编程

    在本篇博文中,我们将深入探讨Spring框架中的AOP(面向切面编程)概念,特别是与之前AOP(二)部分相类似的概念和技术。AOP是Spring框架的一个核心特性,它提供了一种模块化和解耦的方式,让我们可以将关注点分离到...

    spring_aop_cglib的实现方式

    在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...

    day3-springAOP.md

    Spring AOP 主要依赖于动态代理技术,具体而言: - 当代理对象实现接口时,Spring 使用 JDK 动态代理。 - 当代理对象没有实现接口时,Spring 使用 CGLIB 动态代理。 Spring AOP 的强大之处在于其高度的灵活性和...

    springaop.rar

    本项目“springaop.rar”显然是一个使用Spring AOP的示例,通过注解的方式进行实现,便于在Eclipse和IDEA等集成开发环境中快速导入和运行。 在Spring AOP中,我们主要关注以下几个核心概念: 1. **切面(Aspect)*...

    Spring5_AOP.pdf

    最后,Spring AOP通过动态代理机制来实现AOP。动态代理分为JDK动态代理和CGLIB动态代理。对于有接口的类,Spring AOP使用JDK动态代理;对于没有接口的类,使用CGLIB动态代理。在使用JDK动态代理时,可以通过Proxy类...

    spring,aop解释

    Spring AOP使用动态代理技术创建切面,包括JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则适用于没有接口的类。当目标类实现了一个或多个接口时,Spring会创建一个与目标类实现相同接口的代理...

    Spring AOP 入门实例

    在Spring AOP中,切面可以是单独的类,通过`@Aspect`注解标识。 2. **连接点(Join Point)**:程序执行中的某个特定点,如方法的调用或异常的抛出。在Spring AOP中,连接点通常是方法执行。 3. **通知(Advice)*...

    spring-aop.zip

    在Spring AOP中,这些关注点被模块化为单独的对象,称为切面。 **切面的组成:** 1. **通知(Advice)**:通知是在特定连接点上执行的行为,比如方法调用前、后或异常发生时。 2. **连接点(Join Point)**:程序...

    spring_aop2.rar_java spring_spring

    在Java Spring框架中,AOP(面向切面编程)是一个重要的概念,它允许开发者定义“切面”,这些切面可以封装关注点,如日志、事务管理、性能监控等,从而将它们与业务逻辑分离。这有助于保持代码的整洁和模块化。...

    Spring Aop 例子

    这个例子将带你深入理解Spring AOP的核心概念和实践。 首先,我们要理解AOP的基本概念。AOP的主要目标是将那些与业务逻辑无关但又必须频繁进行的横切关注点(如日志、事务管理、性能监控等)模块化,从而提高代码的...

    使用动态代理面向切面编程(AOP)

    1. **AOP概念** - AOP(Aspect Oriented Programming)面向切面编程,是程序设计的一种新范式,旨在提高代码的可复用性和模块化。它通过将关注点(如日志、事务管理)分离到单独的模块——切面,来减少代码的耦合度...

    java注解方式实现SpringAop编程(源码+jar包)

    在Java编程领域,Spring AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点分离到单独的模块,这些模块可以独立于主业务逻辑进行管理。本教程将重点讲解如何通过注解方式来实现Spring AOP,并提供相关...

    AOP需要的Jar包

    本文将详细讲解与标题"AOP需要的Jar包"相关的知识点,包括AOP的基本概念、Spring AOP的实现机制以及相关依赖库的作用。 首先,AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点分离到单独...

    spring 之aop

    下面我们将详细阐述Spring AOP的基本概念、工作原理以及如何在实际项目中应用。 首先,理解AOP的基本概念: 1. **切面(Aspect)**:AOP的核心概念,它封装了系统中的某些关注点,这些关注点可能分布在多个类或方法...

    sqring aop 必须的四个jar包

    Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行功能增强或统一处理。在这个主题中,我们主要关注四个核心的jar包,它们是实现Spring AOP...

Global site tag (gtag.js) - Google Analytics