Spring笔记四:
AOP:
1、在不破坏原有代码的基础上,利用"织入"的模式来实现代码的动态配置
2、实现方式:
准备:
UserService接口:
package com.itcast.service;
public interface UserService {
public void addUser();
public void deleteUser();
public void updateUser();
public void selectUser();
}
UserServiceImpl实现:
package com.itcast.serviceImpl;
import com.itcast.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
@Override
public void updateUser() {
System.out.println("更新用户");
}
@Override
public void selectUser() {
System.out.println("查询用户");
}
}
增加日志
①原生的spring API接口
BeforeLog:
package com.itcast.log;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class BeforeLog implements MethodBeforeAdvice {
@Override
//method 要执行的目标对象方法
//objects (args) 参数
//o (target) 目标对象
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"对象方法"+method.getName()+"执行了");
}
}
AfterLog:
package com.itcast.log;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行了"+method.getClass().getName()+"的"+method.getName()+"方法,结果为"+returnValue);
}
}
在*.xml注册bean:
<bean name="userServiceImpl" class="com.itcast.serviceImpl.UserServiceImpl"/>
<bean name="afterLog" class="com.itcast.log.AfterLog"/>
<bean name="beforeLog" class="com.itcast.log.BeforeLog"/>
*.xml实现aop:
<aop:config>
<!--切入点 expression表达式:execution要执行的位置(*[修饰词] *[返回值] *[类名] *[方法名] *[参数])-->
<aop:pointcut id="pointcut" expression="execution(* com.Lutra.ServiceImpl.UserServiceImpl.*(..))"/>
<!--执行增强-->
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut"/>
</aop:config>
测试:
②自定义方法类
自定义一个方法类:
package com.itcast.DIY;
public class DiyPointCut {
public void Before(){
System.out.println("Before...");
}
public void After(){
System.out.println("After...");
}
}
将自定义类注册到bean中:
<bean name="DiyPointCut" class="com.itcast.DIY.DiyPointCut"/>
实现AOP:
<aop:config>
<aop:aspect ref="DiyPointCut">
<aop:pointcut id="pointCut" expression="execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))"/>
<aop:after method="After" pointcut-ref="pointCut"/>
<aop:before method="Before" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
测试:
③注解
package com.itcast.annotation;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect//标注是一个切面
@Component
public class AnnotationPointCut {
@Before("execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))")//切入点
public void Before(){
System.out.println("---前---");
}
@After("execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))")
public void After(){
System.out.println("---后---");
}
}
*.xml开启注解支持:
<context:annotation-config/>
<context:component-scan base-package="com.itcast.annotation"/>
<aop:aspectj-autoproxy/>
测试: