接口的实现
AOP专业术语:
1.切面 Aspect:交叉要实现的功能
2.连接点:应用程序执行过程中插入切面的地点,此处可以是方法的调用,异常抛出甚至是要修改的字段
3.通知:通知是切面的实际实现。它通知应用系统新的行为,通知在连接点插入到应用系统中。
4.切入点:定义了通知应该应用在哪些连接点.通常通过指定类名和方法名,或匹配类名和方法名
式样的正则表达式来指定切入点。
5.引入:允许为已存在的类添加新的属性和方法
6.目标对象: 被通知的对象。即可是编写的类也可以是添加定制行为的第三方类。
7.代理对象:将通知应用到目标对象后创建的对象
8.织入:将切面应用到目标对象从而创建一个新的代理对象的过程.切面在指定接入点
被织入到目标对象中,织入发生在目标对象声明周期的多个点上。
1、编译器:切面在目标对象编译时织入(需要特殊的编译器)。
Java源代码.java------>.class
2、类装载期:切面在目标对象被载入到JVM时织入(需要特殊的类载入器,在类的载入到应用程序之前增强目标对象的字节码)。
.class---JVM
3、运行期 切面在应用系统运行时织入(通常:aop)
9.什么是AOP呢?
在不该变源码的情况下,为类添加新的功能。
-------------------------------------------
例子:
接口代理
前置通知的实现:------
创建一个接口类:<EmpService.java>
package cn.csdn.service;
//接口类
public interface EmpService {
public void work();
}
创建一个实现类接口:
<EmpserviceImpl.java>
package cn.csdn.service;
//接口实现类
public class EmpServiceImpl implements EmpService{
@Override
public void work() {
System.out.println(".....员工工作????");
}
}
创建一个class类
<MyBeforeAdvice.java>类
package cn.csdn.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice{
/*
* arg0:代表的是方法。
* arg1:代表的是方法参数。
* arg2:代表的是目标对象
*/
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("员工大卡..............");
}
}
bean的声明在<applicationContext.xml>中
<!-- 声明前置通知 -->
<bean id="myBeforeAdvice" />
<!-- 声明目标对象 -->
<bean id="empServiceTarget" />
<!--声明代理对象 -->
<bean id="empServiceProxy" />
</property>
</bean>
第三部:
<App.java>中测试类
package cn.csdn.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
@Test
public void app(){
/*获取代理对象*/
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:a*.xml");
EmpService es=(EmpService) ac.getBean("empServiceProxy");
/*调用代理对象的方法*/
es.work();
}
}
-------------------------------
基于接口的实现:
EmpService es=(EmpService) ac.getBean("empServiceProxy");
基于类的实现:
在bean中
<!-- 采用CGLIB的代理 -->
<property name="proxyTargetClass" value="true"/>
添加类库文件包:lib/cglib-nodep-2.1_3.jar
将App.java
EmpServiceImpl es=(EmpServiceImpl) ac.getBean("empServiceProxy");