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
效果图:
相关推荐
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是...Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
在这个例子中,我们将深入探讨Spring AOP中的前置通知、后置通知以及环绕通知的实现方式。 前置通知(Before Advice)在目标方法执行前触发,通常用于执行验证、初始化等操作。在Spring AOP中,我们可以使用`@...
本篇将详细探讨如何使用切入点匹配方法实现Spring AOP的环绕通知。 首先,理解AOP的核心概念: 1. 切面(Aspect):切面是关注点的模块化,它封装了横切关注点,如日志、事务等。 2. 连接点(Join Point):程序...
在Spring AOP中,有三种主要的通知类型:前置通知、后置通知和环绕通知。下面将详细解释这三种通知,并通过简单的代码示例进行演示。 **1. 前置通知(Before Advice)** 前置通知在目标方法被调用之前执行,但无法...
在Spring AOP(面向切面编程)中,我们可以通过注解配置来实现对目标方法的增强,例如前置通知、后置通知、环绕通知和异常通知。这些通知在特定的时机执行,提供了灵活的代码逻辑插入点。下面我们将详细探讨如何在...
除了`@Before`和`@After`,Spring还提供了其他的通知类型,如返回后通知`@AfterReturning`(仅在方法正常返回时执行)、异常后通知`@AfterThrowing`(仅在方法抛出异常时执行)和环绕通知`@Around`(可以在方法执行...
springMybatis,springmvc,环绕通知,时间转换,des,md5加密账户密码.拦截器
5. **环绕通知**:在目标方法调用前后都执行,类似于设计模式中的装饰者模式。 ### Spring通知的XML配置示例解析 在给定的文件片段中,我们可以看到Spring的通知配置是通过XML文件来实现的。下面是对这个示例的...
1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
Spring.NET中的`MethodInterceptor`接口用于创建环绕通知。 - **引介通知(Introduction Advice)**: 引介通知可以在代理对象上添加新的接口和/或属性,而无需修改原始类的源代码。在Spring.NET中,通过实现`...
环绕通知是功能最强大的通知类型,通常使用`@Around`注解来实现。 5. 引用通知(After (Finally) Advice): 不论目标方法正常执行还是抛出异常,都会执行的代码,类似于Java中的finally块。`@After`注解用于定义...
"声明环绕通知"是Spring AOP中的一个重要概念,它提供了在方法执行前后完全控制逻辑的能力。本文将深入探讨这一主题。 首先,让我们明确什么是环绕通知。环绕通知是Spring AOP五种通知类型中最强大的一种。与前置...
在Spring AOP中,通知主要有五种类型:前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After Throwing)和环绕通知(Around)。 2. **@Before 前置通知** 使用`@Before`注解...
在Spring AOP(面向切面编程)中,切面环绕通知是一种强大的机制,它允许我们在方法执行前后插入自定义的行为,比如记录日志、事务管理等。本篇将深入探讨如何利用Spring AOP的切面环绕通知来实现一个日志记录系统,...
环绕通知是在目标方法调用前后都会执行的通知类型,它是四种通知中最强大的一种,因为它不仅可以控制目标方法是否被调用,还可以完全控制返回值。要实现环绕通知,类需实现`MethodInterceptor`接口并实现`invoke`...
1. **环绕通知(Around)开始**:环绕通知首先执行,它包裹整个方法调用,通常通过`ProceedingJoinPoint`对象来决定何时调用目标方法。 2. **前置通知(Before)**:在环绕通知内部,然后执行前置通知。 3. **环绕...
本教程将深入探讨Spring AOP中的四种通知类型:前置通知、后置通知、环绕通知以及异常通知,并通过实际案例展示如何创建自定义切入点。 1. **前置通知**: 前置通知在目标方法执行前触发,通常用于执行验证或准备...
除了`@DeclareParents`,还有其他类型的注解通知,如`@Before`(前置通知)、`@After`(后置通知)、`@Around`(环绕通知)等,它们分别在目标方法执行前、执行后和执行前后进行拦截操作。 至于`icalculator -...
环绕通知是最强大的通知类型,它在方法调用前后都能执行,并且可以控制方法是否执行以及如何执行。环绕通知通过`org.aspectj.lang.ProceedingJoinPoint`接口的`proceed()`方法来调用目标方法。它可以实现其他所有...