spring aop advisor中的<aop:advisor>和<aop:aspect>有什么区别

spring中AOP代理的几种方式 - 丝绸之路 - ITeye博客
博客分类:
部分例子摘自 spring in action
(1)使用ProxyFactoryBean的代理
package chapter4;
public interface Performable {
public void perform() throws E
package chapter4;
import java.util.R
public class Artist implements Performable {
public void perform() throws Exception {
int num = new Random().nextInt(100);
if(num &= 50) {
throw new Exception(String.valueOf(num));
System.out.println(num);
package chapter4;
public class Audience {
public Audience() {
public void takeSeats() {
System.out.println("The audience is taking their seats.");
public void turnOffCellPhones() {
System.out.println("The audience is turning off " + "their cellphones");
public void applaud() {
System.out.println("CLAP CLAP CLAP CLAP CLAP");
public void demandRefund() {
System.out.println("Boo! We want our money back!");
package chapter4;
import java.lang.reflect.M
import org.springframework.aop.AfterReturningA
import org.springframework.aop.MethodBeforeA
import org.springframework.aop.ThrowsA
public class AudienceAdvice
implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {
public void setAudience(Audience audience) {
this.audience =
public void before(Method method, Object[] args, Object target)
throws Throwable {
audience.takeSeats();
audience.turnOffCellPhones();
public void afterReturning(Object returnValue, Method method, Object[] args,
Object target) throws Throwable {
audience.applaud();
public void afterThrowing(Exception ex) {
audience.demandRefund();
&?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&
&bean id="audience" class="chapter4.Audience" /&
&bean id="audienceAdvice" class="chapter4.AudienceAdvice" &
&property name="audience" ref="audience" /&
&bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"&
&property name="advice" ref="audienceAdvice" /&
&property name="expression" value="execution(* *.perform(..))" /&
&bean id="artistTarget" class="chapter4.Artist" /&
&bean id="artist" class="org.springframework.aop.framework.ProxyFactoryBean" &
&property name="target" ref="artistTarget" /&
&property name="interceptorNames" value="audienceAdvisor" /&
&property name="proxyInterfaces" value="chapter4.Performable" /&
(2)隐式使用ProxyFactoryBean的aop代理
DefaultAdvisorAutoProxyCreator实现了BeanPostProcessor,它将自动检查advisor的pointcut是否匹配bean的方法,如果匹配会替换bean为一个proxy,并且应用其advice。
&?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&
&bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /&
&bean id="audience" class="chapter4.Audience" /&
&bean id="audienceAdvice" class="chapter4.AudienceAdvice" &
&property name="audience" ref="audience" /&
&bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"&
&property name="advice" ref="audienceAdvice" /&
&property name="expression" value="execution(* *.perform(..))" /&
&bean id="artist" class="chapter4.Artist" /&
(3)使用注解的aop代理
xml中增加了一个&aop:aspectj-autoproxy /&,它创建了AnnotationAwareAspectJAutoProxyCreator在spring中,这个类将自动代理匹配的类的放方法。和上个例子中DefaultAdvisorAutoProxyCreator做同样的工作。
package chapter4;
import org.aspectj.lang.annotation.AfterR
import org.aspectj.lang.annotation.AfterT
import org.aspectj.lang.annotation.A
import org.aspectj.lang.annotation.B
import org.aspectj.lang.annotation.P
public class Audience {
public Audience() {
@Pointcut("execution(* *.perform(..))")
public void pointcut(){}
@Before("pointcut()")
public void takeSeats() {
System.out.println("The audience is taking their seats.");
@Before("pointcut()")
public void turnOffCellPhones() {
System.out.println("The audience is turning off " + "their cellphones");
@AfterReturning("pointcut()")
public void applaud() {
System.out.println("CLAP CLAP CLAP CLAP CLAP");
@AfterThrowing("pointcut()")
public void demandRefund() {
System.out.println("Boo! We want our money back!");
&?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&
&aop:aspectj-autoproxy /&
&bean id="audience" class="chapter4.Audience" /&
&bean id="artist" class="chapter4.Artist" /&
(4)使用aop配置文件的自动代理
采用这种方法,不用加&aop:aspectj-autoproxy /&
package chapter4;
import org.aspectj.lang.annotation.A
public class Audience {
public Audience() {
public void pointcut() {
public void takeSeats() {
System.out.println("The audience is taking their seats.");
public void turnOffCellPhones() {
System.out.println("The audience is turning off " + "their cellphones");
public void applaud() {
System.out.println("CLAP CLAP CLAP CLAP CLAP");
public void demandRefund() {
System.out.println("Boo! We want our money back!");
&?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&
&bean id="audience" class="chapter4.Audience" /&
&aop:config&
&aop:aspect ref="audience"&
&aop:before method="takeSeats" pointcut="execution(* *.perform(..))" /&
&aop:before method="turnOffCellPhones" pointcut="execution(* *.perform(..))" /&
&aop:after-returning method="applaud" pointcut="execution(* *.perform(..))" /&
&aop:after-throwing method="demandRefund" pointcut="execution(* *.perform(..))" /&
&/aop:aspect&
&/aop:config&
&bean id="artist" class="chapter4.Artist" /&
浏览: 124620 次
来自: 彩虹之巅
[url][img][url][url][img][url][ ...
[img][/img]
[img]||[/img][img][/img][url][u ...
[img][/img][img][/img][url][url ...spring tx:advice 和 aop:config 配置事务 - 寂寞的时光 - ITeye博客
博客分类:
"http://www.springframework.org/schema/beans"
"http://www.w3.org/2001/XMLSchema-instance"
"http://www.springframework.org/schema/
"http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop
"transactionManager"
"org.springframework.orm.hibernate3.HibernateTransactionManager"
dependency-check
"sessionFactory"
"sessionFactory"
"txAdvice"
transaction-manager
"transactionManager"
tx:attributes
propagation
"REQUIRED"
propagation
"REQUIRED"
propagation
"REQUIRED"
propagation
"REQUIRED"
&!-- &tx:method name="*" propagation="true" /&--&
tx:attributes
"allManagerMethod"
expression_r
"execution(* com.service.*.*(..))"
advice-ref
"txAdvice"
pointcut-ref
"allManagerMethod"
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
="http://www.springframework.org/schema/aop
xmlns:tx="http://www.springframework.org/schema/tx"
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/tx
http://www.springframework.org/schema/tx/spring
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop
&bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
abstract="false" lazy-init="default"
dependency-check="default"&
&property name="sessionFactory"&
&ref bean="sessionFactory" /&
&/property&
&tx:advice id="txAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="add*" propagation="REQUIRED" /&
&tx:method name="delete*" propagation="REQUIRED" /&
&tx:method name="update*" propagation="REQUIRED" /&
&tx:method name="add*" propagation="REQUIRED" /&
&!-- &tx:method name="*" propagation="true" /&--&
&/tx:attributes&
&/tx:advice&
:pointcut id="allManagerMethod"
expression_r="execution(* com.service.*.*(..))" /&
:advisor advice-ref="txAdvice"
pointcut-ref="allManagerMethod" /&
Eclipse不能识别&tx:advice/&标签
在开发Spring
的过程中,有时会出现Eclipse不能识别&tx:advice/&标签。
提示出现以下错误:
The prefix "tx" for element "tx:advice" is not bound
这个错误的原因很简单是:
我们在定义申明AOP
的时候。。没有加载schema。
具体表现如下:
"txAdvice"
transaction-manager
"transactionManager"
tx:attributes
propagation
"REQUIRES_NEW"
rollback-for
"Exception"
tx:attributes
代理设置--&
proxy-target-class
&tx:advice id="txAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="get*" read-only="true"/&
&tx:method name="*" propagation="REQUIRES_NEW" rollback-for="Exception"/&
&/tx:attributes&
&/tx:advice&
代理设置--&
:config proxy-target-class="true"&
这时会抛出异常不认&TX&标签。。起先还以为是没有加载JAR包呢。。
文档才发现&beans&中要加入“xmlns:aop
”的命名申明,并在“xsi:schemaLocation”中指定aop
配置的schema的地址
配置文件如下:
"http://www.springframework.org/schema/beans "
"http://www.w3.org/2001/XMLSchema-instance "
"http://www.springframework.org/schema/
"http://www.springframework.org/schema/tx "
xsi:schemaLocation
="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring
-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
="http://www.springframework.org/schema/aop
xmlns:tx="http://www.springframework.org/schema/tx "
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring
-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop
这些才是最关键的地方。。后面的配置不变。。。。Spring
&tx:advice&和
用来配置事务,具体如何配置你可以参考Spring
我解释一下(* com.evan.crm.service.*.*(..))中几个通配符的含义:
|第一个 * —— 通配 任意返回值类型|
|第二个 * —— 通配 包com.evan.crm.service下的任意class|
|第三个 * —— 通配 包com.evan.crm.service下的任意class的任意方法|
|第四个 .. —— 通配 方法可以有0个或多个参数|
综上:包com.evan.crm.service下的任意class的具有任意返回值类型、任意数目参数和任意名称的方法
&tx:advice/& 有关的设置
这一节里将描述通过 &tx:advice/&
标签来指定不同的事务性设置。默认的 &tx:advice/&
设置如下:
事务传播设置是 REQUIRED
隔离级别是 DEFAULT
事务是 读/写
事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
这些默认的设置当然也是可以被改变的。 &tx:advice/& 和
&tx:attributes/& 标签里的
&tx:method/& 各种属性设置总结如下:
表 9.1. &tx:method/& 有关的设置
是否需要?
与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。
如:'get*'、'handle*'、'on*Event'等等。
propagation
事务传播行为
事务隔离级别
事务超时的时间(以秒为单位)
事务是否只读?
rollback-for
将被触发进行回滚的 Exception(s);以逗号分开。
如:'com.foo.MyBusinessException,ServletException'
no-rollback-for
不 被触发进行回滚的 Exception(s);以逗号分开。
如:'com.foo.MyBusinessException
浏览 12427
浏览: 186862 次
来自: 杭州
softor 写道这是我格式化的代码:
&div id= ...
这是我格式化的代码:
&div id=&div ...
你第一段实例里有连个事件监听,你说的“如果userCaptur ...
非常需要,谢谢博主。
昨晚搞了一晚上,很郁闷,也是这个问题在spring的配置中,会用到这两个标签.那么他们的区别是什么呢?
& & &bean&id=&testAdvice&&class=&com.myspring.app.aop.MyAdvice&/&&//切面代码
& & 使用&aop:aspect&配置时,
& & 如果切面代码是自动注入的bean,那么&aop:aspect&的ref属性直接写bean的注入名字就可以了!
&&&&&aop:config&
&&&&&&&&&aop:aspect&ref=&testAdvice&&id=&testAspect&&
&&&&&&&&&&&&&aop:pointcut&expression=&(execution(*&com.myspring.app.aop.TestPoint.*(..)))&&id=&testPointcut&/&
&&&&&&&&&&&&&aop:before&&method=&doBefore&&pointcut-ref=&testPointcut&/&
&&&&&&&&&/aop:aspect&
&&&&&/aop:config&
&&&&&aop:config&
&&&&&&&&&aop:pointcut&expression=&(execution(*&com.myspring.app.aop.TestPoint.*(..)))&&&id=&mypoint&/&
&&&&&&&&&aop:advisor&advice-ref=&testAdvice&&pointcut-ref=&mypoint&/&
&&&&&/aop:config&
注意:2种格式的书写次序.
=========================================================================
package&com.myspring.app.
import&java.lang.reflect.M
import&org.aspectj.lang.JoinP
import&org.springframework.aop.MethodBeforeA
&*&方法前置通知
&*&@author&Michael
@Component(&myAdvice&)//如果是自动装配,在定义切面的时候直接写在ref属性里就可以了
public&class&MyAdvice&implements&MethodBeforeAdvice{
& & //如果使用aop:advisor配置,那么切面逻辑必须要实现advice接口才行!否则会失败!
&&&&@Override
&&&&public&void&before(Method&method,&Object[]&args,&Object&target)&throws&Throwable&{
&&&&&&&&System.out.println(&前置通知&);
& & //如果是&aop:aspect&配置,编写一般的方法就可以了,然后在切面配置中指定具体的方法名称!
&&&&public&void&doBefore(JoinPoint&point)&throws&Throwable&{
本文已收录于以下专栏:
相关文章推荐
转自:/blog/1812555
Spring使用的AOP注解分为三个层次:
前提条件是在xml中放开了
1、@Aspect放在类头上...
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入...
程序员升职加薪指南!还缺一个“证”!
CSDN出品策划程序员9月规划,专为码农的升职加薪保驾护航,程序员的捷径,你get到了吗?听说阅读了这篇文章的人,都已实现了小梦想~快来揭秘!
动态代理我们在日常开发过程中是否会遇到下图中的这种状况
红框中的是我们要输出的日志,你是否发现,日志中大部分信息都是相同的,并且如果我们要修改一个地方,所有的地方都需要改,而且代码看起来还比较冗...
使用@Aspect注解实现前置、返回、异常、后置、环绕通知;
回家上网不方便,回头补上!祝大家过年好!
在开发过程中,不少有Spring Aop的使用,大多数情况下我们用的是,只有在进行事务管理时才用到。但是,一直没弄清楚与的区别。
最近刚刚好在看spring in action 第四版,针对aop这一章节做练习测试,但遇到了一个问题,头一天晚上始终没能解决,第二天早上&灵光一现&,改动一下做了测试,就通过了,也正如我所想,我还是...
@AspectJ的详细用法
在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示符如下:一些常见的切入点的例子
execution(publi...
前面几节的示例看起来让人沮丧,要记忆这么多的接口、类和继承关系,还要做各种复杂的配置。好在这些只是一种相对过时的实现方式,现在只需要使用@Aspect注解及表达式就可以轻松的使用POJO来定义切面,设...
Pointcut 是指那些方法需要被执行&AOP&,是由&Pointcut Expression&来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合.
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)用户名:randy_shandong
文章数:242
评论数:70
访问量:217326
注册日期:
阅读量:1297
阅读量:3317
阅读量:451282
阅读量:1135951
51CTO推荐博文
作为【死磕Spring AOP】系列的第一篇, 这个系列是AOP源码分析级别的文章。由于现在AOP已经不是什么高深的技术,网上的例子也比比皆是,不论是xml schema,还是annotation声明式。相信用过Spring的朋友,都可以信手拈来。本系列文章的原则如何配置AOP不是重点AOP相关概念讲解不是重点AOP 底层代码设计才是重点本篇的主要内容认识ProxyFactory,并通过该工厂类,将“日志”和“安全校验”代码切入到业务逻辑中分析代理对象的实现流程。认识ProxyFactory相关对象1.使用ProxyFactory,实现"AOP"效果/**
&*模拟业务接口
public&interface&UserService&{
&&&&public&void&updateUser();
&*模拟具体业务
public&class&UserServiceImpl&implements&UserService{
&&&&@Override
&&&&public&void&updateUser()&{
&&&&&&&&System.out.println("$$$$$$执行业务逻辑$$$$$");
&*&模拟切面1
public&class&SecurityInterceptor&implements&MethodInterceptor&{
&&&&@Override
&&&&public&Object&invoke(MethodInvocation&methodInvocation)&throws&Throwable&{
&&&&&&&&System.out.println("==========执行安全校验====================");
&&&&&&&&return&methodInvocation.proceed();
&*&模拟切面2
public&class&LoggerBeforeAdvice&implements&MethodBeforeAdvice&{
&&&&@Override
&&&&public&void&before(Method&method,&Object[]&args,&Object&target)&throws&Throwable&{
&&&&&&&&System.out.println("=======保存更新日志=========");
}Main类public&static&void&main(String[]&args)&{
&&&&//1.初始化源对象(一定要实现接口)
&&&&UserService&target&=new&UserServiceImpl();
&&&&//2.AOP&代理工厂
&&&&ProxyFactory&pf&=&new&ProxyFactory(target);
&&&&//3.装配Advice
&&&&pf.addAdvice(new&SecurityInterceptor());
&&&&//pf.addAdvice(new&LoggerBeforeAdvice());
&&&&pf.addAdvisor(new&DefaultPointcutAdvisor(new&LoggerBeforeAdvice()));
&&&&////4.获取代理对象
&&&&UserService&proxy&=(UserService)pf.getProxy();
&&&&//5.调用业务
&&&&proxy.updateUser();
}输出结果==========执行安全校验===========================保存更新日志=========$$$$$$执行业务逻辑$$$$$通过结果确认,通过编程的方式实现了AOP切入的效果。逻辑很简单,无需过多解释。把重点放到ProxyFactory对象上。下面,重点分析下ProxyFactory。2.分析ProxyFactoryProxyFactory继承了ProxyCreatorSupport类,持有了AopProxyFactory,AdvisorChainFactory,List&Advisor&。等类作用AopProxyFactory基于&AdvisedSupport 配置信息,生成AOP 代理对象.默认为“DefaultAopProxyFactory”AdvisorChainFactoryadvisor链。默认实现为DefaultAdvisorChainFactory,只有一个方法,获取Advised满足条件的MethodInterceptor列表或DynamicInterceptionAdvice列表Advisor持有AOP advice和filterProxyConfig生成代理对象的配置元信息3.AOP重点接口大杂烩3.1Advice&InterceptorInterceptor&VS&AdviceAdvice是AOP编程中某一个方面(Aspect)在某个连接点(JoinPoint)所执行的特定动作,这个连接点(JoinPoint)可以是自 定义的;而Spring中的Interceptor更多关注程序运行时某些特定连接点(属性访问,对象构造,方法调用)时的动作。确切的 说,Interceptor的范围更窄一些。3.2 PointCut&Advisor概念列表TermsDescriptionAspectA module which has a set of APIs providing cross-cutting requirements.
For example, a logging module would be called AOP aspect for logging. An
application can have any number of aspects depending on the
requirement.Join pointThis represents a point in your application where you can plug-in AOP
aspect. You can also say, it is the actual place in the application
where an action will be taken using Spring AOP framework.AdviceThis is the actual action to be taken either before or after the method
execution. This is actual piece of code that is invoked during program
execution by Spring AOP framework.PointcutThis is a set of one or more joinpoints where an advice should be
executed. You can specify pointcuts using expressions or patterns as we
will see in our AOP examples.IntroductionAn introduction allows you to add new methods or attributes to existing classes.Target objectThe object being advised by one or more aspects, this object will always
be a proxied object. Also referred to as the advised object.WeavingWeaving is the process of linking aspects with other application types
or objects to create an advised object. This can be done at compile
time, load time, or at runtime.3.4Proxy&ProxyFactory4. ProxyFactory底层实现设计弄清楚ProxyFactory的底层实现,也就基本上弄清了AOP的实现原理,不管使用XML Schema还是Annotation方式,归根结底核心就在这儿。主要差别,仅仅是使用PointCut差别而已。Advisor是设计的核心元素,起到承上启下的作用,连接着Advice和Pointcut。默认实现是:DefaultPointCutAdvisor。需要知道2个接口ClassFilter,MethodMatcher,通过方法名,就可以判定他们的作用了,主要用在"匹配"上。序列图通过该序列图,可以清楚了解,代理的调用过程。整个过程就是围绕一个核心,构造匹配元素+反射调用。如果想搞清楚底层代理调用实现,可以看org.springframework.aop.framework .ReflectiveMethodInvocation。接下来,将分析Spring Bean工厂是如何生成代理Bean的,以DefaultAdvisorAutoProxyCreator类为例,进行分析。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 aop advisor干什么的 的文章

 

随机推荐