赞
踩
准备:aopliance.jar、aspect jweaver.jar
方法:确定一个切入点方法
配置:将通知文件和方法关联起来
举例方法:addStudent
StudentServiceImpl.java
- package com.dt.service.impl;
-
- import org.springframework.transaction.annotation.Propagation;
- import org.springframework.transaction.annotation.Transactional;
-
- import com.dt.dao.IStudentDao;
- import com.dt.dao.impl.StudentDaoImpl;
- import com.dt.entity.Student;
- import com.dt.service.IStudentService;
-
- public class StudentServiceImpl implements IStudentService{
-
- IStudentDao studentDao;
-
- public void setStudentDao(IStudentDao studentDao) {
- this.studentDao = studentDao;
- }
-
- @Override
- public void addStudnet(Student student) {
- studentDao.addStudent(student);
-
- }
-
-
- }
test.java
- package com.dt.test;
-
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- import com.dt.entity.AllCollectionType;
- import com.dt.entity.Course;
- import com.dt.entity.Student;
- import com.dt.service.IStudentService;
-
- public class test {
-
- public static void main(String[] args) {
-
- testAOP();
-
-
- }
-
-
- public static void testAOP(){
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- //需要获取的bean的id值,可进行强制类型转换成类的类型
- IStudentService studentService= (IStudentService)context.getBean("studentService");
- Student student=new Student();
- student.setAge(24);
- student.setName("刘昊然");
- student.setId(2);
- studentService.addStudnet(student);
-
- }
-
-
- }
1、前置通知:每当执行一个切入点方法之前,自动执行的一个方法
将自动执行得方法实现MethodBeforeAdvice接口,并实现里面的方法
LogBefore.java
- package com.dt.aop;
-
- import java.lang.reflect.Method;
-
- import org.springframework.aop.MethodBeforeAdvice;
-
- //前置通知
- public class LogBefore implements MethodBeforeAdvice{
-
- @Override
- public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
- System.out.println("前置通知");
-
- }
-
- }
applicationContext.xml
aop:config将切入方法和通知进行关联的配置:
aop:pointcut标签配置切入点:expression指定切入方法,在方法名前要加上包名.类名两个execution之间可以用or连接
aop:advisor标签将切入点和切面联系起来:属性advice-ref:指向通知的bean的id;属性pointcut-ref指向配置切入点的id
- <bean id="studentDao" class="com.dt.dao.impl.StudentDaoImpl"></bean>
-
- <!-- 配置实现类addStudent()所在的方法 -->
-
- <bean id="studentService" class="com.dt.service.impl.StudentServiceImpl">
- <property name="studentDao" ref="studentDao"></property>
- </bean>
-
-
- <!-- 配置前置通知所在类 -->
-
- <bean id="logBefore" class="com.dt.aop.LogBefore"></bean>
-
- <!-- 将方法所在类和通知进行关联 -->
- <aop:config>
- <!-- 配置切入点 (在哪里执行通知 expression)-->
- <aop:pointcut expression="execution(public void com.dt.service.impl.StudentServiceImpl.addStudnet(com.dt.entity.Student))" id="pointcut"/>
- <!-- 关联:连接切入点和切面的线 -->
- <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
- </aop:config>
2、后置通知:在一个指定的方法执行后,自动执行
需要实现AfterReturningAdvice的接口和接口里的方法
- /**
- *
- */
- package com.dt.aop;
-
- import java.lang.reflect.Method;
-
- import org.springframework.aop.AfterReturningAdvice;
-
- /**
- * @author DT
- *后置通知
- */
- public class LogAfter implements AfterReturningAdvice{
-
- @Override
- public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
- System.out.println("后置通知:目标对象:"+target+",调用的方法名"+method.getName()+",方法的参数个数:"+args.length+",方法的返回值:"+returnValue);
-
- }
-
- }
applicationContext.xml
- <aop:config>
- <!-- 配置切入点 (在哪里执行通知 expression)-->
- <aop:pointcut expression="execution(public void com.dt.service.impl.StudentServiceImpl.addStudnet(com.dt.entity.Student))" id="pointcut2"/>
- <!-- 关联:连接切入点和切面的线 -->
- <aop:advisor advice-ref="logAfter" pointcut-ref="pointcut2"/>
-
- </aop:config>
-
- <bean id="logAfter" class="com.dt.aop.LogAfter"></bean>
3、异常通知:实现ThrowsAdvice接口,实现接口里的方法
public void afterThrowing([Method, args, target], ThrowableSubclass);//[]三个参数全写,或者不写
LogException.java
- package com.dt.aop;
-
- import java.lang.reflect.Method;
-
- import org.springframework.aop.ThrowsAdvice;
-
- /**
- * @author DT
- *异常通知
- */
- public class LogException implements ThrowsAdvice{
-
- //异常通知
-
- public void afterThrowing(Method method, Object[] args, Object target, Throwable ex){
- System.out.println("异常通知:目标对象:"+target+",方法名"+method.getName()+",方法得参数个数:"+args.length+",异常类型:"+ex.getMessage());
-
- }
-
- }
applicationContext.xml
- <!-- 异常通知 -->
- <bean id="logAround" class="com.dt.aop.LogAround"></bean>
- <aop:config>
- <!-- 配置切入点 (在哪里执行通知 expression)-->
- <aop:pointcut expression="execution(public void com.dt.service.impl.StudentServiceImpl.addStudnet(com.dt.entity.Student))" id="pointcut4"/>
- <!-- 关联:连接切入点和切面的线 -->
- <aop:advisor advice-ref="logAround" pointcut-ref="pointcut4"/>
-
- </aop:config>
4、环绕通知:在目标方法得前后、异常发生时、最终等各个地方都可以进行的通知。可以获取目标方法的全部控制权(目标方法是否执行、执行之前、执行之后、参数、返回值等)
环绕通知一个可以替代其余的三个;
在使用环绕通知时,目标方法得一切信息 都可以通过invocation参数获取到
LogAround.java
- /**
- *
- */
- package com.dt.aop;
-
- import org.aopalliance.intercept.MethodInterceptor;
- import org.aopalliance.intercept.MethodInvocation;
-
- /**
- * @author DT
- *环绕通知
- */
- public class LogAround implements MethodInterceptor{
-
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Object result=null;
- //方法体
- try{
- //invocation.proceed()在此方法前得称为前置通知
- System.out.println("用环绕通知实行的前置通知");
-
- //控制目标方法的执行:即写了执行addStudent(),
- //result就是目标方法的返回值
- result=invocation.proceed();
-
-
- //invocation.proceed()在此方法后得称为后置通知
- System.out.println("用环绕通知实行的后置通知");
-
- }catch(Exception e){
- //invocation.proceed()在catch里面就是异常通知
- System.out.println("用环绕通知实行的异常通知");
- }
-
- //result:目标方法的返回值
- return result;
- }
-
- }
通过invocation可得到前置、后置、异常的值
- /**
- *
- */
- package com.dt.aop;
-
- import org.aopalliance.intercept.MethodInterceptor;
- import org.aopalliance.intercept.MethodInvocation;
-
- /**
- * @author DT
- *环绕通知
- */
- public class LogAround implements MethodInterceptor{
-
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Object result=null;
- //方法体
- try{
- //invocation.proceed()在此方法前得称为前置通知
-
- System.out.println("用环绕通知实行的前置通知:目标对象:"+invocation.getThis()+",调用的方法名"+invocation.getMethod().getName()+",方法的参数个数:"+invocation.getArguments().length+",方法的返回值:"+result);
-
-
- //控制目标方法的执行:即写了执行addStudent(),
- //result就是目标方法的返回值
- result=invocation.proceed();
-
-
- //invocation.proceed()在此方法后得称为后置通知
-
- System.out.println("用环绕通知实行的后置通知:目标对象:"+invocation.getThis()+",调用的方法名"+invocation.getMethod().getName()+",方法的参数个数:"+invocation.getArguments().length+",方法的返回值:"+result);
-
- }catch(Exception e){
- //invocation.proceed()在catch里面就是异常通知
- System.out.println("用环绕通知实行的异常通知");
- }
-
- //result:目标方法的返回值
- return result;
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。