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("[后置通知] 提交事务.."); } // 【返回后通知】 在执行目标方法结束后执行, 出现异常不会执行 } |
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(); } } |