您的位置:首页 > 编程语言 > Java开发

spring 入门实战(五) aop基于注解的使用

2018-03-26 19:39 381 查看

1.0 开发环境

同上一篇文章 Spring 入门实战(四) aop

2.0 准备工作

由于本篇还是基于aop的 所以我们还是基于上节的代码 做一些相应改动即可

2.1 主业务模块 Affairs.java 同上一篇文章

2.2 切面功能类 Function.java

package com.ccut.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;

@Aspect
public class Function {
private String fmessage;
private String mmessage;
public Function(){}
public String getFmessage() {
return fmessage;
}
public void<
4000
/span> setFmessage(String fmessage) {
this.fmessage = fmessage;
}
public String getMmessage() {
return mmessage;
}
public void setMmessage(String mmessage) {
this.mmessage = mmessage;
}
@Pointcut("execution(* com.ccut.aop.Affairs.PersonA())")
public void cut2(){};
//before增强
@Before(value="cut2()")
public void f(){
System.out.println(this.getFmessage());
}
//环绕增强
@Around(value="cut2()")
public void around(ProceedingJoinPoint pj){
System.out.println("在目标函数之前执行");
try {
pj.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("在目标函数之后执行");
}
}
//after增强
@After(value="cut2()")
public void m(){
System.out.println(this.getMmessage());
}
//返回增强
@AfterReturning(pointcut="execution(* com.ccut..*(..))",returning = "msg")
public void mess(String msg){
System.out.println(msg+"  这是返回后的信息");
}
//异常增强
@AfterThrowing(value="cut2()",throwing="ex")
public void err(Throwable ex){
System.out.println("这个错误是:"+ex);
}

}


2.3 测试类Test.java

package com.ccut.test;

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

import com.ccut.aop.Affairs;

public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("./resources/aop.xml");
Affairs affairs = (Affairs) applicationContext.getBean("affairs");
affairs.PersonA();
affairs.PersonB();

affairs.getMessage1();
affairs.error();

}
}


2.4 配置文件 aop.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 
<aop:aspectj-autoproxy/>

<bean id="affairs" class = "com.ccut.aop.Affairs">
<property name="message1" value="我就是 A 啊  这有什么疑问吗?"/>
<property name="message2" value="我就是 B 啊  这有什么疑问吗?"/>
</bean>

<bean id = "function" class="com.ccut.aop.Function">
<property name="fmessage" value="我可能在你前面执行!"></property>
<property name="mmessage" value="我可能在你后面执行呢!"></property>
</bean>

</beans>


3.0 工程目录



4.0 执行结果



几点说明

@Aspect 代表这个类是切片类

@Pointcut(“execution(* com.ccut.aop.Affairs.PersonA())”)

public void cut2(){}; 定义切入点为 com.ccut.aop.Affairs.下的PersonA() 方法 切入点的名字叫做cut2,相当于xml中的id

@Before(value=”cut2()”) value的值指向切入点id

@AfterReturning(pointcut=”execution(* com.ccut..*(..))”,returning = “msg”) 除了用value外还可以自定义切入点

配置文件中 < aop:aspectj-autoproxy/>代表启用aop注释 这样就不需要在xml配置文件中写代码了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: