第一种是基于annotation方式注入
(1)定义一个Aspect对象LogBeforeAdvice
package org.aop;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LogBeforeAdvice {
private Logger logger = Logger.getLogger(this.getClass().getName());
@Pointcut("execution(* org.aop.IHello.*(..))")
private void logging(){}
@Before("logging()")
public void before(JoinPoint joinPoint){
logger.log(Level.INFO,"method start ..." + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
}
@AfterReturning(pointcut="logging()" ,returning="retVal")
public void afterReturning(JoinPoint joinPoint ,Object retVal){
logger.log(Level.INFO,"method end ..." + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
}
}
(2)定义一个接口类IHello
package org.aop;
public interface IHello {
public void hello(String hello);
}
(3)定义一个实现类HelloSpeaker
package org.aop;
public class HelloSpeaker implements IHello {
public void hello(String hello) {
System.out.println("你好! " + hello);
}
}
(4)配置Spring配置文件
<?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.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="logBeforeAdvice" class="org.aop.LogBeforeAdvice"></bean>
<bean id="helloSpeaker" class="org.aop.HelloSpeaker"></bean>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
最后编写测试类
package org.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AOPTest {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IHello hello = (IHello) context.getBean("helloSpeaker");
hello.hello("陈胜尊");
}
}
测试结果为
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
2011-4-26 21:32:37 org.aop.LogBeforeAdvice before
信息: method start ...org.aop.IHello.hello
你好! 陈胜尊
2011-4-26 21:32:37 org.aop.LogBeforeAdvice afterReturning
信息: method end ...org.aop.IHello.hello
第二种方式是基于XML方式注册
(1)把Aspect类修改为
package org.aop;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.aspectj.lang.JoinPoint;
public class LogBeforeAdvice {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void before(JoinPoint joinPoint) {
logger.log(Level.INFO, "method start ..."
+ joinPoint.getSignature().getDeclaringTypeName() + "."
+ joinPoint.getSignature().getName());
}
public void afterReturning(JoinPoint joinPoint) {
logger.log(Level.INFO, "method end ..."
+ joinPoint.getSignature().getDeclaringTypeName() + "."
+ joinPoint.getSignature().getName());
}
}
(2)修改配置文件为
<aop:config>
<aop:aspect id="loggin" ref="logBeforeAdvice">
<aop:pointcut id="helloLog" expression="execution(* org.aop.IHello.*(**))"/>
<aop:before
pointcut-ref="helloLog"
method="before"
/>
<aop:after-returning
pointcut-ref="helloLog"
method="afterReturning"
/>
</aop:aspect>
</aop:config >
执行结果是一样的
分享到:
相关推荐
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...
Spring AOP支持基于代理和基于注解的两种方式。基于代理的方式通过生成代理类来拦截方法调用,而基于注解的方式则更易于理解和使用。 总结,Spring框架的IoC和AOP特性极大地简化了Java开发,通过依赖注入解耦了组件...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过在运行时插入额外的行为(如日志记录、性能监控等)来增强对象的功能。动态代理则是Spring AOP实现的核心技术之一...
在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了众多功能,包括依赖注入、面向切面编程(AOP)等。本文将详细介绍在使用Spring AOP时所需的两个关键jar包:aopalliance-1.0.jar和aspectjweaver-...
在Spring中,AOP主要通过两种方式实现:基于代理的AOP和基于注解的AOP。 1. **基于代理的AOP**:Spring使用JDK动态代理或者CGLIB代理来创建目标对象的代理对象,代理对象在调用真实方法前后执行增强逻辑。 2. **...
在Java编程领域,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,...熟悉这两种方式,将有助于提升我们在Java开发中的灵活性和代码复用性。
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和解耦的编程方式,使得开发者可以将关注点分离到不同的切面中,而不是混杂在业务逻辑代码里。本测试项目旨在帮助理解并实践Spring AOP的...
综上所述,Spring AOP提供了通过XML配置和AOP标签两种方式来实现切面编程,帮助开发者更高效地组织代码,降低维护成本。无论选择哪种方式,理解切入点表达式、通知类型和切面的概念都是至关重要的。在Spring 2.5及...
Spring支持两种类型的代理:JDK动态代理和CGLIB代理。前者适用于接口实现类,后者则用于无接口类。配置AOP时,我们通常会定义一个切面(Aspect),包含切入点表达式(Pointcut Expression)来指定需要拦截的方法,...
Spring AOP支持两种织入方式:编译时织入(通过AspectJ编译器)和运行时织入(通过代理)。 在这个实例中,我们将主要关注运行时织入,因为它更易于理解和实施。首先,我们需要定义一个切面类,这个类通常包含一个...
Spring AOP的实现主要分为两种方式:代理模式和织入。代理模式包括JDK动态代理和CGLIB代理,它们主要用于处理基于接口的类。如果目标对象实现了接口,Spring会使用JDK动态代理;如果没有,它会使用CGLIB生成一个代理...
Spring提供了两种主要的AOP实现方式:基于代理(Proxy-based)和基于注解(Annotation-based)。 - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行...
在Java开发领域,Spring框架是不可或缺的一部分,而Spring AOP(面向切面编程)则是Spring框架中的重要特性,它提供了一种优雅的方式来处理系统中的横切关注点,如日志、事务管理等。本篇文章将深入探讨如何通过XML...
Spring支持构造器注入、设值注入和接口注入三种方式。 3. **自动装配**:Spring提供了一种自动装配机制,可以根据Bean的类型和名称自动寻找并注入依赖。 4. **Bean的作用域**:Spring支持单例(Singleton)、原型...
在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类实现了至少一个接口时,Java会生成一个代理类来执行增强的代码。而CGLIB则是在运行时通过字节码技术生成一个子类,用于...
在实际开发中,Spring AOP的配置可以通过XML或Java配置进行,也可以使用注解方式声明切面和通知。例如,你可以使用`@Aspect`注解定义一个切面类,然后用`@Before`、`@After`、`@Around`等注解定义不同的通知类型。 ...
Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于接口,当目标类实现了接口时使用;而CGLIB代理则在目标类没有实现接口时使用,它通过字节码技术创建代理对象。 **六、实战应用** 1. 日志记录:...