javaEE之------Spring-----》 AspectJ注解

前面介绍了下Spring中的切面技术。如今说下採用注解的方式进行切面

首先肯定和之前的一样。须要一个自己主动代理的注解类 AnnotationAwareAspectJAutoProxyCreator

配置文件里的代码:

<?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.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
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<bean id="person" class="cn.aop.aspectj2.Person"></bean>
	<!-- 自己主动代理注解 <span style="font-family: Arial, Helvetica, sans-serif;">自己主动去查找带有注解的类和方法,和之前的那个自己主动代理类差点儿相同,原理大概是遍历全部的带注解的类,然后进行一一解析。。</span>
	<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"></bean>
	 -->
	 <!-- 注解自己主动标签,自己主动去查找带有注解的类和方法 -->
	 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	<!-- 注解的切面  须要自己写的切面了===切点+ 通知  在该类中相对之前,比較简单些-->
	<bean class="cn.aop.aspectj2.MyAdvisor"></bean>

</beans>

在配置文件里,我们不难发现,最基本都是 一个被代理的对象。自己主动代理类,切面(能够是自己写的类,这个注解就是自己写的,当然在之前的那个就是用aop里面的)。我们须要写一个自己的切面类

切面类

package cn.aop.aspectj2;

import org.aspectj.lang.JoinPoint;
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 MyAdvisor {
	private final String CUT="execution(* cn.aop.aspectj2.*.*(..))";

	/*
	 * 在核心代码之前运行
	 */
	@Before(CUT)
	public void advice(){
		System.out.println("单独之前拦拦");
	}

	/*
	 * 在核心代码之后运行,正常退出或者异常都会调用这个
	 */
	@After(CUT)
	public void advice2(){
		System.out.println("单独之后拦拦");
	}

	/*
	 * around通知最好不用(能够用before+after来取代),由于參数依赖---但也有优点。
	 * 就是获得被拦截对象和对应方法的信息
	 */
	@Around(CUT)
	public void around(ProceedingJoinPoint p) throws Throwable{
		System.out.println("这是围绕前 "+p.getKind()+","+p.getTarget());
		p.proceed();
		System.out.println("围绕后");
	}

	/*
	 * 是针对某一个函数
	 * 在前面函数运行完毕之后,这个才会运行,
	 * 可是方法中当出现异常之后,这个就不会运行的,正常退出才会运行
	 */
	@AfterReturning(CUT)
	public void afterR(JoinPoint jp ){
		System.out.println("全部之后"+jp.getKind());
	}

	@AfterReturning(CUT)
	public void after2(){
		System.out.println("全部之后222");
	}

	/*
	 * 这个在出现异常之后调用。前提是==------前面的代码没有抓住这个异常,
	 * 前面抓异常之后。这里是不会调用的,一般在日志里面用的比較多。
	 *
	 */
	@AfterThrowing(CUT)
	public void throwex() throws Exception{
		System.out.println("出异常了");
	}

}

person类

package cn.aop.aspectj2;

public class Person {

	public void say(){

//			Integer.parseInt("aa");//測试是否出异常
		System.out.println("...这是say..");
	}

	public void run(){
		System.out.println("这是person中的 run方法");
	}

}

測试类

public class Demo2 {

	@Test
	public void test(){//相同的从容器中拿到配置文件,取出对象
			ApplicationContext app = new ClassPathXmlApplicationContext("cn/aop/aspectj2/aspectj2.xml");
			Person p=app.getBean(Person.class);
			p.run();
			p.say();
	}
}
时间: 2024-11-29 06:13:41

javaEE之------Spring-----》 AspectJ注解的相关文章

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo

Spring Aop实例之AspectJ注解配置

http://blog.csdn.net/xiaoxian8023/article/details/17285809 上篇博文<Spring Aop实例之xml配置>中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop. 依旧采用的jdk代理,接口和实现类代码请参考上篇博文.主要是将Aspect类分享一下: [java] view plaincopy package com.tgb.aop; import org.aspectj.lang.JoinPoint;

SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

AOP(Aspect Oriented Programming).是面向切面编程的技术.AOP基于IoC基础.是对OOP的故意补充. AOP之所以能得到广泛应用,主要是由于它将应用系统拆分分了2个部分:核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面Crosscutting enterprise concerns.比如,全部大中型应用都要涉及到的持久化管理(Persistent).事务管理(Transaction Management).权限管理(P

Spring基于注解@AspectJ的AOP

Spring除了支持XML方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 但是用注解方式需要在XML启用对@AspectJ的支持<aop:aspectj-autoproxy/>,将在Spring上下文创建一个AnnotationAwareAspectJAutoProxyCreator类,它会自动代理一些Bean,这些Bean的方法需要与使用@Aspect注解的Bena中所定义的切点相匹配,而这些切点又是使用@Pointcut注解定义出来的,下面来看下例子(PS:我的例子都

JAVA 常用注解( JDK, Spring, AspectJ )

JDK自带注解   @Override   表示当前方法覆盖了父类的方法   @Deprecation   表示方法已经过时,方法上有横线,使用时会有警告   @SuppviseWarnings   表示关闭一些警告信息(通知java编译器忽略特定的编译警告) Spring注解   @Autowired   spring 自动装配   @Qualifier("JavaBea")   配合 @Autowired 实现自动装配   @Resource(name="JavaBean

Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一个简单的实现四则运算的计算器. 加入AOP功能:日志功能:检测参数中是否有负数的功能. 废话不多说了,直接上代码: (一)基于XML配置: 定义了一个接口类: package com.edu.aop; public interface ArithmeticCalculator { int add(i

spring AOP 编程--AspectJ注解方式 (4)

1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充. AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点. 在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里. AOP 的好处:

Spring JSR-250注解

Spring JSR-250注解 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名.类型等信息,如果关系表字段和 PO 属性名.类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取. 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果

spring AspectJ AOP

1.开启对spring AspectJ风格切面的支持 2.扫描注解的bean 3.声明切面@Aspect 4.声明切入点@Pointcut(value="",argNames="") 5.声明通知@Before @After @AfterReturning @AfterThrowing @Around @Before 前置通知 目标方法运行前织入 @After 后置通知 目标方法后织入 @AfterReturning 后置返回通知 目标方法返回后织入 @AfterT