17、(知识篇)Spring使用AOP(XML方式)
2016-12-17 17:23
477 查看
/**
* Spring AOP 使用方法(xml形式)
*
* xml方式比较简单,首先在xml中配置好相关bean
*
* 然后设置切点和切面即可
*
* 详情参考application.xml
*
*
* @param args
*/
测试类:
package com.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.contoller.UserController;
import com.spring.vo.User;
public class Test {
/**
* Spring AOP 使用方法(xml形式)
*
* xml方式比较简单,首先在xml中配置好相关bean
*
* 然后设置切点和切面即可
*
* 详情参考application.xml
*
*
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过springioc获取bean
UserController ctrl = (UserController) ctx.getBean("userController");
//调用bean方法
ctrl.saveUser(new User("Super Man", 20));
//测试异常通知:ctrl.saveUser(new User("Super Man", 20));
}
}
通知类(aop使用):
package com.spring.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
public class LoggingTools {
/**
* 前置通知
* @param joinpoint
*/
public void beforeLog(JoinPoint joinpoint){
Signature sign = joinpoint.getSignature();
System.out.println(" 前置通知 beforeAdvice ... "+sign.getName()+" params ... "+joinpoint.getArgs());
}
/**
* 后置通知 (即使有无异常都回执行,大致上等于java里的finally块)
* @param jp
*/
public void afterLog(JoinPoint jp){
System.out.println(" 后置通知 afterAdvice ... "+jp.getSignature().getName());
}
/**
* 返回通知:相当于调用方法成功获取到返回值
* @param jp
* @param result
*/
public void afterReturningLog(JoinPoint jp,Object result){
System.out.println(" 返回通知 afterReturingAdvice ... "+jp.getSignature().getName()+" the result is "+result);
}
/**
* 异常通知:运行异常触发一下事件,大致相当于catch块
* @param jp
* @param e
*/
public void afterThrowingLog(JoinPoint jp,Exception e){
System.out.println(" 异常通知 afterThrowingAdvice ... "+jp.getSignature().getName()+" exception is ... "+e);
}
/**
* 环绕通知,是上面4种通知的完整版本
* 能够实现上面所有通知功能
* 参数使用proceedingJoinPoint
* @param pjd
* @return
*/
/*public Object aroundLog(ProceedingJoinPoint pjd){
Signature sign = pjd.getSignature();
Object[] args = pjd.getArgs();
Object result = null;
try {
System.out.println(" 前置通知 beforeAdvice ... "+sign.getName());
//if(args[0] instanceof User){
//return 0;
//}
result = pjd.proceed();//调用方法。。。
System.out.println(" 返回通知 afterReturingAdvice ... "+sign.getName()+" the result is "+result);
} catch (Throwable e) {
// TODO: handle exception
System.out.println(" 异常通知 afterThrowingAdvice ... "+sign.getName()+" exception is ... "+e);
throw new RuntimeException(e);
} finally{
System.out.println(" 后置通知 afterAdvice ... "+sign.getName());
}
return result;
}*/
}
实体类(注意!bean中需要用get/set方法,xml才可以配置有效)
package com.spring.contoller;
import com.spring.dao.UserDao;
import com.spring.vo.User;
public class UserController {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public int saveUser(User user) {
// TODO Auto-generated method stub
return userDao.save(user);
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- <bean id="user" class="com.spring.vo.User"></bean> -->
<bean id="userDao" class="com.spring.dao.UserDao"></bean>
<!-- 属性需要提供get/set方法 -->
<bean id="userController" class="com.spring.contoller.UserController">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="joinPointTest" class="com.spring.aop.JoinPointTest"></bean>
<bean id="loggingTools" class="com.spring.aop.LoggingTools"></bean>
<aop:config>
<!-- 指定切点 -->
<aop:pointcut expression="execution(* com.spring.contoller.UserController.*(..))" id="pointcut"/>
<!-- 指定切面 -->
<aop:aspect ref="loggingTools" order="1">
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
<aop:after method="afterLog" pointcut-ref="pointcut"/>
<aop:after-returning method="afterReturningLog" pointcut-ref="pointcut" returning="result"/>
<aop:after-throwing method="afterThrowingLog" pointcut-ref="pointcut" throwing="e"/>
<!-- <aop:around method="aroundLog" pointcut-ref="pointcut" /> -->
</aop:aspect>
<aop:aspect ref="joinPointTest" order="2">
<aop:before method="beforeJoinPoint" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
* Spring AOP 使用方法(xml形式)
*
* xml方式比较简单,首先在xml中配置好相关bean
*
* 然后设置切点和切面即可
*
* 详情参考application.xml
*
*
* @param args
*/
测试类:
package com.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.contoller.UserController;
import com.spring.vo.User;
public class Test {
/**
* Spring AOP 使用方法(xml形式)
*
* xml方式比较简单,首先在xml中配置好相关bean
*
* 然后设置切点和切面即可
*
* 详情参考application.xml
*
*
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过springioc获取bean
UserController ctrl = (UserController) ctx.getBean("userController");
//调用bean方法
ctrl.saveUser(new User("Super Man", 20));
//测试异常通知:ctrl.saveUser(new User("Super Man", 20));
}
}
通知类(aop使用):
package com.spring.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
public class LoggingTools {
/**
* 前置通知
* @param joinpoint
*/
public void beforeLog(JoinPoint joinpoint){
Signature sign = joinpoint.getSignature();
System.out.println(" 前置通知 beforeAdvice ... "+sign.getName()+" params ... "+joinpoint.getArgs());
}
/**
* 后置通知 (即使有无异常都回执行,大致上等于java里的finally块)
* @param jp
*/
public void afterLog(JoinPoint jp){
System.out.println(" 后置通知 afterAdvice ... "+jp.getSignature().getName());
}
/**
* 返回通知:相当于调用方法成功获取到返回值
* @param jp
* @param result
*/
public void afterReturningLog(JoinPoint jp,Object result){
System.out.println(" 返回通知 afterReturingAdvice ... "+jp.getSignature().getName()+" the result is "+result);
}
/**
* 异常通知:运行异常触发一下事件,大致相当于catch块
* @param jp
* @param e
*/
public void afterThrowingLog(JoinPoint jp,Exception e){
System.out.println(" 异常通知 afterThrowingAdvice ... "+jp.getSignature().getName()+" exception is ... "+e);
}
/**
* 环绕通知,是上面4种通知的完整版本
* 能够实现上面所有通知功能
* 参数使用proceedingJoinPoint
* @param pjd
* @return
*/
/*public Object aroundLog(ProceedingJoinPoint pjd){
Signature sign = pjd.getSignature();
Object[] args = pjd.getArgs();
Object result = null;
try {
System.out.println(" 前置通知 beforeAdvice ... "+sign.getName());
//if(args[0] instanceof User){
//return 0;
//}
result = pjd.proceed();//调用方法。。。
System.out.println(" 返回通知 afterReturingAdvice ... "+sign.getName()+" the result is "+result);
} catch (Throwable e) {
// TODO: handle exception
System.out.println(" 异常通知 afterThrowingAdvice ... "+sign.getName()+" exception is ... "+e);
throw new RuntimeException(e);
} finally{
System.out.println(" 后置通知 afterAdvice ... "+sign.getName());
}
return result;
}*/
}
package com.spring.aop; public class JoinPointTest { public void customerJoinPoint() { } public void beforeJoinPoint() { System.out.println("before joinpoint test ... "); } }
实体类(注意!bean中需要用get/set方法,xml才可以配置有效)
package com.spring.contoller;
import com.spring.dao.UserDao;
import com.spring.vo.User;
public class UserController {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public int saveUser(User user) {
// TODO Auto-generated method stub
return userDao.save(user);
}
}
package com.spring.dao; import com.spring.vo.User; public class UserDao { public int save(User user) { // TODO Auto-generated method stub int money = 1000/user.getAge(); System.out.println("save user ... "+user+" , he has "+(1000/user.getAge())+" dollars"); return money; } }
package com.spring.vo; public class User { private String name; private int age; public User() { super(); // TODO Auto-generated constructor stub } public User(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- <bean id="user" class="com.spring.vo.User"></bean> -->
<bean id="userDao" class="com.spring.dao.UserDao"></bean>
<!-- 属性需要提供get/set方法 -->
<bean id="userController" class="com.spring.contoller.UserController">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="joinPointTest" class="com.spring.aop.JoinPointTest"></bean>
<bean id="loggingTools" class="com.spring.aop.LoggingTools"></bean>
<aop:config>
<!-- 指定切点 -->
<aop:pointcut expression="execution(* com.spring.contoller.UserController.*(..))" id="pointcut"/>
<!-- 指定切面 -->
<aop:aspect ref="loggingTools" order="1">
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
<aop:after method="afterLog" pointcut-ref="pointcut"/>
<aop:after-returning method="afterReturningLog" pointcut-ref="pointcut" returning="result"/>
<aop:after-throwing method="afterThrowingLog" pointcut-ref="pointcut" throwing="e"/>
<!-- <aop:around method="aroundLog" pointcut-ref="pointcut" /> -->
</aop:aspect>
<aop:aspect ref="joinPointTest" order="2">
<aop:before method="beforeJoinPoint" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
相关文章推荐
- spring学习笔记8--使用spring进行面向切面的(AOP)编程(2)XML配置方式
- spring aop的使用(注解方式以及基于xml配置方式)
- 使用Spring的配置xml方式实现AOP
- spring aop的使用(注解方式以及基于xml配置方式)
- 16、(知识篇)Spring使用AOP(Annotation方式)
- Spring AOP使用Aspectj基于xml方式,初始化Bean参数
- spring aop 使用xml方式的简单总结
- 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式
- Spring中AOP使用——配置xml方式
- [5] Spring中的AOP操作(使用xml 配置文件的方式)
- spring aop的使用(注解方式以及基于xml配置方式)
- aop(使用xml方式)(spring团队建议我们使用注解的方式)
- Spring系列之 (九):AOP实现方式(一):使用AspectJ的xml方式
- spring 学习笔记 使用pojo+xml的方式开发aop
- Spring AOP之AspectJ的XML方式使用
- Spring3.0 入门进阶(3):基于XML方式的AOP使用
- spring AOP (使用AspectJ的xml方式 的aop实现) (7)
- Spring中启用AOP时要使用ApplicationContext而不要使用XmlBeanFactory
- Spring之AOP XML方式
- spring aop xml方式的配置案例 以及 annotation方式的配置aop