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(); } }
效果图:
相关推荐
`Spring的前置后置通知jar包`可能包含了一些预构建的AOP通知实现,例如日志库,它们可以方便地集成到Spring应用中,提供对方法执行前后的拦截能力。 总的来说,Spring的AOP机制提供了强大的灵活性,使得我们可以将...
在Spring AOP中,有三种主要的通知类型:前置通知、后置通知和环绕通知。下面将详细解释这三种通知,并通过简单的代码示例进行演示。 **1. 前置通知(Before Advice)** 前置通知在目标方法被调用之前执行,但无法...
NULL 博文链接:https://java-frog.iteye.com/blog/325364
1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
在这个例子中,我们将深入探讨Spring AOP中的前置通知、后置通知以及环绕通知的实现方式。 前置通知(Before Advice)在目标方法执行前触发,通常用于执行验证、初始化等操作。在Spring AOP中,我们可以使用`@...
本教程将深入探讨Spring AOP中的四种通知类型:前置通知、后置通知、环绕通知以及异常通知,并通过实际案例展示如何创建自定义切入点。 1. **前置通知**: 前置通知在目标方法执行前触发,通常用于执行验证或准备...
在Spring AOP(面向切面编程)中,我们可以通过注解配置来实现对目标方法的增强,...在阅读和理解源码时,可以深入了解Spring AOP的代理机制和通知执行流程,这将有助于更好地利用Spring AOP进行代码的模块化和解耦。
本例"spring通知例子"着重展示了如何利用Spring AOP实现操作日志的拦截,这涉及到前置通知(Before Advice)和后置通知(After Advice)的概念。 首先,我们需要理解什么是Spring AOP。AOP的核心是切面(Aspect),...
通过理解并熟练运用Spring.NET的通知类型和通知链,开发者可以有效地解耦业务逻辑,提高代码的可维护性和可扩展性。同时,利用AOP可以更好地实现系统级别的关注点分离,比如日志、事务、安全等,使代码更专注于业务...
Spring的五种通知和三种加载方式为开发者提供了灵活的AOP实现策略,帮助我们在不修改业务代码的情况下插入额外的功能,从而实现代码解耦和模块化。理解并熟练应用这些机制,可以使我们的代码更加优雅,易于维护。在...
总之,Spring AOP通过代理机制和通知机制,为开发者提供了一种优雅的方式,来处理那些横切关注点,提高了代码的复用性和模块化,降低了系统复杂性,使得业务逻辑更加清晰,提高了开发效率。无论是静态代理还是动态...
环绕通知可以在`proceed()`调用之前和之后执行自定义逻辑,因此它结合了前置通知、后置通知、异常通知和最终通知的功能。 1. **什么是环绕通知**: 环绕通知(Around Advice)是在方法执行前后都可插入自定义代码...
本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...
2. **后置通知**:无论方法是否成功执行,都会在其后调用。 3. **返回通知**:在方法成功执行并返回结果后调用。 4. **异常通知**:当目标方法抛出异常时调用。 5. **环绕通知**:在目标方法调用前后都执行,类似于...
FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate 和 ...
引入通知(Advisor)则将切入点和通知绑定在一起,形成一个完整的切面(Aspect)。Spring提供了多种方式来定义切入点,如基于方法名匹配的`NameMatchMethodPointcutAdvisor`和基于正则表达式的`...
在Spring AOP中,通知主要有五种类型:前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After Throwing)和环绕通知(Around)。 2. **@Before 前置通知** 使用`@Before`注解...
spring的简化aop,前置通知,后置通知的简写