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 { // private static final Exception NullPointerException = null; @Override public void save(User user) throws NullPointerException { //这里并没实现完整的数据库操作,仅为说明问题 System.out.println("==============================="); System.out.println("保存"); // try { // throw NullPointerException; // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } 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")); 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(); } }
LoggerAfter 通知
package aop; import java.util.Arrays; 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; /** * 通知 */ @Aspect public class LoggerAfter { private static final Logger logger = Logger.getLogger(Aspect.class); /** * 后置通知 * @param point * @param ret */ @AfterReturning(value="execution(* biz..*.*(..))",returning = "ret") public void afterReturning(JoinPoint point,Object ret){ logger.info("后置通知,传入的参数:"+point.getSignature()); } /** * 前置通知 * @param point */ @Before(value="execution(* biz..*.*(..))") public void before(JoinPoint point){ logger.info("前置通知,方法参数:"+Arrays.toString(point.getArgs())); } /** * 异常通知 * @param e */ @AfterThrowing(value="execution(* biz..*.*(..))",throwing="e") public void afterThrowing(RuntimeException e){ logger.info("异常通知:"+e.getMessage()); } /** * 环绕通知 * @param jp * @return */ @Around(value="execution(* biz..*.*(..))") public Object around(ProceedingJoinPoint jp){ logger.info(jp.getSignature().getName()+"环绕前"); Object re = null; try { re = jp.proceed(); logger.info("环绕后,返回值:"+re); } catch (Throwable e) { e.printStackTrace(); } return re; } /** * 最终通知 * @param point */ @After(value="execution(* biz..*.*(..))") public void after(JoinPoint point){ logger.info(point.getSignature().getName()+"最终增强"); } }
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="loggerAfter" class="aop.LoggerAfter"/> <!-- 自动代理 --> <aop:aspectj-autoproxy/> </beans>
测试数据
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注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...
本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一种元数据,允许程序员在源代码中嵌入信息,这些信息可以被...
Spring注解的处理主要由两部分组成:元注解和注解处理器。元注解是用于创建其他注解的注解,如`@Target`、`@Retention`、`@Documented`和`@Inherited`,它们定义了注解的使用位置、生命周期、是否出现在Javadoc中...
本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...
总结来说,Spring的注解式AOP提供了一种便捷的方式来实现横切关注点的模块化,使得开发者能够更好地关注核心业务逻辑,而不必在每个需要的地方重复编写相同的辅助代码。这种解耦的编程方式极大地提高了代码的可读性...
Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译过程,可以直接阅读源码注释来学习。 Spring 框架主要由以下几个关键模块组成: 1. **Core Container(核心...
在Spring中,我们可以通过注解来声明切点和通知。@Aspect注解用于定义一个切面类,该类包含了一个或多个切点表达式和通知方法。例如: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* ...
在Spring中,我们可以通过以下几种注解来实现AOP: 1. `@Aspect`:这个注解用于标记一个类为切面。切面类通常包含通知和切点定义。 2. `@Before`:此注解用于定义前置通知,即在目标方法执行前执行的代码。例如,...
标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...
下面我们将深入探讨如何使用注解来实现Spring AOP。 首先,我们需要了解AOP的基本概念。AOP是一种编程范式,旨在将横切关注点(如日志、事务管理、安全性等)从核心业务逻辑中分离出来。在Spring中,切面由通知...
本篇文章将深入探讨Spring AOP中的注解引入通知,以及如何利用它们来增强代码的可维护性和模块化。 首先,我们要理解什么是“引入通知”(Introduction Advice)。引入通知是Spring AOP的一种特殊类型的通知,它...
在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...
在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的实现,简化了配置并提高了代码的可读性。 首先,让我们理解AOP的基本概念。AOP是一种编程范式,允许程序员定义“切面”,这些切面封装了跨越多个...
在Spring AOP中,我们可以通过`@Aspect`注解定义一个类作为切面,并使用`@Before`、`@After`、`@Around`等注解来定义通知(advice),这些通知会在特定的方法执行前后被调用。 ```java @Aspect @Component public ...
- 使用`@Aspect`注解来声明一个切面类,切面类中定义了`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等通知方法,它们分别代表前置、后置、环绕、返回后和异常后执行的逻辑。 - 使用`@...
环绕通知是功能最强大的通知类型,通常使用`@Around`注解来实现。 5. 引用通知(After (Finally) Advice): 不论目标方法正常执行还是抛出异常,都会执行的代码,类似于Java中的finally块。`@After`注解用于定义...
总结来说,这个Spring AOP注解方式的Demo展示了如何通过简单的注解定义切面、切点和通知,实现对业务逻辑的无侵入式增强。这种方式使得代码更简洁、可读性更强,同时也充分利用了Spring框架的优势。对于理解和实践...
本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...
通过以上步骤,我们可以使用Spring注解方式实现AOP,将关注点如日志、缓存等与业务逻辑分离,提高代码的可读性和可维护性。在实际项目中,可以灵活运用这些知识来优化代码结构,降低复杂性。希望本教程对理解和应用...