`
chaoyi
  • 浏览: 309207 次
  • 性别: 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 {
//	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();
	}
}

 

 

效果图:

 

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

相关推荐

    使用Spring的注解方式实现AOP的细节

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    对Spring中注解怎么实现的一些基本原理

    本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一种元数据,允许程序员在源代码中嵌入信息,这些信息可以被...

    spring中注解的实现原理

    Spring注解的处理主要由两部分组成:元注解和注解处理器。元注解是用于创建其他注解的注解,如`@Target`、`@Retention`、`@Documented`和`@Inherited`,它们定义了注解的使用位置、生命周期、是否出现在Javadoc中...

    spring AOP注解的应用1

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

    使用Spring的注解方式实现AOP

    总结来说,Spring的注解式AOP提供了一种便捷的方式来实现横切关注点的模块化,使得开发者能够更好地关注核心业务逻辑,而不必在每个需要的地方重复编写相同的辅助代码。这种解耦的编程方式极大地提高了代码的可读性...

    spring源码注释中文

    Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译过程,可以直接阅读源码注释来学习。 Spring 框架主要由以下几个关键模块组成: 1. **Core Container(核心...

    Spring基于注解实现AOP

    在Spring中,我们可以通过注解来声明切点和通知。@Aspect注解用于定义一个切面类,该类包含了一个或多个切点表达式和通知方法。例如: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* ...

    使用Spring的注解方式实现AOP入门

    在Spring中,我们可以通过以下几种注解来实现AOP: 1. `@Aspect`:这个注解用于标记一个类为切面。切面类通常包含通知和切点定义。 2. `@Before`:此注解用于定义前置通知,即在目标方法执行前执行的代码。例如,...

    Spring 使用AspectJ 实现 AOP之前置通知小例子

    标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...

    Spring 基于注解方式实现AOP

    下面我们将深入探讨如何使用注解来实现Spring AOP。 首先,我们需要了解AOP的基本概念。AOP是一种编程范式,旨在将横切关注点(如日志、事务管理、安全性等)从核心业务逻辑中分离出来。在Spring中,切面由通知...

    Spring之AOP注解之引入通知

    本篇文章将深入探讨Spring AOP中的注解引入通知,以及如何利用它们来增强代码的可维护性和模块化。 首先,我们要理解什么是“引入通知”(Introduction Advice)。引入通知是Spring AOP的一种特殊类型的通知,它...

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...

    spring aop注解版

    在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的实现,简化了配置并提高了代码的可读性。 首先,让我们理解AOP的基本概念。AOP是一种编程范式,允许程序员定义“切面”,这些切面封装了跨越多个...

    spring自定义注解样例

    在Spring AOP中,我们可以通过`@Aspect`注解定义一个类作为切面,并使用`@Before`、`@After`、`@Around`等注解来定义通知(advice),这些通知会在特定的方法执行前后被调用。 ```java @Aspect @Component public ...

    JavaEE spring半自动实现AOP代理

    - 使用`@Aspect`注解来声明一个切面类,切面类中定义了`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等通知方法,它们分别代表前置、后置、环绕、返回后和异常后执行的逻辑。 - 使用`@...

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

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

    Spring注解方式实现AOP demo

    总结来说,这个Spring AOP注解方式的Demo展示了如何通过简单的注解定义切面、切点和通知,实现对业务逻辑的无侵入式增强。这种方式使得代码更简洁、可读性更强,同时也充分利用了Spring框架的优势。对于理解和实践...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...

    spring注解方式实现aop

    通过以上步骤,我们可以使用Spring注解方式实现AOP,将关注点如日志、缓存等与业务逻辑分离,提高代码的可读性和可维护性。在实际项目中,可以灵活运用这些知识来优化代码结构,降低复杂性。希望本教程对理解和应用...

Global site tag (gtag.js) - Google Analytics