spring框架,什么是AOP,AOP面向切面编程是怎么样的


   AOP: (Aspect Oriented Programming) 面向切面编程。是目前软件开发中的一个热点,也是Spring框架中容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

   AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

       举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

      同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOP对一个动作进行封装,则有点不伦不类。 换而言之,OOP面向名词领域,AOP面向动词领域。

           总之,AOP可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。


这篇代码可能对于AOP稍微有些理解的同学看的会有助于加深理解。如果没去了解过可能看代码会有些吃力。





接口:Service.java
两个接口实现类:serviceImpl.java serviceImpl2.java
切面(增强代码):MyAspect.java
配置文件:springaop.xml
测试文件:Test.java

接口
package spring.aop;

public interface Service {
	//一个接口
	void add();

	void update();

	void delete();
}


两个接口实现类
1.
package spring.aop;

public class ServiceImpl implements Service {
	//第一个特实现类
	public void add() {
		System.out.println("add");
	}

	public void update() {
		System.out.println("udpate");
	}

	public void delete() {
		System.out.println("delete");
	}
}

2.
package spring.aop;

public class ServiceImpl2 implements Service {
	//第二个实现类
	public void add() {
		System.out.println("add22");
	}

	public void update() {
		System.out.println("update222");
	}

	public void delete() {
		System.out.println("delete222");
	}

}

切面(增强代码)
package aopxml;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

//切面 也就是增强的代码
public class MyAspect implements MethodInterceptor{

	@Override
	public Object invoke(MethodInvocation mi) throws Throwable {
		System.out.print("----------前代码");//增强的代码
		Object obj = mi.proceed();
		System.out.println("----------后代码");
		return obj;
	}
}





配置文件
<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
					http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
					http://www.springframework.org/schema/aop 
					http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
					http://www.springframework.org/schema/context 
					http://www.springframework.org/schema/context/spring-context-3.0.xsd
					http://www.springframework.org/schema/tx 
					http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
		
		<!-- 目标类 -->
	<bean id="service1" class="spring.aop.ServiceImpl"></bean>	
	<bean id="service2" class="spring.aop.ServiceImpl2"></bean>	
		<!-- 切面 -->
	<bean id="MyAspectId" class="aopxml.MyAspect"></bean>
	
	<aop:config>
		<aop:pointcut expression="execution(* spring.aop.Service*.add*(..))" 
								  <!-- 这里就是筛选过滤的地方,切入点表达式,具体请看上一篇
								http://blog.csdn.net/qq_39654446/article/details/77886120  -->
		id="myPointCut"/>
		<aop:advisor advice-ref="MyAspectId" pointcut-ref="myPointCut"/>
	</aop:config>
		
						
</beans>

package aopxml;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;//切面 也就是增强的代码public class MyAspect implements MethodInterceptor{@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {System.out.print("----------前代码");//增强的代码Object obj = mi.proceed();System.out.println("----------后代码");return obj;}}


 
 
测试代码
package aopxml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import spring.aop.Service;



public class Teat {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("aopxml/springaop.xml");
		Service service = (Service) ac.getBean("service2");
		service.add();
		System.out.println("-----------");
		service.delete();
		System.out.println("--------------");
		service.update();
		System.out.println("---------------");
		Service service1 = (Service) ac.getBean("service1");
		service1.add();
		System.out.println("-------------------");
		service1.delete();
		System.out.println("------------------");
		service1.update();
	}	
}


最后输出的结果是这样的


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值