`
chaoyi
  • 浏览: 309196 次
  • 性别: 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.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
/**
 * 通过 MethodBeforeAdvice 实现前置增强
 */
public class LoggerBefore implements MethodBeforeAdvice {
	private static final Logger log = Logger.getLogger(LoggerBefore.class);
	/**
	 * @param method 方法对象
	 * @param arguments 方法参数数组
	 * @param target 调用方法的对象
	 */
	@Override
	public void before(Method method, Object[] arguments, Object target)
			throws Throwable {
		log.info("调用"+target+"的"+method.getName()+"方法。方法的返回值:"
				+Arrays.toString(arguments));
	}
}

 

package aop;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
/**
 * 通过 AfterReturningAdvice 实现后置增强
 * */
public class LoggerAfterReturning implements AfterReturningAdvice {
	private static final Logger log = Logger.getLogger(LoggerAfterReturning.class);
	
	/**
	 * @param returnValue 返回值
	 * @param method 方法对象
	 * @param arguments 方法参数数组
	 * @param target 调用方法的对象
	 */
	@Override
	public void afterReturning(Object returnValue, Method method, Object[] arguments,
			Object target) throws Throwable {
		log.info("调用"+target+"的"+method.getName()+"方法。方法的返回值:"
			+returnValue);
	}
}

 

 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:p="http://www.springframework.org/schema/p"
	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="loggerBefore" class="aop.LoggerBefore"/>
	<!-- 后置增强 -->
	<bean name="loggerAfterReturning" class="aop.LoggerAfterReturning"/>
	<!-- AOP 织入 -->
	<aop:config>
		<!-- 切点(织入点)业务包和子包中所有的类和方法都是织入点 -->
		<aop:pointcut expression="execution(* biz..*.*(..))" id="pointcut"/>
		<!-- 要织入的对象 -->
		<aop:advisor advice-ref="loggerBefore" pointcut-ref="pointcut"/>
		<aop:advisor advice-ref="loggerAfterReturning" 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();
	}
}

 

效果图:

 

 

 

 

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

相关推荐

    spring简单前置通知、后置处理

    `Spring的前置后置通知jar包`可能包含了一些预构建的AOP通知实现,例如日志库,它们可以方便地集成到Spring应用中,提供对方法执行前后的拦截能力。 总的来说,Spring的AOP机制提供了强大的灵活性,使得我们可以将...

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

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

    spring简单前置通知、后置处理。

    NULL 博文链接:https://java-frog.iteye.com/blog/325364

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

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

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

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

    前置后置环绕异常通知

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

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

    在Spring AOP(面向切面编程)中,我们可以通过注解配置来实现对目标方法的增强,...在阅读和理解源码时,可以深入了解Spring AOP的代理机制和通知执行流程,这将有助于更好地利用Spring AOP进行代码的模块化和解耦。

    spring通知例子

    本例"spring通知例子"着重展示了如何利用Spring AOP实现操作日志的拦截,这涉及到前置通知(Before Advice)和后置通知(After Advice)的概念。 首先,我们需要理解什么是Spring AOP。AOP的核心是切面(Aspect),...

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

    通过理解并熟练运用Spring.NET的通知类型和通知链,开发者可以有效地解耦业务逻辑,提高代码的可维护性和可扩展性。同时,利用AOP可以更好地实现系统级别的关注点分离,比如日志、事务、安全等,使代码更专注于业务...

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

    Spring的五种通知和三种加载方式为开发者提供了灵活的AOP实现策略,帮助我们在不修改业务代码的情况下插入额外的功能,从而实现代码解耦和模块化。理解并熟练应用这些机制,可以使我们的代码更加优雅,易于维护。在...

    spring AOP代理机制.docx

    总之,Spring AOP通过代理机制和通知机制,为开发者提供了一种优雅的方式,来处理那些横切关注点,提高了代码的复用性和模块化,降低了系统复杂性,使得业务逻辑更加清晰,提高了开发效率。无论是静态代理还是动态...

    Spring 环绕通知

    环绕通知可以在`proceed()`调用之前和之后执行自定义逻辑,因此它结合了前置通知、后置通知、异常通知和最终通知的功能。 1. **什么是环绕通知**: 环绕通知(Around Advice)是在方法执行前后都可插入自定义代码...

    spring AOP注解的应用1

    本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...

    Spring通知的配置

    2. **后置通知**:无论方法是否成功执行,都会在其后调用。 3. **返回通知**:在方法成功执行并返回结果后调用。 4. **异常通知**:当目标方法抛出异常时调用。 5. **环绕通知**:在目标方法调用前后都执行,类似于...

    尚硅谷佟刚Spring4代码及PPT.rar

    FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate 和 ...

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

    引入通知(Advisor)则将切入点和通知绑定在一起,形成一个完整的切面(Aspect)。Spring提供了多种方式来定义切入点,如基于方法名匹配的`NameMatchMethodPointcutAdvisor`和基于正则表达式的`...

    Spring 使用注解来实现通知

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

    本地调用AOP

    spring的简化aop,前置通知,后置通知的简写

Global site tag (gtag.js) - Google Analytics