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();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值