1、Spring AOP半自动编程
核心步骤: 1. 创建一个接口以及它的实现类 2. 编写切面类,实现MethodInterceptor接口的invoke方法 3. 配置Spring的配置文件,xml文件中的配置重要是:【重要】 1).配置目标类的bean 2).配置切面类的bean 3).配置代理对象,其中代理对象中主要的配置如下' a.配置接口 b.配置目标类 c.配置切面类 d.还可以用
<property name="optimize" value="true"/>
,指明使用cglib的代理对象
1.1首先编写一个接口
package com.xzy.service;
public interface UserSeviceBase {
/**
* 增加用户
*/
public void addUser();
/**
* 删除用户
* @param id
*/
public void deleteUser(int id);
/**
* 更新用户
* @param id
*/
public void updateUser(int id);
}
1.2 编写接口的实现类:
package com.xzy.service;
public class UserSeviceImpl implements UserSeviceBase {
@Override
public void addUser() {
System.out.println("增加了1个用户");
}
@Override
public void deleteUser(int id) {
System.out.println("删除了id为"+id+"的用户");
}
@Override
public void updateUser(int id) {
System.out.println("id为"+id+"的用户更新了");
}
}
1.3 编写一个切面类:让这个切面类实现MethodInvocation接口的invoke方法
package com.xzy.Aspect;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import java.util.Date;
//切面类
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("执行操作前日志......" + new Date());
Object obj = methodInvocation.proceed();
System.out.println("执行操作后日志......" + new Date());
return obj;
}
}
1.4 在Spring的配置文件Application.xml中注册代理对象
<!--注册目标对象UserService-->
<bean id="userService" class="com.xzy.service.UserSeviceImpl"></bean>
<!--注册切面类-->
<bean id="myAspect" class="com.xzy.Aspect.MyAspect"></bean>
<!--注册代理对象-->
<bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--接口-->
<property name="interfaces" value="com.xzy.service.UserSeviceBase"/>
<!--目标对象-->
<property name="target" value="#{userService}"/>
<!--切面类-->
<property name="interceptorNames" value="myAspect"/>
<!--配置使用cglib,当没有配置的时候默认是false,也就是使用JDk的Proxy-->
<property name="optimize" value="true"/>
</bean>
1.5 测试:
package com.xzy;
import com.xzy.service.UserSeviceBase;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Unit test for simple App.
*/
public class AppTest {
@Test
public void test(){
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从Spring容器中拿代理对象
UserSeviceBase userSevice= (UserSeviceBase) context.getBean("proxyService");
userSevice.deleteUser(23);
userSevice.updateUser(3);
}
}
测试结果:

2、Spring AOP 全自动编程
主要步骤: 1).实现切面类 2).在bean配置文件中吧切点和切面关联起来
2.1 实现一个切面类,继承MethodInterceptor接口实现它的invoke方法
package com.xzy.Aspect;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import java.util.Date;
//切面类
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("执行操作前日志......" + new Date());
Object obj = methodInvocation.proceed();
System.out.println("执行操作后日志......" + new Date());
return obj;
}
}
接着在Spring配置文件Application.xml中配置aop的schema文件,如下红框的配置:

<!--配置UserService-->
<bean id="userService" class="com.xzy.service.UserSeviceImpl"></bean>
<!--配置切面类-->
<bean id="myAspect" class="com.xzy.Aspect.MyAspect"></bean>
<!--配置全自动AOP代理-->
<aop:config >
<!--配置切点expression:表达式,就是用来切入的业务类-->
<aop:pointcut id="myPointcut" expression="execution(* com.xzy.service.*.*(..))"/>
<!--配合通知 通知要关联切点和切面类
advice-ref:切面类
pointcut-ref:切点
-->
<aop:advisor advice-ref="myAspect" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
对于配置全自动AOP代理的一点说明,如下图所示<aop:config>
标签中重要的三种元素:切点:<aop:pointcut>
、切面:<aop:aspect>
、通知:<aop:advisor>


@Test
public void test(){
ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从Spring容器中拿代理对象
UserSeviceBase userSevice= (UserSeviceBase) context.getBean("userService");
userSevice.deleteUser(23);
userSevice.updateUser(3);
}
测试结果:

写在最后 通过实际的操作可以明显感受到第二种方式实现AOP是省事儿又简单的一种方式,然而第二种方式也是Spring中使用到AOP是常用到的一种配置方式。既然有全自动xml的配置方式,那么一定就会有对应对一套使用注解配置对方式。下一节就讲讲如何用注解配置使用Spring AOP