spring 学习笔记 使用aspectj开发aop

com.springsource.org.aspectj.tools-1.6.6.RELEASE.jar 立即下载

1.添加类库:aspectjrt.jar和aspectjweaver.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

com.springsource.org.aspectj.tools-1.6.6.RELEASE.jar

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.7.1</version>
</dependency>

2.添加aop schema.

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"

3.定义xml元素:<aop:aspectj-autoproxy>
4.编写java类,并用@Aspect注解成通知,AspectJ 支持 5 种类型的通知注解: 
  @Before: 前置通知, 在方法执行之前执行
  @After: 后置通知, 在方法执行之后执行 
  @AfterRunning: 返回通知, 在方法返回结果之后执行
  @AfterThrowing: 异常通知, 在方法抛出异常之后
  @Around: 环绕通知, 围绕着方法执行

配置成普通bean元素即可.

前置通知:@Before

@Aspectpublic class MyAspectjAdvice {
    @Before("execution(* WelcomeService.*(..))")
    public void sayHello(){..}
    @Before("execution(* WelcomeService.*(..))")

    public void sayHello(JoinPoint jp){..}

JoinPoint参数可访问连接点细节,入方法名和参数等.

jp.getTarget()
jp.getThis()
jp.getArgs()

jp.getSignature().getName()

后置通知:@After

@After("execution(* *..WelcomeService.*(..))")

public void sayBye(){..}

后置通知在目标方法执行完成之后执行.一个切面aspect包含很多通知.

@After 后置通知表明目标方法执行完之后,不论是否抛异常,都会织入该通知.

@AfterReturning 方法返回后通知只在目标方法返回以后执行,若抛异常不执行.

@AfterReturning(pointcut="",returning="res")
public void xxx(Joinput jp,Object res) 
在后置通知中可接收到返回值.res即是用来接收返回值的对象.

环绕通知:@Around

@Around("execution(* *..WelcomeService.*(..))")
public void around(ProceedingPointCut jp){..}
注意:可以控制目标方法是否调用,以及返回完全不同的对象,要慎用.

指定优先级:

@Aspect
@Order(0)
public class xxx{...}
加上@Order注解可以指定加入切面的优先级(先后顺序,值越小,优先级越高)

重用切入点定义:

将切入点注解到一个空的方法体上,其它地方引用即可.
//定义切入点
@Pointcut("execution(* *..WelcomeService.*(..))")
public void performPoint(){}
@Before("performPoint()")
@After("performPoint()")

demo

/**
 * 观众(切面)
 */
@Aspect
public class Audience {
	
	@Pointcut(value="execution(*  study.spring.aop.aspectj.Performer.*(..))")
	public void watch() {}
	// interface ModeifyDate  method set get
	@DeclareParents(value="study.spring.aop.aspectj.Singer",
					defaultImpl=ModifyDateImpl.class)
	public ModifyDate md ;
	
	@Before(value="watch()")
	public  void setting() {
		System.out.println("@Before大批观众正在接近,入场就坐");
	}
	@Before(value="watch()")
	public void turnOffCellphone() {
		System.out.println("@Before关闭手机");
	}
	@AfterThrowing(pointcut="watch()",throwing="e")
	public void hiss(Exception e) {
		System.out.println("@AfterThrowing出事了"+e.getMessage());
	}
	@AfterReturning(pointcut="watch()",returning="ret")
	public void applaud(Object ret) {
		if(ret instanceof Boolean) {
			if((Boolean)ret) {
				System.out.println("@AfterReturning演的太好了,鼓掌....");
			}
			else {
				System.out.println("@AfterReturning演的太差了,嘘声,扔苹果...");
			}
		}else{
			System.out.println("@AfterReturning观众正在观看节目...");
		}
	}
	@After("watch()")
	public  void  goHome() {
		System.out.println("@After节目演完,观众回家");
	}
}
/**
 * 演员
 */
public interface Performer {
	public boolean show();
}
public class Singer implements Performer{
	public boolean show() {
		int nextInt = new Random().nextInt(3);
		if(nextInt==2)throw new RuntimeException("歌手昏倒了 ");
		String str= nextInt==0?"看上去状态很好":"这TMD什么破嗓子!!!";
		System.out.println("唱歌中...啦啦啦啦..."+str);
		if(nextInt==0) return true;
		else return false;
	}
}
<?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:tx="http://www.springframework.org/schema/tx"
	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/context 
				http://www.springframework.org/schema/context/spring-context-3.1.xsd
				http://www.springframework.org/schema/tx 
				http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
				http://www.springframework.org/schema/aop
				http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
	<!-- 观众 -->
	<bean id="audience" class="study.spring.aop.aspectj.Audience"></bean>
	<!-- 歌手 -->
	<bean id="singer" class="study.spring.aop.aspectj.Singer"></bean>
	<!-- 使用自动代理 -->
	<aop:aspectj-autoproxy/>
</beans>
public class AspectjAppDrive {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("study/spring/aop/aspectj/aspectj.xml");
		Performer bean = (Performer)ac.getBean("singer");
		bean.show();
ModifyDate md = (ModifyDate)bean;
		md.setDate(new Date());
		System.out.println(md.getDate());
}
result:1
@Before大批观众正在接近,入场就坐
@Before关闭手机
唱歌中...啦啦啦啦...看上去状态很好
@AfterReturning演的太好了,鼓掌....
@After节目演完,观众回家
---------------------------------------------------
result:2
@Before大批观众正在接近,入场就坐
Exception in thread "main" java.lang.RuntimeException: 歌手昏倒了 
@Before关闭手机
@AfterThrowing出事了歌手昏倒了 
@After节目演完,观众回家
--------------------------------------------------
result:3
@Before大批观众正在接近,入场就坐
@Before关闭手机
唱歌中...啦啦啦啦...这TMD什么破嗓子!!!
@AfterReturning演的太差了,嘘声,扔苹果...
@After节目演完,观众回家



com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring 前置通知的相关jar包, 包括 com.springsource.org.aopalliance-1.0.0.jar 和 com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 立即下载

相关推荐

com.springsource.org.aspectj.weaver-1.8.5.RELEASE.jar

aspectj.weaver最新的185版本

spring配置

/xml配置文件/spring的配置/spring配置.txtioc(控制反转)要导的包:4个 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <...

weixin_43292547的博客 321

com.springsource.org.aspectj.weaver-1.6.8.RELEASE 下载

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

Spring导入AOP的依赖/引入命名空间

导入AOP依赖 <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</...

Denial_learn的博客 6210

Spring Maven配置

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/mav

笑一个吧 887

SpringSpring的基于AspectJAOP开发

Spring的基于AspectJAOP开发   一、AspectJ简介 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对AspectJ切点表达式支持 @AspectJAspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面 新版本Spring框架,建议使用AspectJ方式来开发AOP 使用AspectJ需要导入Spring AOP和...

Derrick 322

Spring使用AspectJ开发AOP

AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言。Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 AspectJ 方式开发 AOP使用 AspectJ 开发 AOP 通常有两种方式: 基于 XML 的声明式。 基于 Annotation 的声明式。 基于XML的声明式 基于 XML 的声明式...

weixin_45743799的博客 565

【JavaScript基础语法】正则表达式——限制input输入框只能输入字母、数字、字符等

分享一些实用的JavaScript正则表达式,用于限制input输入框的输入内容

XSL_HR的博客 2万+

正则表达式:密码必须至少包含八个字符、至少包含一个数字、小写和大写的字母以及特殊字符...

密码的正则表达式如何来写? 我需要一个正则表达式来检查密码: 密码至少包含八个字符、至少包含一个数字、同时包含小写字母和大写字母以及特殊字符,例如#,?,!) 不能是旧密码或包含用户名,"password"或"websitename" 这里是我的验证表达式,用于限制:八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。 (?=^.{8,}$)((?=.*\d)|(?=...

aihaqi2765的博客 1万+

jquery里用正则来验证密码,必须包含大小写字母,数字及特殊符号,或最少包含两种

我们在web开发中,经常会用到正则来验证用户所输入和提交的内容,所以站长也会经常收集和整理一些好用的正则表达式,记录和整理本来就是学习过程中的一部分,今天在网上看到有人在询问一个正则,就自己写了一下,拿出来与大家分享。 一:要求用正则来验证用户输入的密码,至少包含大小字字母,数字和特殊符号中两种,简单的说,就是验证用户输入的密码不能太简单。 乍一想,这种正则好像不太方便下手写,至少以前站长在验...

大飞笔记(www.it100.site) 5802

密码的正则表达式必须包含至少八个字符,至少一个数字以及大小写字母和特殊字符

I want a regular expression to check that: 我想要一个正则表达式来检查: A password contains at least eight char

xfxf996的博客 10万+

com.springsource.org.aspectj.weaver-1.7.2.RELEASE.jar

java spring4.0以上版本 aop 需要依赖的类包 om.springsource.org.aspectj.weaver-1.7.2.RELEASE.jar

正则表达式判断密码是否包含大小写字母、数字、特殊字符的四种缺一不可,长度8到16 ——CSDN博客

@[TOC]使用排除法一一排除 1、排除大小写字母 (?![a-zA-Z]+$) 2、排除大写字母和数字 (?![A-Z0-9]+$) 3、排除大写字母和特殊字符 (?![A-Z\\W_!@#$%^&*`~()-+=]+$) 4、排除小写字母和数字 (?![a-z0-9]+$) 5、排除小写字母和特殊字符 (?![a-z\\W_!@#$%^&*`~()-+=]+$) 6、排除数字和...

Shaofeng07的博客 3万+

正则表达式:密码必须至少包含八个字符、至少包含一个数字、小写和大写的字母以及特殊字符

密码的正则表达式如何来写? 我需要一个正则表达式来检查密码: 密码至少包含八个字符、至少包含一个数字、同时包含小写字母和大写字母以及特殊字符,例如#,?,!) 不能是旧密码或包含用户名,"password"或"websitename" 这里是我的验证表达式,用于限制:八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。 (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$" 那么,如何写一个正则,限制密码必

coldriversnow的专栏 2万+

正则表达式验证字符串必须同时包含字母、数字、_

正则表达式验证必须包含字母、数字、_ /^(?=.*\d+)(?=.*+)(?=.*[A-Za-z]+)\w{6,16}$/ 表示长度为6-16位包含数字+字母和 .表示匹配除"\n"(换行符)和"\r"(回车符)之外的任何单个字符。 *表示匹配前面的子表达式任意次。例如,abc*能匹配"a",也能匹配“ab”以及“abc”。*等价于{0,}。 ():表示将()之间的表达式定义为“组” group,并且将匹配这个表达式的字符保存到一个临时区域(一个正在表达式中最多可以保存9个),它们可以用\1至\9的符号来

m0_43441273的博客 1万+

JS 判断密码输入框输入的内容为六位,并且至少含有一个数字和字母

$(function(){ $("#id_new_password1").attr("maxlength",6); //控件的最大长度为6 }); }); function test(){ var password = document.getElementById('id_new_password1').value

u012475710的专栏 1万+

【JS】JS校验密码复杂度(必须包含字母、数字、特殊符号)

#场景一:密码中必须包含大小写字母、数字、特称字符,至少8个字符,最多30个字符; var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}'); if (!pwdRegex.test('A3b@C2dEF')) { alert("您的密码复杂度太低(密码中必须包含...

willingtolove的博客 2万+
上一篇: spring 学习笔记 引入通知
下一篇: spring 学习笔记 使用pojo+xml的方式开发aop
Ace_Yu
博客等级 码龄18年 1粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值