文档章节

Spring学习笔记(20)----------Schema初步学习

Simon丶Ma
 Simon丶Ma
发布于 2016/04/14 14:56
字数 1772
阅读 3
收藏 0
点赞 1
评论 0

先来一个HelloWorld的简单例子,开开胃,爽一下~!

 

 

1、Aop配置文件spring-aop.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"  
  7.     xsi:schemaLocation=  
  8.         "http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.         http://www.springframework.org/schema/aop  
  11.         http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  12.         ">  
  13.       
  14.     <bean id = "helloWorldServiceImpl" class="com.spring.xkey.aop.HelloWorldServiceImpl">  
  15.     </bean>  
  16.       
  17.     <bean id = "aspect" class = "com.spring.xkey.aop.HelloWorldAspect">  
  18.     </bean>  
  19.       
  20.     <aop:config>  
  21.         <aop:pointcut id="pointcut" expression="execution(* com.spring..*.sayHello(..)) and args(user)"/>  
  22.         <aop:aspect ref="aspect">  
  23.             <aop:before pointcut-ref = "pointcut" method="beforeAdvice(java.lang.String)" arg-names="user"/>  
  24.             <aop:after pointcut="execution(* com.spring..*.sayHello(..))" method="afterAdvice"/>  
  25.             <aop:after-returning pointcut="execution(* com.spring..*.sayAfterReturning(..))"   
  26.                                  method="afterReturningAdvice"  
  27.                                  arg-names="value"  
  28.                                  returning="value"/>  
  29.             <aop:after-throwing pointcut="execution(* com.spring..*.sayAfterThrowing(..))"  
  30.                                 method="afterThrowingAdvice"  
  31.                                 arg-names="e"  
  32.                                 throwing="e"/>  
  33.             <aop:around pointcut="execution(* com.spring..*.sayAround(..))"  
  34.                         method="aroundAdvice"  
  35.                         />  
  36.         </aop:aspect>  
  37.     </aop:config>  
  38. </beans>  
<?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:p="http://www.springframework.org/schema/p"
	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
		">
	
	<bean id = "helloWorldServiceImpl" class="com.spring.xkey.aop.HelloWorldServiceImpl">
	</bean>
	
	<bean id = "aspect" class = "com.spring.xkey.aop.HelloWorldAspect">
	</bean>
	
	<aop:config>
		<aop:pointcut id="pointcut" expression="execution(* com.spring..*.sayHello(..)) and args(user)"/>
		<aop:aspect ref="aspect">
			<aop:before pointcut-ref = "pointcut" method="beforeAdvice(java.lang.String)" arg-names="user"/>
			<aop:after pointcut="execution(* com.spring..*.sayHello(..))" method="afterAdvice"/>
			<aop:after-returning pointcut="execution(* com.spring..*.sayAfterReturning(..))" 
								 method="afterReturningAdvice"
								 arg-names="value"
								 returning="value"/>
			<aop:after-throwing pointcut="execution(* com.spring..*.sayAfterThrowing(..))"
								method="afterThrowingAdvice"
								arg-names="e"
								throwing="e"/>
			<aop:around pointcut="execution(* com.spring..*.sayAround(..))"
						method="aroundAdvice"
						/>
		</aop:aspect>
	</aop:config>
</beans>

2、HelloWorldService接口

  1. package com.spring.xkey.aop;  
  2.   
  3. public interface HelloWorldService {  
  4.   
  5.     public void sayHello(String username);  
  6.     public boolean sayAfterReturning();   
  7.     public void sayAfterThrowing();  
  8.     public int sayAround(String username,String password);  
  9. }  
package com.spring.xkey.aop;

public interface HelloWorldService {

	public void sayHello(String username);
	public boolean sayAfterReturning(); 
	public void sayAfterThrowing();
	public int sayAround(String username,String password);
}


3、HelloWorldServiceImpl类

  1. package com.spring.xkey.aop;  
  2. import java.lang.RuntimeException;  
  3.   
  4. public class HelloWorldServiceImpl  implements HelloWorldService{  
  5.     public void sayHello(String username){  
  6.         System.out.println("My first Aop test "+username);  
  7.     }  
  8.     public boolean sayAfterReturning(){  
  9.         System.out.println("after returning");  
  10.         return true;  
  11.     }  
  12.       
  13.     public void sayAfterThrowing(){  
  14.         System.out.println("After throwing");  
  15.         throw new RuntimeException();  
  16.     }  
  17.       
  18.     public int sayAround(String username,String password){  
  19.         System.out.println("Around::: "+username+", "+password);  
  20.         int val = 1;  
  21.         return val;  
  22.     }  
  23. }  
package com.spring.xkey.aop;
import java.lang.RuntimeException;

public class HelloWorldServiceImpl  implements HelloWorldService{
	public void sayHello(String username){
		System.out.println("My first Aop test "+username);
	}
	public boolean sayAfterReturning(){
		System.out.println("after returning");
		return true;
	}
	
	public void sayAfterThrowing(){
		System.out.println("After throwing");
		throw new RuntimeException();
	}
	
	public int sayAround(String username,String password){
		System.out.println("Around::: "+username+", "+password);
		int val = 1;
		return val;
	}
}


4、具体实现AOP编程的HelloWorldAspect类

  1. package com.spring.xkey.aop;  
  2.   
  3. import org.aspectj.lang.JoinPoint;  
  4. import org.aspectj.lang.ProceedingJoinPoint;  
  5.   
  6.   
  7. public class HelloWorldAspect {  
  8.       
  9.     public void beforeAdvice(String user){  
  10.         //System.out.println(jp.getArgs()[0].toString());  
  11.         System.out.println("before advice " + user);  
  12.     }  
  13.       
  14.     public void afterAdvice(JoinPoint jp){  
  15.         System.out.println("after advice "+jp.getArgs()[0].toString());  
  16.     }  
  17.       
  18.     public void afterReturningAdvice(Object value){  
  19.         System.out.println("afterReturning advice "+value);  
  20.           
  21.     }  
  22.     public void afterThrowingAdvice(Exception e){  
  23.         System.out.println("after throwing advice exception:" + e);   
  24.     }  
  25.       
  26.     public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{  
  27.         /**System.out.println(pjp.toLongString()); 
  28.         System.out.println(pjp.getSignature().toString()); 
  29.         System.out.println(pjp.getKind().toString()); 
  30.         System.out.println(pjp.getArgs()[0].toString()); 
  31.         System.out.println("name+psd");*/  
  32.         Object [] obj = pjp.getArgs();  
  33.         String username = (String) obj[0];  
  34.         String password = (String) obj[1];  
  35.         System.out.println(username+","+password);  
  36.         Object retVal;  
  37.         if(username.equals("xkey") && password.equals("color")){  
  38.             retVal = pjp.proceed();  
  39.         }else{  
  40.             retVal = pjp.proceed(new Object[]{"ideal","*******"});  
  41.         }  
  42.         System.out.println("name+psd");  
  43.         if(retVal == null) System.out.println("false");  
  44.         else{  
  45.             System.out.println(retVal.toString());  
  46.         }  
  47.         return 2;  
  48.     }  
  49. }  
package com.spring.xkey.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;


public class HelloWorldAspect {
	
	public void beforeAdvice(String user){
		//System.out.println(jp.getArgs()[0].toString());
		System.out.println("before advice " + user);
	}
	
	public void afterAdvice(JoinPoint jp){
		System.out.println("after advice "+jp.getArgs()[0].toString());
	}
	
	public void afterReturningAdvice(Object value){
		System.out.println("afterReturning advice "+value);
		
	}
	public void afterThrowingAdvice(Exception e){
		System.out.println("after throwing advice exception:" + e); 
	}
	
	public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{
		/**System.out.println(pjp.toLongString());
		System.out.println(pjp.getSignature().toString());
		System.out.println(pjp.getKind().toString());
		System.out.println(pjp.getArgs()[0].toString());
		System.out.println("name+psd");*/
		Object [] obj = pjp.getArgs();
		String username = (String) obj[0];
		String password = (String) obj[1];
		System.out.println(username+","+password);
		Object retVal;
		if(username.equals("xkey") && password.equals("color")){
			retVal = pjp.proceed();
		}else{
			retVal = pjp.proceed(new Object[]{"ideal","*******"});
		}
		System.out.println("name+psd");
		if(retVal == null) System.out.println("false");
		else{
			System.out.println(retVal.toString());
		}
		return 2;
	}
}


5、测试类

  1. package com.spring.xkey.aop;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class AopTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         ApplicationContext context =  
  14.             new ClassPathXmlApplicationContext("com/spring/xkey/aop/spring-aop.xml");  
  15.         HelloWorldService hello = (HelloWorldService)context.getBean("helloWorldServiceImpl");  
  16.         hello.sayHello("xkey");  
  17.         System.out.println("===================================");  
  18. //      hello.sayAfterReturning();  
  19. //      System.out.println("===================================");  
  20. //      hello.sayAfterThrowing();  
  21. //      System.out.println("===================================");  
  22.         Object val = (Object)hello.sayAround("xkey""colo");  
  23.         System.out.println(val.toString());  
  24.     }  
  25. }  
package com.spring.xkey.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AopTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext context =
			new ClassPathXmlApplicationContext("com/spring/xkey/aop/spring-aop.xml");
		HelloWorldService hello = (HelloWorldService)context.getBean("helloWorldServiceImpl");
		hello.sayHello("xkey");
		System.out.println("===================================");
//		hello.sayAfterReturning();
//		System.out.println("===================================");
//		hello.sayAfterThrowing();
//		System.out.println("===================================");
		Object val = (Object)hello.sayAround("xkey", "colo");
		System.out.println(val.toString());
	}
}


 

6、AOP Around(环绕通知)可以控制返回对象,即你可以返回一个与目标对象完全不同的返回值,虽然这很危险,但是你却可以办到。目标方法的返回值 就是 环绕通知的返回值。proceed() 方法可以在通知体内调用一次、多次 或根本不用调用;还可以控制执行方法的参数值。具体见aroundAdvice方法的实现。


7、给个更直观的结果

  1. before advice xkey  
  2. My first Aop test xkey  
  3. after advice xkey  
  4. ===================================  
  5. xkey,colo  
  6. Around::: ideal, ********  
  7. name+psd  
  8. In the AroundAdvice the return value is 1  
  9. After AroundAdvice modify return value is 2  
before advice xkey
My first Aop test xkey
after advice xkey
===================================
xkey,colo
Around::: ideal, ********
name+psd
In the AroundAdvice the return value is 1
After AroundAdvice modify return value is 2


 

这里使用AOP Around就可以用来进行一个身份验证,通过面向切面编程(AOP)将验证部分独立出来,使得代码的耦合度降低,如果使用面向对象思想(OOP)就应该是独立写一个身份验证的方法,然后当需要使用该方法再去new 一个身份验证方法的类,然后传递参数通过验证类中的方法去验证,这样代码的耦合度就变强了。


 

 

通过Scheme配置实现AOP步骤

   步骤一、编写业务类:

public class AspectBusiness {
   //
切入点
    public String delete(String obj) {
        System.out.println("==========调用切入点:" + obj + "说:你敢删除我!===========\n");
        return obj + ":瞄~";
    }

    public String add(String obj) {
        System.out.println("================这个方法不能被切。。。============== \n");
        return obj + ":瞄~ 嘿嘿!";
    }

    public String modify(String obj) {
        System.out.println("=================这个也设置加入切吧====================\n");
        return obj + ":瞄改瞄啊!";
    }

}

步骤二、编写切面类:切面类中,包含了所有的通知

public class AspectAdvice {

     //
前置通知
   public void doBefore(JoinPoint jp) {
        System.out.println("===========进入before advice============ \n");

        System.out.print("准备在" + jp.getTarget().getClass() + "对象上用");
        System.out.print(jp.getSignature().getName() + "方法进行对 '");
        System.out.print(jp.getArgs()[0] + "'进行删除!\n\n");

        System.out.println("要进入切入点方法了 \n");
    }


     // 后置通知
     // @param jp
     //            连接点
     // @param result
     //          返回值
    
    public void doAfter(JoinPoint jp, String result) {
        System.out.println("==========进入after advice=========== \n");
        System.out.println("切入点方法执行完了 \n");

        System.out.print(jp.getArgs()[0] + "在");
        System.out.print(jp.getTarget().getClass() + "对象上被");
        System.out.print(jp.getSignature().getName() + "方法删除了");
        System.out.print("只留下:" + result + "\n\n");
    }


     // 环绕通知
    // @param pjp
     //           连接点
   
    public object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("===========进入around环绕方法!=========== \n");

        // 调用目标方法之前执行的动作
        System.out.println("调用方法之前: 执行!\n");

        // 调用方法的参数
        Object[] args = pjp.getArgs();
        // 调用的方法名
        String method = pjp.getSignature().getName();
        // 获取目标对象
        Object target = pjp.getTarget();
        // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
        Object result = pjp.proceed();

        System.out.println("输出:" + args[0] + ";" + method + ";" + target + ";" + result + "\n");
        System.out.println("调用方法结束:之后执行!\n");
     return  result;
    }

 
     //异常通知
  
    public void doThrow(JoinPoint jp, Throwable e) {
        System.out.println("删除出错啦");
    }

}

步骤四、配置文件的编写:

<?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:p="http://www.springframework.org/schema/p"
    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-3.0.xsd    
          http://www.springframework.org/schema/context    
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/aop    
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    default->

    <!-- ==============================利用spring 利用aspectj来配置AOP================================ -->

    <!-- 声明一个业务类 -->
    <bean id="aspectBusiness" class="aop.schema.AspectBusiness" />

    <!-- 声明通知类 -->
    <bean id="aspectAdvice" class="aop.schema.advice.AspectAdvice" />


   <aop:config>
        <aop:aspect id="businessAspect" ref="aspectAdvice">
            <!-- 配置指定切入的对象 -->
            <aop:pointcut id="point_cut" expression="execution(* aop.schema.*.*(..))" />
            <!-- 只匹配add方法作为切入点
            <aop:pointcut id="except_add" expression="execution(* aop.schema.*.add(..))" />
             -->

            <!-- 前置通知 -->
            <aop:before method="doBefore" pointcut-ref="point_cut" />
            <!-- 后置通知 returning指定返回参数 -->
            <aop:after-returning method="doAfter"
                pointcut-ref="point_cut" returning="result" />
            <aop:around method="doAround" pointcut-ref="point_cut"/>
            <aop:after-throwing method="doThrow" pointcut-ref="point_cut" throwing="e"/>
        </aop:aspect>
    </aop:config>

</beans>

步骤五、测试类:

public class Debug {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("aop/schema_aop.xml");
        AspectBusiness business = (AspectBusiness) context.getBean("aspectBusiness");
        business.delete("猫");
    }

}

© 著作权归作者所有

共有 人打赏支持
Simon丶Ma
粉丝 4
博文 134
码字总数 299850
作品 0
深圳
程序员
springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits [TOC] 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,...

brianway ⋅ 2016/03/30 ⋅ 2

Spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

一、注解式事务 1、注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo。 2、事务配置实例 (1)、spring+mybatis 事务配置 (2)、...

哲别0 ⋅ 04/20 ⋅ 0

springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建

springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建) 标签: springmvc mybatis [TOC] 本文主要展示如何在intellij IDEA中通过maven构建springmvc+mybatis框架的开发环境。 需求...

brianway ⋅ 2016/03/10 ⋅ 0

SSM整合(二):配置文件编写

把项目建好了,下一步干嘛? step2: 面对空荡荡的项目,首先当然是想着导入这三个框架啦,就要进行基础配置了。 先放上我的配置文件结构图: 因为是学习的缘故,我把每个项目都分开来了,当然...

wzlhlhhh ⋅ 05/11 ⋅ 0

Spring.NET学习笔记——目录(原)

目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔记2——环境搭建(基础篇) Level 200 Sprin...

长平狐 ⋅ 2012/06/11 ⋅ 1

MyBatis多对多保存示例——MyBatis学习笔记之十七

前几天有网友问到MyBatis多对多的问题,不过愧对网友厚爱的是,最近一直忙,直到现在才有时间处理此事。今天就先写一个多对多保存的示例,算是对这位网友的初步回应,以后会有更多相关的博文...

NashMaster2011 ⋅ 2013/08/11 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

ZHENFENGSHISAN/perfect-ssm

Quick Start 项目简介 ssm系列 ssm-demo:Spring+SpringMVC+Mybatis+easyUI整合 perfect-ssm:RESTful API+redis缓存 ssm-cluster:前后端分离+集群部署 ssm-dubbo:dubbo服务化 ssm-micro-se......

ZHENFENGSHISAN ⋅ 2017/09/18 ⋅ 0

Dubbo源码-Dubbo是如何随心所欲自定义XML标签的

叨叨 今天考虑了很久要不要写这篇文章。 距离《Dubbo源码》系列的开篇到现在已经快两个月时间了。当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样的解...

Jackie_Zheng ⋅ 05/20 ⋅ 0

springmvc学习笔记(8)-springmvc整合mybatis之service

springmvc学习笔记(8)-springmvc整合mybatis之service 标签: springmvc mybatis [TOC] 本文记录如何整合service,包括定义spring接口,在spring容器配置service以及事务控制。让spring管理s...

brianway ⋅ 2016/03/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部