这里AOP简介参考百度百科:
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
AOP可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
将日志记录,性能统计,安全控制,事务处理, 异常处理 等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
我的理解是Spring利用AOP技术实现将日志记录、性能统计、安全控制、事务处理、异常处理功能与逻辑代码隔离。逻辑代码只管实现逻辑功能,像日志记录这样的额外功能通过AOP技术实现动态添加。
看一个实例:
1.新建工程Spring403;
2.新建一个接口(Spring支持面向接口变成)
package com.test.service;
public interface StudentService {
public void addStudent(String name);
}
这里定义了一个业务逻辑添加学生方法。
3.新建这个接口的实现类:
package com.test.service.impl;
import com.test.service.StudentService;
public class StudentServiceImpl implements StudentService{
@Override
public void addStudent(String name) {
System.out.println("添加学生"+name);
}
}
这里实现了添加学生业务功能。
4.写Spring配置文件,定义一个实例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="studentService" class="com.test.service.impl.StudentServiceImpl"></bean>
</beans>
这里定义了一个StudenServiceImpl类的实例。
5.写测试方法:
package com.test.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.service.StudentService;
public class Test2 {
private ApplicationContext ac;
@Before
public void setUp() throws Exception {
ac = new ClassPathXmlApplicationContext("beans.xml");
}
@After
public void tearDown() throws Exception {
}
@Test
public void test1() {
StudentService studentService = (StudentService) ac.getBean("studentService");
studentService.addStudent("张三");
}
}
运行测试方法test1,就可以实现添加学生张三。
这里添加新的业务要求,要求添加日志记录功能。每次添加一个学生之前和完成之后都要进行日志记录。按照传统的方法,需要修改业务实现代码为:
package com.test.service.impl;
import com.test.service.StudentService;
public class StudentServiceImpl implements StudentService{
@Override
public void addStudent(String name) {
System.out.println("日志记录:开始添加学生"+name);
System.out.println("添加学生"+name);
System.out.println("日志记录:完成添加学生"+name);
}
}
这里是传统的方法,可以看到这里日志记录的代码和业务逻辑代码耦合在了一起。这样的话首先是对原有业务代码的侵入,增加了耦合度,当代码量非常大的时候,对程序的维护非常不好。
这里要想实现日志记录功能代码与原有的业务逻辑代码分离,就可以使用AOP来实现。AOP的要求是把日志记录功能和业务逻辑代码分离,在不改变原有逻辑代码的基础上动态的切入日志记录功能。具体实现方式参考下一篇博客。