`
chaoyi
  • 浏览: 309195 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring 环绕通知

 
阅读更多

User 实体类

package entity;

/**
 * 用户实体类
 */
public class User implements java.io.Serializable {
	private Integer id; // 用户ID
	private String username; // 用户名
	private String password; // 密码
	private String email; // 电子邮件
	public User() {
		super();
	}
	public User(Integer id, String username, String password, String email) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.email = email;
	}
	// getter & setter
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return "\nUser [id=" + id + ", username=" + username + ", password=" + password + ", email="
				+ email + "]";
	}

}

 

UserDao 接口与实现

package dao;
import java.util.List;
import entity.User;
/**
 * 增加DAO接口,定义了所需的持久化方法
 */
public interface UserDao {
	public void save(User user);
	public List<User> getAll();
}

 

package dao.impl;
import java.util.ArrayList;
import java.util.List;
import dao.UserDao;
import entity.User;
/**
 * 用户 DAO 类,实现 IDao 接口,负责 User 类持久化操作
 * */
public class UserDaoImpl implements UserDao {

	@Override
	public void save(User user) {
		//这里并没实现完整的数据库操作,仅为说明问题
		System.out.println("===============================");
		System.out.println("保存");
		System.out.println("===============================");
	}
	@Override
	public List<User> getAll() {
		List<User> users = new ArrayList<User>();
		users.add(new User(1, "景临境 ", "123456", "963@qq.com"));
		users.add(new User(2, "何开 ", "123456", "963@qq.com"));
		users.add(new User(3, "左阻 ", "123456", "963@qq.com"));
		users.add(new User(4, "暴天明", "123456", "963@qq.com"));
		System.out.println("===============================");
		System.out.println("得到所有的用户");
		System.out.println("===============================");
		return users;
	}
}

 

UserBiz 接口与实现

package biz;
import java.util.List;
import entity.User;
/**
 * 用户业务接口,定义了所需的业务方法
 */
public interface UserBiz {
	public void addNewUser(User user);
	public List<User> findAllUsers();
}

 

package biz.impl;
import java.util.List;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import biz.UserBiz;
/**
 * 用户业务类,实现对 User 功能的业务管理
 * */
public class UserBizImpl implements UserBiz {
	//声明接口类型的引用,和具体实现类解耦合
	private UserDao userDao = new UserDaoImpl();
	//dao 属性的 setter 访问器,会被 Spring 调用,实现市值注入
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public void addNewUser(User user) {
		//调用用户 DAO 的方法保存用户信息
		userDao.save(user);
	}
	@Override
	public List<User> findAllUsers() {
		// TODO Auto-generated method stub
		return userDao.getAll();
	}
}

 

aop 通知

package aop;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
/**
 * 通过 MethodInterceptor 接口实现环线增强
 */
public class AroundLogger implements MethodInterceptor {
	private static final Logger log = Logger.getLogger(AroundLogger.class);
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object target = invocation.getThis();//获取被代理对象
		Method method = invocation.getMethod();//获取被代理方法
		Object[] args = invocation.getArguments();//获取方法参数
		log.info("调用"+target+"的"+method.getName()+"方法。方法入参:"+Arrays.toString(args));
		try {
			Object result = invocation.proceed();//调用目标方法,获取目标方法返回值
			log.info("调用"+target+"的"+method.getName()+"方法。方法返回值:"+result);
			return result;
		} catch (Throwable e) {
			log.error(method.getName()+"方法发生异常:"+e);
			throw e;
		}
	}
}

 

applicationContext.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.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
	">
	<!-- DAO类 -->
	<bean id="userDao" class="dao.impl.UserDaoImpl" />
	<!-- 业务类 -->
	<bean id="userBiz" class="biz.impl.UserBizImpl">
		<property name="userDao" ref="userDao"></property>
	</bean>
	<!-- 配置环线通知 -->
	<bean name="aroundLogger" class="aop.AroundLogger"/>
	<!-- AOP 织入 -->
	<aop:config>
		<!-- 切点(织入点)业务包和子包中所有的类和方法都是织入点 -->
		<aop:pointcut expression="execution(* biz..*.*(..))" id="pointcut"/>
		<!-- 要织入的对象 -->
		<aop:advisor advice-ref="aroundLogger" pointcut-ref="pointcut"/>
	</aop:config>
</beans>

 

Test 测试数据

package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import entity.User;
import biz.UserBiz;
public class Test {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserBiz userBiz = (UserBiz) ctx.getBean("userBiz");
		User user = new User();
		user.setId(1);
		user.setUsername("test");
		user.setPassword("123456");
		user.setEmail("963@qq.com");
		userBiz.addNewUser(user);
		userBiz.findAllUsers();
	}
}

 

log4j.properties 日记文件

# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
# 下面的属性配置中,所有日志的输出级别是info,输出源是console
log4j.rootLogger=info,console
# 定义输出源的输入位置是控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 定义输出日志的布局采用的类
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 定义日志输出布局
log4j.appender.console.layout.ConversionPattern=%d %p [%c]%n - %m%n

 

效果图:

 

 

  • 大小: 102.9 KB
分享到:
评论

相关推荐

    spring环绕通知图示

    Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是...Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

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

    在这个例子中,我们将深入探讨Spring AOP中的前置通知、后置通知以及环绕通知的实现方式。 前置通知(Before Advice)在目标方法执行前触发,通常用于执行验证、初始化等操作。在Spring AOP中,我们可以使用`@...

    使用切入点匹配方法实现Spring AOP环绕通知

    本篇将详细探讨如何使用切入点匹配方法实现Spring AOP的环绕通知。 首先,理解AOP的核心概念: 1. 切面(Aspect):切面是关注点的模块化,它封装了横切关注点,如日志、事务等。 2. 连接点(Join Point):程序...

    spring的Aop中的前置通知,后置通知以及环绕通知简单代码

    在Spring AOP中,有三种主要的通知类型:前置通知、后置通知和环绕通知。下面将详细解释这三种通知,并通过简单的代码示例进行演示。 **1. 前置通知(Before Advice)** 前置通知在目标方法被调用之前执行,但无法...

    spring aop的注解配置中,前置,后置,环绕通知,以及异常通知怎么获得被代理方法的参数

    在Spring AOP(面向切面编程)中,我们可以通过注解配置来实现对目标方法的增强,例如前置通知、后置通知、环绕通知和异常通知。这些通知在特定的时机执行,提供了灵活的代码逻辑插入点。下面我们将详细探讨如何在...

    Spring 前置通知和后置通知

    除了`@Before`和`@After`,Spring还提供了其他的通知类型,如返回后通知`@AfterReturning`(仅在方法正常返回时执行)、异常后通知`@AfterThrowing`(仅在方法抛出异常时执行)和环绕通知`@Around`(可以在方法执行...

    springMybatis,springmvc,环绕通知,时间转换,des,md5加密

    springMybatis,springmvc,环绕通知,时间转换,des,md5加密账户密码.拦截器

    Spring通知的配置

    5. **环绕通知**:在目标方法调用前后都执行,类似于设计模式中的装饰者模式。 ### Spring通知的XML配置示例解析 在给定的文件片段中,我们可以看到Spring的通知配置是通过XML文件来实现的。下面是对这个示例的...

    Spring AOP运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。

    1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景

    Spring.net通知类型,以及通知链

    Spring.NET中的`MethodInterceptor`接口用于创建环绕通知。 - **引介通知(Introduction Advice)**: 引介通知可以在代理对象上添加新的接口和/或属性,而无需修改原始类的源代码。在Spring.NET中,通过实现`...

    Spring中的5种通知和3种加载通知的方式

    环绕通知是功能最强大的通知类型,通常使用`@Around`注解来实现。 5. 引用通知(After (Finally) Advice): 不论目标方法正常执行还是抛出异常,都会执行的代码,类似于Java中的finally块。`@After`注解用于定义...

    声明环绕通知

    "声明环绕通知"是Spring AOP中的一个重要概念,它提供了在方法执行前后完全控制逻辑的能力。本文将深入探讨这一主题。 首先,让我们明确什么是环绕通知。环绕通知是Spring AOP五种通知类型中最强大的一种。与前置...

    Spring 使用注解来实现通知

    在Spring AOP中,通知主要有五种类型:前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After Throwing)和环绕通知(Around)。 2. **@Before 前置通知** 使用`@Before`注解...

    加入切面环绕通知实现,日志比较完善的使用方式

    在Spring AOP(面向切面编程)中,切面环绕通知是一种强大的机制,它允许我们在方法执行前后插入自定义的行为,比如记录日志、事务管理等。本篇将深入探讨如何利用Spring AOP的切面环绕通知来实现一个日志记录系统,...

    Spring AOP四种创建通知(拦截器)类型

    环绕通知是在目标方法调用前后都会执行的通知类型,它是四种通知中最强大的一种,因为它不仅可以控制目标方法是否被调用,还可以完全控制返回值。要实现环绕通知,类需实现`MethodInterceptor`接口并实现`invoke`...

    Spring通知执行顺序 -回复 1

    1. **环绕通知(Around)开始**:环绕通知首先执行,它包裹整个方法调用,通常通过`ProceedingJoinPoint`对象来决定何时调用目标方法。 2. **前置通知(Before)**:在环绕通知内部,然后执行前置通知。 3. **环绕...

    前置后置环绕异常通知

    本教程将深入探讨Spring AOP中的四种通知类型:前置通知、后置通知、环绕通知以及异常通知,并通过实际案例展示如何创建自定义切入点。 1. **前置通知**: 前置通知在目标方法执行前触发,通常用于执行验证或准备...

    Spring之AOP注解之引入通知

    除了`@DeclareParents`,还有其他类型的注解通知,如`@Before`(前置通知)、`@After`(后置通知)、`@Around`(环绕通知)等,它们分别在目标方法执行前、执行后和执行前后进行拦截操作。 至于`icalculator -...

    spring通知

    环绕通知是最强大的通知类型,它在方法调用前后都能执行,并且可以控制方法是否执行以及如何执行。环绕通知通过`org.aspectj.lang.ProceedingJoinPoint`接口的`proceed()`方法来调用目标方法。它可以实现其他所有...

Global site tag (gtag.js) - Google Analytics