`

浅谈Spring静态切入点使用方法[转]

阅读更多

所谓Spring静态切入点,相对于动态切入点来说,具有良好的性能,因为静态切入点只在代理创建时候执行一次,而不是在运行期间,每次目标方法执行前都进行执行,下面,以实例说明如何定义静态切入点

 

看我我前一篇blog的朋友都知道,如果不定义切入点,通知方法是会对整个目标类的所有方法均进行切入的
但实际需求中,我们可能对其中的几个方法执行A通知,对其他的方法执行B通知,这时候,就需要通过定义不同的切入点来进行区分

目标接口:

 

package StaticAdvisorTest;

public interface Shopping ...{
  
public String buySomething(String type);
  
public String buyAnything(String type);
  
public String sellSomething(String type);
  
public String sellAnything(String type);

}

 javabean:

 

package StaticAdvisorTest;

public class Customer ...{
  
private String name;
  
private String age;
  
public Customer()...{
      
  }

  
public Customer(String name,String age)...{
      
this.name=name;
      
this.age=age;
  }

public String getAge() ...{
    
return age;
}

public void setAge(String age) ...{
    
this.age = age;
}

public String getName() ...{
    
return name;
}

public void setName(String name) ...{
    
this.name = name;
}

}

 

业务目标实现类:

 

package StaticAdvisorTest;

public class ShoppingImpl implements Shopping ...{
    
private Customer customer;
    
public Customer getCustomer() ...{
        
return customer;
    }

    
public void setCustomer(Customer customer) ...{
        
this.customer = customer;
    }

    
public String buySomething(String type) ...{
        System.out.println(
this.getCustomer().getName()+" bye "+type+" success");
        
return null;
    }

    
    
public String buyAnything(String type) ...{
       System.out.println(
this.getCustomer().getName()+" bye "+type+" success");
       
return null;

     }

    
public String sellAnything(String type) ...{
        System.out.println(
this.getCustomer().getName()+" sell "+type+" success");
        
return null;
    }

    
public String sellSomething(String type) ...{
         System.out.println(
this.getCustomer().getName()+" sell "+type+" success");
           
return null;
    }


}

 

通知(切面)方法:

 

package StaticAdvisorTest;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;
//前置通知
public class WelcomeAdvice implements MethodBeforeAdvice ...{

    
public void before(Method method, Object[] args, Object obj)
            
throws Throwable ...{
        String type
=(String)args[0];
        System.out.println(
"Hello welcome to buy "+type);

    }


}

 

下面是重点,我们想对所有的buy方法进行通知处理,也就是在所有的buy方法上定义切面

spring为我们创建了静态切入点的父类 StaticMethodMatcherPointCut ,如果我们想实现自制的静态切入点,只要继承这个类就可以了,不过一般情况下,我们使用spring提供的静态切入点NameMatchMethodPointCut就足够了

配置文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
 
<bean id="customer" class="StaticAdvisorTest.Customer">
   
<constructor-arg index="0">
     
<value>gaoxiang</value>
   
</constructor-arg>
    
<constructor-arg index="1">
     
<value>26</value>
   
</constructor-arg>
 
</bean>
 
<bean id="shoppingImpl" class="StaticAdvisorTest.ShoppingImpl">
   
<property name="customer">
     
<ref local="customer"/>
   
</property>
 
</bean>
<!-- 定义通知 -->
<bean id="shoppingAdvise" class="StaticAdvisorTest.WelcomeAdvice"></bean>
<!-- 定义切入点 -->
<bean id="shoppingPointCutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  
<property name="mappedName">
    
<value>sell*</value>
  
</property>
  
<property name="advice">
    
<ref bean="shoppingAdvise"/>
  
</property>
</bean>
<!-- 定义代理 -->
<bean id="StaticAdvisorTest" class="org.springframework.aop.framework.ProxyFactoryBean">
  
<property name="proxyInterfaces">
    
<value>StaticAdvisorTest.Shopping</value>
  
</property>
  
<property name="interceptorNames">
    
<list>
      
<value>shoppingPointCutAdvisor</value>
    
</list>
  
</property>
  
<property name="target">
    
<ref bean="shoppingImpl"/>
  
</property>
</bean>

</beans>

 <!-- 如果不使用通配符,则用以下表达
  <property name="mappedNames">
    <list>
       <value>sellSomething</value>
       <value>sellAnything</value>
    </list>
  </property>
  -->

测试程序:

 

package StaticAdvisorTest;

import java.io.File;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;



public class TestAdvisor ...{

    
public static void main(String[] args) ...{

        String filePath
=System.getProperty("user.dir")+File.separator+"StaticAdvisorTest"+File.separator+"hello.xml";
        
        BeanFactory factory
=new XmlBeanFactory(new FileSystemResource(filePath));
        
        Shopping shopping
=null;

        shopping
=(Shopping)factory.getBean("StaticAdvisorTest");
        shopping.buySomething(
"something");
        shopping.buyAnything(
"anything");
        shopping.sellAnything(
"anything");
        shopping.sellSomething(
"something");
        
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    详解Spring 框架中切入点 pointcut 表达式的常用写法

    在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...

    浅谈spring 常用注解

    浅谈Spring常用注解 浅谈Spring常用注解是Spring框架中的一些基本概念,了解这些概念对于 MASTERING SPRING Framework非常重要。本文将对Spring中常用的注解进行分类和介绍,并对每个注解的使用进行解释。 一、...

    使用切入点匹配方法实现Spring AOP环绕通知

    本篇将详细探讨如何使用切入点匹配方法实现Spring AOP的环绕通知。 首先,理解AOP的核心概念: 1. 切面(Aspect):切面是关注点的模块化,它封装了横切关注点,如日志、事务等。 2. 连接点(Join Point):程序...

    狂神spring-security静态资源.zip

    - 使用`@Secured`或`@PreAuthorize`注解:在Controller方法上使用这些注解,根据方法级别的权限控制静态资源的访问。 4. **Web安全配置** Spring Security的配置通常在Java配置类中完成,通过`...

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

    spring+静态代理

    在本主题"spring+静态代理"中,我们将深入探讨如何利用Spring框架来实现静态代理模式,并通过接口回调的方式来增强代码的灵活性和可扩展性。 静态代理是一种设计模式,它允许我们在不修改原始对象(被代理对象)的...

    狂神Spring Security静态资源

    3. **使用Spring Security的访问决策管理器(AccessDecisionManager)**:如果你希望控制哪些角色可以访问静态资源,可以实现自己的访问决策管理器,然后在配置中指定使用这个管理器。 4. **使用HTTP基本认证或OAuth2...

    spring-security静态资源

    例如,我们可以使用`permitAll()`方法允许所有用户访问静态资源目录: ```java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/...

    浅谈Spring Security 对于静态资源的拦截与放行

    在这个适配器中,我们可以覆盖`configure(WebSecurity web)`方法来定义静态资源的放行规则: ```java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ...

    JavaEE spring静态工厂创建实例

    本篇将详细介绍如何在Spring中使用静态工厂方法来创建实例。 首先,让我们理解什么是静态工厂方法。静态工厂方法是类中的一个静态成员方法,它不依赖于类的实例,而是通过类名直接调用,返回一个对象。这种方法与...

    深入浅出学spring

    开发者可以定义切面(Aspect),并通过切入点(Pointcut)指定哪些方法或类应该被增强。这种方式可以让主要业务逻辑保持简洁,并将非核心功能进行模块化管理。 ### 声明式事务管理 Spring框架提供了声明式的事务...

    springaop中切入点表达式完整示例代码

    了解并熟练运用这些切入点表达式,能够有效地提升Spring AOP的使用效率,让代码更加模块化,易于维护。在实际开发中,根据业务逻辑选择合适的切入点表达式,能够更好地实现切面的封装和复用,提高代码的可读性和可...

    SpringSecurity静态资源.rar

    6. **使用Spring Boot**:在Spring Boot应用中,Spring Security与Spring Boot的静态资源处理机制集成良好。通过`spring.security.filter.static-resources-locations`属性,可以指定静态资源的位置,并自动处理权限...

    Spring boot工具类静态属性注入及多环境配置详解

    Spring Boot工具类静态属性注入是指使用Spring Boot框架时,如何将配置信息注入到工具类的静态变量中,以便在程序中使用这些配置信息。这种方式可以方便地在不同的环境中切换配置信息,例如在开发环境中使用本地的...

    Spring AOP 所有切入点指示符详解.docx

    Spring AOP通过使用切入点(Pointcut)和通知(Advice)来实现这一目标。切入点是定义关注点何时触发的表达式,而通知则是实际执行的动作。 Spring AOP目前只支持方法执行这个连接点,下面我们将详细解析Spring AOP...

    spring 静态实例化

    Spring框架作为Java领域中最为广泛使用的依赖注入(Dependency Injection, DI)容器之一,其强大的功能不仅体现在对复杂系统的管理上,还包括了许多高级特性,如静态实例化。本文将深入探讨Spring中的静态实例化概念...

    spring项目启动加载类到静态服务类中的三种方式.zip

    但是,由于静态方法无法直接使用注解,我们可以创建一个非静态的辅助类,该类可以被Spring管理,并在其内部使用`@Autowired`注解来注入bean。之后,静态服务类通过这个辅助类访问bean。 ```java @Component ...

    狂神说SpringSecurity静态资源.rar

    "狂神说SpringSecurity静态资源.rar"很可能是狂神(一位知名的IT教育博主)分享的一系列关于SpringSecurity教程的资料,包含了模板(templates)和静态资源(static)两个部分。 在SpringSecurity中,静态资源的...

    Spring切入点表达式配置过程图解

    下面我们将详细探讨Spring切入点表达式配置的过程以及相关标签的使用。 1. **** 标签: 这个标签是Spring AOP配置的根元素,用于声明AOP的相关配置。在`&lt;aop:config&gt;`中,我们可以定义多个切面、切入点和通知,以...

    Spring依赖注入使用静态工厂设注入demo

    本篇将详细讲解如何使用静态工厂方法进行依赖注入,结合提供的"SpringIOCTest3"项目进行说明。 首先,理解依赖注入的基本概念。依赖注入是指在运行时,由容器(如Spring IoC容器)负责创建对象并管理这些对象之间的...

Global site tag (gtag.js) - Google Analytics