关于maven的配置文件路径问题以及工程结构可参考以下博客:
http://www.cnblogs.com/pixy/p/4798089.html
简要概述:
1. AOP:Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现的统一维护的一种技术提供了声明式的企业服务,特别是EJB的替代服务的声明,允许用户定制自己的方面,以完成OOP和AOP的互补使用(AOP在各个功能之间横切的功能)
主要的功能:日志记录,性能统计,安全控制,事务处理,异常处理等。
2. AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
“Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。比如日志 异常处理 等等服务于各个模块,但不便于再各个模块重新定义,否则会增大代码量。
3. 切入点也可以理解为对拦截点的一个定义,比如前置通知 后置通知,返回后通知等,它们通知时的时间并不同
4. 切入点与连接点的关系:连接点是切入点的统称,每个切入点对应一个具体的连接点,将通知或拦截器插入到具体的连接点上
Schema-based AOP(基于配置的AOP)
简要概述:Spring 所有的切面和通知器都必须放在一个< aop:config >内(可以配置包含多个< aop:config >)
<aop:config>可以包含pointcut,advisor和aspect元素(必须按照这个顺序)<aop:config>大量Spring自动代理机制
代码实例
1.pom.xml(注意添加Spring AOP依赖的jar包aspectjrt.jar aspectjweaver.jar)
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
2.创建Student.java
public class Student {
private int age;
private String name;
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
}
}
3.创建Logger.java
public class Student {
private int age;
private String name;
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
}
}
4.application.xml配置
<bean id="logger" class="com.ruanjianlin.demo.Logger"></bean>
<aop:config>
<aop:aspect id="log" ref="logger">
<aop:pointcut id=" selectAll" expression="execution(*com.ruanjianlin.demo.*.*(..))"/><!-- 执行这个包下的所有方法--><!--expression="ececution(* com.ruanjianlin.demo.*.*(..))" -->
<aop:before method="beforeAdvice" pointcut-ref=" selectAll"/>
<aop:after method="afterRunning" pointcut-ref=" selectAll"/>
<aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref=" selectAll"/>
<aop:after-returning method="afterReturning" returning="val" pointcut-ref=" selectAll"/>
</aop:aspect>
</aop:config>
<bean id="student" class="com.ruanjianlin.demo.Student">
<property name="name" value="ruanjinlin"/>
<property name="age" value="21"/>
</bean>
5.测试类的使用
ApplicationContext context =
new ClassPathXmlApplicationContext("application.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
6.运行结果
beforeAdvice
afterRunning
afterRturningruanjinlin
beforeAdvice
afterRunning
afterRturning21
简要分析:前置通知-后置通知-返回后通知-得到结果