Spring Aop 面向切面编程,实现前置通知
耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中个模块间相互联系紧密程度的一种度量。
模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。
OOP:
AOP:aspect oriented program.不改变源代码,还给类增加新的功能.(代理)
Session s = SessionFactory.openSession();
Transaction tx = s.beginTransaction();
s.save(..);
tx.commit();
s.close();
切面:aspect,要实现的交叉功能.
通知:切面的实际实现,比较具体(细化).
连接点:可以将通知应用到目标程序中的地点.(方法调用,异常抛出,要修改的字段)
切入点:真正的将通知应用到目标程序中的地点.
引入:为类增加新的方法和属性.
目标对象:被通知的对象.
代理:把通知应用给目标对象以后,创建暂新的对象,该对象即为代理对象.
织入:把通知应用给目标对象以后,创建暂新的对象的过程即为织入.
1.编译期织入:当把java源代码编译成字节码class文件时,将通知织入.需要特殊的编译器.
2.类装载期织入:当把class文件载入到jvm时,将通知织入.
3.运行期(runtime)织入:
spring代理方式
1.接口代理(jdk的动态代理):
2.对类代理(cglib代理):
aop联盟:
使用spring开发aop:
1.引入aop联盟类库.(spring.jar已经内置了该包)
2.引入cglib类库实现对类代理.${spring解压目录}/lib/cglib/*.jar
PointCut{
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
interface ClassFilter{
boolean isMatch(Class clazz);
}
interface Methodmatcher{
boolean matches(Method m,Class targetClass);1.
boolean isRuntime();2.
boolean matchers(Method m,Class target,Object[] args);3.
}
MethodBeforeAdvice|AfterReturningAdvice|MethodInterceptor
Advisor{
}
使用aspectj进行aop开发
1.引入aspectj类库
${spring解压目录}/lib/aspectj/*.jar
2.
pojo:plain old java object.
使用pojo + xml
dao:data access object.(数据访问对象)
<!-- 创建目标对象bean -->
<bean id="welcomeServiceTarget" class="cn.csdn.spring.service.WelcomeServiceImpl">
<property name="name" value="tom"/>
</bean>
<!-- 创建通知内容的bean -->
<bean id="myMethodBeforeAdvice" class="cn.csdn.spring.advice.MyMethodBeforeAdvice"/>
<!-- 创建代理bean
注意创建代理Bean需要有三个Property要设置,代理的接口(proxyInterfaces)也可以不写
-->
<bean id="welcomeService" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 接口 -->
<property name="proxyInterfaces">
<list>
<value>cn.csdn.spring.service.WelcomeService</value>
</list>
</property>
<!-- 要切入的通知内容 -->
<property name="interceptorNames">
<list>
<value>myMethodBeforeAdvice</value>
</list>
</property>
<!-- 选择目标对象 -->
<property name="target" ref="welcomeServiceTarget"/>
</bean>
//
配置后置通知
1)定义通知
public class MyMethodAfterAdvice implements AfterReturningAdvice {
}
2)
<!-- 要切入的通知内容 -->
<property name="interceptorNames">
<list>
<value>myMethodBeforeAdvice</value>
<value>myMethodAfterAdvice</value>
</list>
</property>
/