spring AOP
来源:互联网 发布:手机知乎怎么复制 编辑:程序博客网 时间:2024/06/06 10:05
AOP
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
spring还有一个特点就是极度化简洁了代码 保证了代码的不重复性
因为代码都写在了配置里 可维护性高
spring重点是前置通知和后置通知包括过滤事件 可以用作于事物(开始和结束)
不过前置通知的基础上是动态代理 和静态代理
举一个静态代理的列子
列如明星和经纪人之间的关系
Artor 艺人类
package com.zking.proxy;
public interface Artor {
public void show();
public void danceSing();
}
BaoBaoWang 明星类
明星需要实现一个接口 因为经纪人代理明星需要从明星那里拿到同意
所以我们需要些一个接口
package com.zking.proxy;
public class BaoBaoWang implements Artor{
public void show() {
System.out.println("展示....");
}
public void danceSing() {
System.out.println("歌唱....");
}
}
SongZhe 经纪人
因为经纪人是代理明星的 所以决定需要从明星那里得到
(最好不要有这样的经纪人 表面上装的像模像样 背地里捅你一刀)
package com.zking.proxy;
public class SongZhe implements Artor{
private Artor artor;
public SongZhe(Artor artor) {
this.artor=artor;
}
public void show() {
artor.show();
}
public void danceSing() {
artor.danceSing();
}
}
//执行
Artor artor=new BaoBaoWang();
artor=new SongZhe(artor);
artor.show();
如果需要加入前置通知和后置通知的话
我们需要写一个spring配置文件
<!-- 配置目标 -->
<bean id="yangmi" class="com.zking.proxy.BaoBaoWang"></bean>
<!-- 配置通知 -->
<bean id="mf" class="com.zking.proxy.SongZhe"></bean>
<!-- 配置前置通知 -->
<bean id="before" class="com.zking.proxyspring.Before"></bean>
<!-- 过滤器 如果方法里有play 就不显示前置通知 -->
<bean id="before_gl" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="mf"></property>
<property name="pattern" value=".*play.*"></property>
</bean>
<!-- 配置后置通知 -->
<bean id="after" class="com.zking.proxyspring.After"></bean>
<!-- 配置混合代理对象 -->
<bean id="myProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 引入目标 -->
<property name="target" ref="yangmi"></property>
<!-- 引用目标实现的所有接口 -->
<property name="proxyInterfaces">
<list>
<value>com.zking.proxyspring.Artor</value>
</list>
</property>
<!-- 引用通知 -->
<property name="interceptorNames">
<list>
<idref bean="before_gl"/>
<idref bean="mf"/>
<idref bean="after"/>
</list>
</property>
</bean>
以上:name代表的是系统的名字 com.zking开头的是我自己写的类 其他的是系统的类
但是:我们需要加入spring jar包
如果用的是maven 那么加入spring的依赖
<!-- 引入Spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
给大家推荐一个网址 里面全部是依赖
http://mvnrepository.com/
前置通知
package com.zking.proxyspring;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
/**
* 前置通知
* @author Administrator
*
*/
public class Before implements MethodBeforeAdvice{
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.println("一见钟情 难以忘怀");
}
}
后置通知
package com.zking.proxyspring;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
/**
* 后置通知
* @author Administrator
*
*/
public class After implements AfterReturningAdvice{
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("余生再也没有你...");
}
}
执行
package com.zking.proxyspring;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testproxy {
@Test
public void test(){
ApplicationContext context=new ClassPathXmlApplicationContext("ServerContext.xml");
Artor artor=(Artor) context.getBean("myProxy");
artor.play();
}
}
- AOP、Spring的AOP
- AOP--Spring AOP
- Spring AOP 嵌套AOP
- spring AOP
- Spring AOP
- Spring AOP
- spring aop
- Spring AOP
- spring AOP
- spring aop
- Spring aop
- Spring-AOP
- Spring AOP
- spring aop
- spring aop
- Spring AOP
- Spring AOP
- Spring Aop
- 计蒜客 矩阵变换 (bfs+set)
- vld内存泄漏检查工具不能显示内存泄漏文件名与行号
- 线程池-invokeAll的使用
- java内存溢出问题处理
- springMVC笔记
- spring AOP
- Spring -Ioc学习(1)
- 逻辑混乱--html与css学习小结
- Elasticsearch Reference 5.5 中文翻译3
- Another MySQL daemon already running with the same unix socket
- HTML5追加HTML5本地存储详解
- windows网络共享访问centos samba服务端出现权限问题不能访问解决
- Spring-AOP
- 如何在DataFrame索引某一行