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

spring-aop的注解实现1

 
阅读更多

切面类:

package com.aop;

 

import org.apache.log4j.Logger;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Around;

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 AllLogAdvice {

private Logger logger = Logger.getLogger(AllLogAdvice.class);

 

// @Pointcut("execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")

// @Pointcut("within(com.test.spring.aop.pointcutexp..*)")

// @Pointcut("this(com.test.spring.aop.pointcutexp.Intf)")

// @Pointcut("target(com.test.spring.aop.pointcutexp.Intf)")

// @Pointcut("@within(org.springframework.transaction.annotation.Transactional)")

// @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")

// @Pointcut("args(String)")

@Pointcut("execution(* com.service.UserService.add*(..)) || execution(* com.service.UserService.delete*(..))")

public void pointcut1() {

// 定义一个pointcut,下面用Annotation标注的通知方法可以公用这个pointcut

System.out.println("************erery invoke");

}

 

// 前置通知

// 拦截参数为一个String类型的方法

@Before("pointcut1() && args(temp)")

public void myBeforeAdvice(String temp) {// 如果需要知道拦截的方法的信息,也可以需添加JoinPoint参数

String logInfoText = "这是前置通知" + temp;

// 将日志信息写入配置的文件中

logger.info(logInfoText);

}

 

// 后置通知

// 拦截 返回类型为String 的方法

@AfterReturning(pointcut = "pointcut1()", returning = "result")

public void myAfterReturnAdvice(String result) {

logger.info("这是后置通知  " + " result: " + result);

}

 

// 最终置通知

@After("execution(* com.service.**.*(..))")

public void doAfter() {

logger.info("这是最终通知");

}

 

// 异常通知

@AfterThrowing(pointcut = "pointcut1()", throwing = "e")

public void myThrowingAdvice(JoinPoint jionpoint, Exception e) {

// 获取被调用的类名

String targetClassName = jionpoint.getTarget().getClass().getName();

// 获取被调用的方法名

String targetMethodName = jionpoint.getSignature().getName();

// 日志格式字符串

String logInfoText = "异常通知:执行" + targetClassName + "类的"

+ targetMethodName + "方法时发生异常";

// 将日志信息写入配置的文件中

logger.info(logInfoText);

}

 

// 环绕通知

// @Around(value="pointcut1()")

@Around("pointcut1()")

public Object myAroundAdvice(ProceedingJoinPoint jionpoint)

throws Throwable {

// 获取被调用的方法名

String targetMethodName = jionpoint.getSignature().getName();

//Object o = jionpoint.proceed();

String logInfoText = "这是环绕通知:" + targetMethodName;

logger.info(logInfoText);

Object o = jionpoint.proceed();//注意写到这儿的话,环绕通知和其它通知的顺序

return o;

}

}

 

 

配置文件:

<?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:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!-- 开启注解扫描 -->

    <context:component-scan base-package="com.aop"/>

    <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->

    <aop:aspectj-autoproxy/>

    <bean id="myUserService" class="com.service.UserService"></bean>

</beans>

 

业务接口和实现类:

package com.service;

 

public class UserService implements IUserService {

 

public int addUser(String name, int age) {

//省略诸如操作数据库等复杂的逻辑操作

System.out.println("add user "+ name +" successfully");

return 1;

}

 

public void deleteUser(String name) {

//省略诸如操作数据库等复杂的逻辑操作

System.out.println("deleted one user named " + name);

//throw new RuntimeException("这是特意抛出的异常信息!");

}

}

 

package com.service;

 

public interface IUserService {

public int addUser(String name, int age);

public void deleteUser(String name);

}

 

 

测试类:

package com.test;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import com.service.IUserService;

 

public class MainTest {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml");

IUserService userService = (IUserService) context

.getBean("myUserService");

 

userService.addUser("ton", 56);

userService.deleteUser("ton");

}

}

 

最后附上日志文件:

log4j.rootLogger=info,stdout,info,debug,error

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n

 

log4j.logger.info=info

log4j.appender.info=org.apache.log4j.DailyRollingFileAppender

log4j.appender.info.layout=org.apache.log4j.PatternLayout

log4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n

log4j.appender.info.datePattern='.'yyyy-MM-dd

log4j.appender.info.Threshold = INFO 

log4j.appender.info.append=true

log4j.appender.info.File=${webApp.root}/WEB-INF/logs/info.log

 

log4j.logger.debug=debug

log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender

log4j.appender.debug.layout=org.apache.log4j.PatternLayout

log4j.appender.debug.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n

log4j.appender.debug.datePattern='.'yyyy-MM-dd

log4j.appender.debug.Threshold = DEBUG 

log4j.appender.debug.append=true

log4j.appender.debug.File=${webApp.root}/WEB-INF/logs/debug.log

 

log4j.logger.error=error

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender

log4j.appender.error.layout=org.apache.log4j.PatternLayout

log4j.appender.error.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n

log4j.appender.error.datePattern='.'yyyy-MM-dd

log4j.appender.error.Threshold = ERROR 

log4j.appender.error.append=true

log4j.appender.error.File=${webApp.root}/WEB-INF/logs/error.log 

 

分享到:
评论

相关推荐

    spring-aop-jar

    在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...

    spring-aop注解jar包

    spring-aop注解用到的jar包,解压后直接导入即可使用。

    commons-logging-1.1.3,spring-test-4.0.0.RELEASE,spring-aop-4.0.0.RELEASE

    commons-logging-1.1.3,spring-test-4.0.0.RELEASE,spring-aop-4.0.0.RELEASE,spring-aspects-4.0.0.RELEASE

    spring-aop.jar

    1. **AOP代理**:Spring AOP支持两种代理方式,即JDK动态代理和CGLIB代理。JDK代理用于实现接口的类,而CGLIB代理则用于未实现接口的类。spring-aop.jar包含了这些代理机制的相关类,如`org.springframework.aop....

    spring-aop-4.2.4.RELEASE

    spring-aop-4.2.4.RELEASE,spring注解包,代码里面特殊标记,使用注解可以完成功能,相当于语法糖操作

    spring aop注解方式、xml方式示例

    Spring AOP提供了注解和XML两种方式来实现切面编程。注解方式更加简洁,易于理解和维护,适用于大多数情况。而XML配置方式则在复杂场景下更具灵活性,如需要动态调整切面配置时。在实际项目中,可以根据需求选择适合...

    spring-aop-4.2.6.RELEASE.zip

    1. **增强的注解支持**:Spring AOP 4.2.6.RELEASE对基于注解的切面进行了强化,允许开发者使用@Aspect注解定义切面,使用@Before、@After、@Around等注解定义通知(advisors),极大地简化了代码编写。 2. **更...

    spring-aop-4.0.0.RELEASE

    在4.0.0.RELEASE版本中,Spring AOP进一步优化了其性能和易用性,特别是对于基于注解的配置,使得bean装配更加简洁高效。本文将深入探讨Spring AOP的核心概念、主要功能以及实际应用。 1. **AOP核心概念** - **切...

    spring-boot aop

    1. **引入依赖**:在`pom.xml`或`build.gradle`文件中添加Spring AOP和AspectJ的依赖。对于Maven,添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-aop ``` 2. ...

    spring-aop-annotation-log-all

    这里zip压缩包囊括了学习Spring过程中用到的所有的jar包; 有: ...spring-web-4.1.2.RELEASE.jar //aop注解需要 对于Spring环境的插件,你们可以到Eclipase中的help&gt;Eclipse marketplace...去搜索安装

    spring-aop和注解的实例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。这些关注点通常与业务逻辑无关,但又在多个地方被用到,AOP就是为了...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    Spring-Aop所有jar

    3. 注解驱动的事务管理:Spring AOP可以和Spring的声明式事务管理配合使用,通过@Transactional注解实现事务控制。 4. 支持更多类型的代理:除了默认的JDK动态代理,Spring 4.0也支持使用CGLIB代理,对于没有接口的...

    spring-aop

    Spring AOP就是为了解决这种问题而设计的,它允许我们将这些横切关注点与业务逻辑分离,实现代码的模块化和可重用性。 AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut...

    Spring-AOP demo

    1. **注解驱动的AOP**:Spring支持使用注解来定义切面,如`@Aspect`用于声明一个类为切面,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`分别定义前置通知、后置通知、环绕通知、返回后通知...

    spring-aop实例demo

    1. **配置AOP**:在Spring配置文件中启用AOP代理。这可以通过设置`&lt;aop:aspectj-autoproxy&gt;`或`&lt;aop:config&gt;`元素来完成。例如: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    Spring-AOP(前置/后置/环绕)通知的例子

    Spring AOP,全称Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,它引入了面向切面编程的概念,使得开发者可以方便地实现横切关注点,如日志、事务管理等,而无需侵入到业务代码中。在这个例子中...

    spring-aop-4.3.6.RELEASE.jar

    Spring注解扫描需要的包。Spring 经过十多年的快速发展和更新,以其独特的创新带来了大量的拥趸者,在选择方面还带来了更多选择!

Global site tag (gtag.js) - Google Analytics