struts2的环绕通知

struts2中的通知就是环绕通知;
直接上代码:
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: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/aop
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <aop:aspectj-autoproxy/>
    <bean id="myInterceptor"/>
    <bean id="personService"/>
</beans>

PersonService.java

package cn.itcast.service;

/**
 *
 * @author kang.cunhua
 */
public interface PersonService {

    void save(String name);

    void update(String name, Integer personid);

    public String getPersonName(Integer personid);
}

PersonServiceBean.java

package cn.itcast.service.impl;

import cn.itcast.service.PersonService;

/**
 *
 * @author kang.cunhua
 */
public class PersonServiceBean implements PersonService {

   
    @Override
    public void save(String name) {
        //throw new RuntimeException("我爱例外!");
        System.out.println("我是save()方法!");
    }

    @Override
    public void update(String name, Integer personid) {
        System.out.println("我是update方法()方法!");
    }

    public String getPersonName(Integer personid) {
        System.out.println("我是getPersonName()方法!");
        return "xxx";
    }
}

MyInterceptor.java

package cn.itcast.aop;

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;

/**
 *
 * @author kang.cunhua
 */
@Aspect
public class MyInterceptor {

    @Pointcut("execution (* cn.itcast.service.impl.PersonServiceBean.*(..))")
    private void anyMethod() { // 声明一个切入点
    }

    @Before("anyMethod() && args(userName)")
    public void doAccessCheck(String userName) {
        System.out.println("前置通知触发:" + userName);
    }
    @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);
    }
    // 环绕通知在我们做权限时,可以大量使用到
    @Around("anyMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
        //if () { // 判断用户是否有权限
        System.out.println("进入方法");
        Object result = pjp.proceed();// 如果不调用此方法,业务bean方法不会最终被调用;如果后续有其他切面,先执行其他切面,最后执行业务bean方法;
        System.out.println("退出方法");
        //}
        return result;
    }

}

MyInterceptorTest.java

package cn.itcast.aop;

import cn.itcast.service.PersonService;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @author kang.cunhua
 */
public class MyInterceptorTest {

    public MyInterceptorTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    /**
     * Test of doAccessCheck method, of class MyInterceptor.
     */
    @Test
    public void testDoAccessCheck() {
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
        PersonService personService = (PersonService) cxt.getBean("personService");
        personService.save("xxx");
        System.out.println("-----------------");
        personService.getPersonName(2);
    }
}

测试结果:

2010-7-20 15:00:20 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1837697: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1837697]; startup date [Tue Jul 20 15:00:20 CST 2010]; root of context hierarchy
2010-7-20 15:00:20 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
2010-7-20 15:00:20 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1837697]: org.springframework.beans.factory.support.DefaultListableBeanFactory@698403
2010-7-20 15:00:20 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@698403: defining beans [org.springframework.aop.config.internalAutoProxyCreator,myInterceptor,personService]; root of factory hierarchy
前置通知触发:xxx
进入方法
我是save()方法!
后置通知触发:null
最终通知触发!!
退出方法
-----------------
进入方法
我是getPersonName()方法!
后置通知触发:xxx
最终通知触发!!
退出方法


内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通网络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值