转-springAOP基于XML配置文件方式
springAOP基于XML配置文件方式
<aop:config.../>包含:poincut,advisor,aspect元素,通过XML配置。
springAOP的具体加载步骤:
1、当spring容器启动的时候,加载了spring的配置文件
2、为配置文件中所有的bean创建对象
3、spring容器会解析aop:config的配置
1、解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配
如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+通知
如果匹配不成功,不会创建代理对象
4、在客户端利用context.getBean获取对象时,如果该对象有代理对象则返回代理对象,如果代理对象,则返回目标对象
说明:如果目标类没有实现接口,则spring容器会采用cglib的方式产生代理对象,如果实现了接口,会采用jdk的方式
MyAspect.java
package net.csdn.www.aop; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order; public class MyAspect { public void authority(JoinPoint jp) {
System.out.println("被代理方法名字:"+jp.getSignature().getName());
System.out.println("被代理方法参数:"+jp.getArgs());
System.out.println("被代理对象:"+jp.getTarget());
System.out.println("现在调用的是权限验证"); } public void log(JoinPoint jp,Object rvt){
System.out.println("被代理方法名字:"+jp.getSignature().getName());
System.out.println("被代理方法参数:"+jp.getArgs());
System.out.println("被代理对象:"+jp.getTarget());
System.out.println("被代理对象的返回值"+rvt);
System.out.println("现在调用的是日志管理");
} public Object processTx(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("现在调用的是事务开启");
//得到业务方法的参数
Object[] args=pjp.getArgs();
System.out.println("业务方法的参数:"+args);
//被代理对象的业务方法
Object result=pjp.proceed(args);
System.out.println("现在调用的是事务提交或回滚");
return result;
} public void release(){
System.out.println("资源已经被释放!");
}
}
UserDao.java
package net.csdn.www.dao; import java.util.Date; import org.springframework.stereotype.Component; @Component
public class UserDao {
public String save(String name){
System.out.println(name+"被保存");
return "success";
}
}
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-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 切面 -->
<bean id="myAspect" class="net.csdn.www.aop.MyAspect"></bean>
<bean id="userDao" class="net.csdn.www.dao.UserDao"></bean> <!-- 切入点 -->
<aop:config>
<aop:aspect id="asp1" ref="myAspect">
<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after-returning method="log"
pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
</aop:aspect>
</aop:config>
</beans>
测试类Test.java
package net.csdn.www.text; import java.util.Date; import net.csdn.www.dao.UserDao; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao) context.getBean("userDao");
userDao.save("csdnccccccc");
}
}
在UserDao类中声明一个带参数的方法
public String eat(Date date,String food){
System.out.println(date+"先准备:"+food);
return "好吃";
}
MyAspect1.java
package net.csdn.www.aop; import java.util.Date; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order; public class MyAspect1 { //注意:增加参数匹配,参数位置类型要和被代理方法一致
public void access(Date date, String food,Object rvt){
System.out.println(date+"吃"+food+"-----");
System.out.println("返回值为:"+rvt);
} }
在XML文件中配置切面
<bean id="myAspect1" class="net.csdn.www.aop.MyAspect1"></bean> <!-- 切入点 -->
<aop:config>
<aop:aspect id="asp1" ref="myAspect">
<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after-returning method="log"
pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
</aop:aspect>
<aop:aspect id="asp2" ref="myAspect1" order="1">
<aop:after-returning method="access"
pointcut="execution(* net.csdn.www.dao.*.*(..)) and args(date,food)"
returning="rvt" />
</aop:aspect>
</aop:config>
调用userDao.eat(new Date(), "xiaochi");
设置切入点
<aop:pointcut expression="execution(* csdn.dao.*.*(..))" id="mypoint"/>
id 切入点的标示名
expression 切入点表达式
<aop:after method="release" pointcut-ref="mypoint"/>
把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-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 切面 -->
<bean id="myAspect" class="net.csdn.www.aop.MyAspect"></bean>
<bean id="userDao" class="net.csdn.www.dao.UserDao"></bean>
<bean id="myAspect1" class="net.csdn.www.aop.MyAspect1"></bean> <!-- 切入点 -->
<aop:config>
<aop:pointcut expression="execution(* net.csdn.www.dao.*.*(..)) and args(date,food)" id="xxx"/>
<aop:aspect ref="myAspect1"> <aop:after-returning method="access"
pointcut-ref="xxx" returning="rvt"/> </aop:aspect>
<aop:aspect id="asp1" ref="myAspect" order="2">
<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
<aop:after-returning method="log"
pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
</aop:aspect>
</aop:config>
</beans>
转-springAOP基于XML配置文件方式的更多相关文章
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...
- struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)
第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验
出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...
- 02_Spring Bean的装配模式_基于XML配置方式
一.三种实例化Bean的方式 1.使用类构造器实例化(默认无参数) <bean id="bean1" class="com.demo1.Bean1"> ...
- ssm整合(基于xml配置方式)
本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...
- Spring 基于xml配置方式的事务
参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...
- Spring 基于xml配置方式的事务(14)
参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...
随机推荐
- 第六章 第一个Linux驱动程序:统计单词个数
现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...
- cocos2d-x 3.2 创建新项目问题
cocos2d-x 3.2 执行cocos2d-x\tools\cocos2d-console\console下的cocos2d.py,输入相应的参数即可创建一个新的项目,具体参数网上介绍一大堆,就不 ...
- C# List<T>用法
C# List<T>用法 所属命名空间:using System.Collections.Generic; List<T>类是 ArrayList 类的泛型等效类. 该类使用 ...
- windows平台源码编译最新版openssl
本文有问题,待改中................. 1.从openssl官网下载最新版openssl https://www.openssl.org/source/ The latest ...
- Java Swing 第03记 布局管理器
几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...
- 移动安全初探:窃取微信聊天记录、Hacking Android with Metasploit
在这篇文章中我们将讨论如何获取安卓.苹果设备中的微信聊天记录,并演示如何利用后门通过Metasploit对安卓设备进行控制.文章比较基础.可动手性强,有设备的童鞋不妨边阅读文章边操作,希望能激发大家对 ...
- Python 小问题解决
安装第三方源包时候,我使用的是pip,但是遇到很多问题.使用的Python 3.5,安装了VS2012 因为参考的是廖雪峰的教程,首先是PIL的安装上一直出问题. 直接使用 pip install P ...
- 学习Core 本机开发调试 (环境)
安装 https://www.microsoft.com/net/download 本机开发调试 需要下载安装这3个,如果没装 windows(Server Hosting)可能会 出现502.5报 ...
- mysql 报错max_allowed_packet处理办法
首先打开mysql管理工具执行 SHOW VARIABLES LIKE '%max_allowed_packet%'; 看到如图所示的效果 max_allowed_packet 1024slav ...
- PHP时区配置
在PHP安装目录中找到 php.ini-development 复制创建新的副本 找到 :date.timezone = 修改为 date.timezone = PRC 并保存为php.ini PRC ...