Spring中的AOP配置
步骤
导包4+2+2
- 4个核心包+2个日志包
- 在其他的依赖包
spring-framework-3.0.2.RELEASE-dependencies
中找到 - 路径:
spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance\com.springsource.org.aopalliance\1.0.0\com.springsource.org.aopalliance-1.0.0.jar
的com.springsource.org.aopalliance-1.0.0.jar - 路径:
spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE\com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
的com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
导入约束
- spring-aop-4.3.xsd
- 书写通知类
- 书写配置文件
通知类
/**
* 通知类
*/
public class MyAdvice {
/**
* 前置通知
*/
public void before(){
System.out.println("前置通知");
}
/**
* 后置对象(如果出现异常不会调用)
*/
public void afterReturning(){
System.out.println("后置对象(如果出现异常不会调用)");
}
/**
* 环绕通知
* @return
* @throws Throwable
*/
public Object around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("环绕通知前");
Object proceed = pjp.proceed();
System.out.println("环绕通知后");
return proceed;
}
/**
* 异常通知
*/
public void afterException(){
System.out.println("异常通知");
}
/**
* 后置通知(出现异常也会调用)
* 也可以叫始终通知 或者最终通知
*/
public void after(){
System.out.println("后置通知(出现异常也会调用)");
}
}
配置文件
- 步骤
- 把配置类放进容器
- 使用 aop:config 声明aop配置
- 使用 aop:pointcut 配置切入点表达式
- 使用 aop:aspect 配置切面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
<!-- 配置真实对象 -->
<bean id="userServiceImpl" class="com.service.impl.UserServiceImpl"></bean>
<!-- 配置通知对象 -->
<bean id="MyDivce" class="com.aop.MyAdvice"></bean>
<!-- 配置对象 -->
<aop:config>
<!-- 描述通知 -->
<aop:pointcut expression="execution(* com.service.impl.UserServiceImpl.*(..))" id="pc"/>
<aop:aspect ref="MyDivce">
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="pc"/>
<!-- 后置通知(如果出现异常不调用) -->
<aop:after-returning method="afterReturning" pointcut-ref="pc"/>
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="pc"/>
<!-- 异常通知 -->
<aop:after-throwing method="afterException" pointcut-ref="pc"/>
<!-- (始终)后置通知(出现异常也会调用) -->
<aop:after method="after" pointcut-ref="pc"/>
</aop:aspect>
</aop:config>
</beans>
真实对象
public class UserServiceImpl implements IUserService{
@Override
public void save() {
System.out.println("保存客户");
}
@Override
public void delete() {
System.out.println("删除客户");
}
@Override
public void update() {
System.out.println("更新客户");
}
@Override
public void find() {
System.out.println("查找客户");
}
}
测试
/**
* 使用Spring结合的Junit
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo {
/**
* 注入值给接口,是接口!! 因为是动态代理原理
*/
@Resource(name="userServiceImpl")
private IUserService userService;
/**
* 测试
*/
@Test
public void test1(){
userService.save();
}
}