转载的。。原文地址
http://blog.csdn.net/xzf19901108/article/details/7835558
注解方式
*******************
beans.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:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- ">
- <aop:aspectj-autoproxy/>
- <bean id="myInterceptor" class="blog.service.MyInterceptor"/>
- <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>
- </beans>
***************
MyInterceptor.java
***************
- package blog.service;
- 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;
- import org.aspectj.lang.annotation.Pointcut;
- /**
- * 切面
- *
- */
- @Aspect
- public class MyInterceptor {
- @Pointcut("execution (* blog.service.impl.PersonServiceBean.*(..))")
- public void anyMethod() {
- //表达式解释:* blog.service.impl.PersonServiceBean.*(..):第一个*号表示返回类型;
- //blog.service.impl.PersonServiceBean.*:表示PersonServiceBean类下的所有方法
- //blog.service.impl..*.*:表示blog.service.impl包及其子包下的所有类的所有方法
- //(..):表示所有的参数类型几个数都不限
- }// 声明一个切入点
- //会拦截参数签名位 (String , int)或(String , Integer )类型的方法,
- //参数顺序与args(uname,id)一致,参数类型由(int id,String uname)决定
- @Before("anyMethod() && args(uname,id)")
- public void doAccessCheck(int id,String uname) {
- System.out.println("前置通知:" + uname + id);
- }
- @AfterReturning(pointcut="anyMethod()",returning="result")
- public void doAfterReturning(String result) {
- System.out.println("后置通知:" + result);
- }
- @After("anyMethod()")
- public void doAfter() {
- System.out.println("最终通知");
- }
- @AfterThrowing(pointcut="anyMethod()",throwing="e")
- public void doAfterThrowing(Exception e) {
- System.out.println("例外通知:" + e.getMessage());
- }
- @Around("anyMethod()")
- public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
- //if(){//判断用户是否有权限
- System.out.println("进入方法");
- Object result = pjp.proceed();
- System.out.println("退出方法");
- //}
- return result;
- }
- }
***************
PersonService.java
***************
- package blog.service;
- public interface PersonService {
- public String save(String name);
- public String update(String name,Integer userId);
- public String delete(int id,String dept);
- }
***************
PersonServiceBean.java
***************
- package blog.service.impl;
- import blog.service.PersonService;
- public class PersonServiceBean implements PersonService {
- private String username = null;
- public String getUsername() {
- return username;
- }
- public PersonServiceBean() {
- }
- public PersonServiceBean(String username) {
- this.username = username;
- }
- @Override
- public String save(String name) {
- if (name.equals("") || name == null) {
- throw new RuntimeException("出错啦");
- }
- System.out.println("in save method!" + name);
- return "in save method!" + name;
- }
- @Override
- public String update(String name, Integer userId) {
- System.out.println("in update method! name = " + name + " id = "
- + userId + " username = " + username);
- return "in update method!name = " + name + " id = " + userId;
- }
- @Override
- public String delete(int id, String dept) {
- System.out.println("id = " + id + " dept = " + dept);
- return "in delete method! + nameid = " + id + " dept = " + dept;
- }
- }
***************
SpringAOPTest.java
***************
- package junitTest;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import blog.service.PersonService;
- public class SpringAOPTest {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- }
- @Test
- public void AopTest(){
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
- PersonService service = (PersonService)ctx.getBean("personService");
- try {
- service.delete(12, "it");
- service.update("发多个地方",324);
- service.save("");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
***************
运行结果
***************
基于xml配置方式
*************
beans.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:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- ">
- <aop:aspectj-autoproxy/>
- <bean id="myInterceptor" class="blog.service.MyInterceptor"/>
- <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>
- <aop:config>
- <aop:aspect id="aspectBean" ref="myInterceptor" >
- <aop:pointcut id="point" expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>
- <aop:before method="doAccessCheck" pointcut-ref="point" />
- <aop:after-returning method="doAfterReturning" pointcut-ref="point" />
- <aop:after-throwing method="doAfterThrowing" pointcut-ref="point"/>
- <aop:after method="doAfter" pointcut-ref="point"/>
- <aop:around method="doBasicProfiling" pointcut-ref="point" />
- </aop:aspect>
- </aop:config>
- </beans>
*******************
MyInterceptor.java
*******************
- package blog.service;
- import org.aspectj.lang.ProceedingJoinPoint;
- public class MyInterceptor {
- public void anyMethod() {
- }
- public void doAccessCheck() {
- System.out.println("前置通知" );
- }
- public void doAfterReturning() {
- System.out.println("后置通知");
- }
- public void doAfter() {
- System.out.println("最终通知");
- }
- public void doAfterThrowing() {
- System.out.println("例外通知");
- }
- public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
- //if(){//判断用户是否有权限
- System.out.println("进入方法");
- Object result = pjp.proceed();
- System.out.println("退出方法");
- //}
- return result;
- }
- }
aop表达式的使用方法
<aop:pointcut id="point" expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>
!void blog.service.impl.PersonServiceBean.*(..)中!void 表示拦截所有返回类型为非void类型的方法
java.lang.String表示拦截所有返回类型为String类型的方法
* blog.service.impl.PersonServiceBean.*(java.lang.String,..)表示拦截所有第一个参数为String类型的方法
相关推荐
下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### 注解方式 #### 1. 定义切面(Aspect) 在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect ...
Spring AOP,即Spring的面向切面编程,是Spring框架中的一个重要组成部分,它提供了一种在不修改原有代码的情况下,对程序...虽然现在更多地使用注解式配置,但理解XML配置方式对于全面掌握Spring AOP仍然至关重要。
本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
**Spring AOP XML方式配置通知** 在Java世界中,Spring框架是广泛应用的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。AOP允许开发者定义“方面”,这些方面可以封装关注点,如日志、事务...
在基于XML的配置方式下,Spring AOP提供了直观且灵活的声明式方法来实现这些关注点的分离,使得业务逻辑代码更为简洁。 在Spring AOP中,我们首先需要定义一个切面(Aspect),它包含了若干个通知(Advice)。通知...
### AOP的相关概念 **AOP**,全称为**Aspect-Oriented Programming**,即面向切面编程。这种编程范式旨在将横切...而对于大型项目或复杂的团队协作,则可能更倾向于使用基于XML的配置来获得更高的灵活性和可维护性。
总结来说,这个Spring AOP注解方式的Demo展示了如何通过简单的注解定义切面、切点和通知,实现对业务逻辑的无侵入式增强。这种方式使得代码更简洁、可读性更强,同时也充分利用了Spring框架的优势。对于理解和实践...
在Spring中,我们通常使用基于注解的AOP,它简化了配置并使代码更易读。 二、注解驱动的AOP 1. 定义切面(Aspect):首先,我们需要创建一个切面类,这个类通常包含通知(Advice),也就是实际的日志记录方法。使用...
然而,随着Spring的发展,基于注解的AOP配置逐渐成为主流,因为它的简洁性和可读性更强。但这并不意味着XML配置方式失去了价值,尤其是在需要更细粒度控制或者与旧项目集成时,XML配置依然有着其独特的优势。 总的...
总的来说,Spring AOP通过XML配置为我们提供了一种灵活的方式来管理横切关注点,使我们的代码更加模块化和可维护。通过定义Advisor、切点和通知,我们可以将如日志记录、事务处理等通用功能轻松地插入到业务逻辑中,...
总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...
本篇文章将深入探讨如何在Spring MVC中配置和使用基于注解的AOP。 一、Spring AOP基础知识 1. **切面(Aspect)**:切面是关注点的模块化,例如日志、事务管理等。在Spring AOP中,切面可以是Java类或@Aspect注解...
在使用Spring AOP时,我们可以通过XML配置或注解的方式来定义切面。例如,可以使用`@Aspect`注解定义一个切面类,`@Before`、`@After`等注解来声明通知,`@Pointcut`定义切点表达式。 在实际开发中,Spring AOP广泛...
这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...
4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置代理。`ProxyFactoryBean`是XML配置方式,而`@EnableAspectJAutoProxy`是基于...
里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)
Spring AOP有两种实现方式:基于代理的AOP(JDK动态代理和CGLIB代理)和基于注解的AOP。 - **JDK动态代理**:当目标类实现了接口时,Spring会使用JDK的Proxy类创建一个代理对象,该代理对象会在调用接口方法时插入...
这种方式虽然相比注解方式略显繁琐,但对于大型项目或者需要精细控制AOP配置的情况,仍然是一个很好的选择。通过深入理解和实践,我们可以更好地利用Spring AOP来优化我们的应用程序,提高代码的可读性和可维护性。