文章目录
一、AOP是什么?
AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善,当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义纵向抽取的关系,但并不适合定义横向抽取的关系。
而AOP技术则恰恰利用一种称为“横向抽取”的技术,可以提高代码的重用性,以及可扩展和可维护性。
1.AOP的基本概念
1)Aspect(切面):通常是一个类,里面可以定义切入点和通知。
2) JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。
3)Advice(通知):AOP在特定的切入点上执行的增强处理
4) Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式.
5) AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
二、如何使用AOP
spring动态代理实现(无接口)
1.先写一个类,类中有定义一个add方法
public class UserDaoImpl2 {
public int add(int a, int b) {
System.out.println("调用UserDaoImpl2的add方法");
return a + b;
}
}
2.定义一个springHk的目标对象
package proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class SpringHk implements MethodInterceptor {
// 目标对象
private Object target;
/*
* invocation : 目标对象的目标方法
*/
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("1.鉴权");
// 调用目标方法
Object result = invocation.proceed();
System.out.println("1.日志留痕");
return result;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
3.在spring-beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1.目标对象 -->
<bean id="userDao" class="dao.impl.UserDaoImpl2"></bean>
<bean id="userDaoInter" class="dao.impl.UserDaoImpl"></bean>
<!--2.黑客对象 -->
<bean id="springHk" class="proxy.SpringHk"></bean>
<!--3.代理对象 -->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--3.1目标对象 -->
<property name="target" ref="userDao"></property>
<!-- 3.2 spring 黑客对象 -->
<property name="interceptorNames">
<array>
<value>springHk</value>
</array>
</property>
</bean>
</beans>
4.在test包中编写单元测试
package com.zyc.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import dao.impl.UserDaoImpl;
import dao.impl.UserDaoImpl2;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-beans.xml")
public class SpringHkTest {
@Autowired
@Qualifier("userDaoProxy")
private UserDaoImpl2 userDaoImpl2;
private UserDaoImpl userDaoImpl;
@Test
public void test01() {
System.out.println(userDaoImpl2.add(3, 5));
}
@Test
public void test02() {
System.out.println(userDaoImpl.add(4, 5));
}
}