Spring-Aop注解

Spring

Aop注解方式

概念:

         Aop编程:

                   关注点代码与业务代码分离!(jdk/cglib代理)

         关注点:

                   重复执行的代码, 也叫关注点代码!

         切面:

                   关注点代码形成的类,就叫做切面

                   springAop编程,也叫面向切面编程!

                   Aop: Aspect Object Programming 面向切面编程!         

                   举例,哪些是切面?

                            事务,权限控制, 日志…

         切入点表达式:

                   拦截方法,给方法所在的类,生成代理对象!

                   Spring在初始化容器的时候,会根据切入点表达式的规则,会符合拦截规则的方法所在的类生成代理对象!、

示例:

1、接口

package cn.itcast.e_aop_anno;

public interface IUserDao {

	void save();

}

2、接口实现类

package cn.itcast.e_aop_anno;

import org.springframework.stereotype.Repository;

@Repository			// 把对象加入ioc容器
public class UserDao implements IUserDao {
	
	public void save() {
		System.out.println("保存...");
	}
}

3、切面类

package cn.itcast.e_aop_anno;
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;
import org.springframework.stereotype.Component;

// 该类为切面类,也就是关注点代码
@Component("aop")
@Aspect      // 指定一个类为切面类
public class TransactionAop {

// 定义一个切入点表达式变量  (后面使用这个切入点表达式的时候,直接引用方法名即可)
@Pointcut("execution(* cn.itcast.e_aop_anno.UserDao.*(..))")
public void pointcut_(){
}


//【前置通知】
// 在执行业务方法,之前执行
@Before("pointcut_()")
public void beginTransaction() {
System.out.println("[前置通知]  开启事务..");
}

//【后置通知】
// 在执行业务方法,之后执行
@After("pointcut_()")
public void commit() {
System.out.println("[后置通知] 提交事务..");

}


        // 【返回后通知】   在执行目标方法结束后执行, 出现异常不会执行
@AfterReturning("pointcut_()")
public void afterReturing(){
System.out.println("[返回后通知]");
}

// 【异常通知】   在执行目标方法的时候出现异常执行
@AfterThrowing("pointcut_()")
public void afterThrowing(){
System.out.println("[异常通知]");
}

// 【环绕通知】 会环绕目标方法执行
@Around("pointcut_()")
public void arroud(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("[环绕前:]");
pjp.proceed();       // 执行目标方法
System.out.println("[环绕后:]");
}

}

4、测试

package cn.itcast.e_aop_anno;


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


public class App {

private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml",getClass());

@Test
public void testApp() throws Exception {
IUserDao userDao = (IUserDao) ac.getBean("userDao");
userDao.save();
}

}

猜你喜欢

转载自blog.csdn.net/chenzuyibao/article/details/80613731