已知前提:JDK的动态代理要求被代理对象必须实现某接口,产生的代理对象才可强转为该接口类型,然后执行接口中声明的方法。
Spring AOP利用了JDK的动态代理,也就是说spring管理的bean想要配置AOP的话,bean的类必须实现某接口,这样才能对该bean进行AOP配置。
但是经测试,发现bean的类不实现和继承任何接口类,配置了AOP后,一切都能正常执行,代码如下所示
/**
* 被代理对象class(注意:没有实现、继承任何接口、类)
*/
public class Subject {
/**
* AOP中的切点
*/
public void test() {
System.out.println("==test==");
}
}
/**
* AOP中的切面类
*/
public class Aspect {
public void before() {
System.out.println("Aspect before!");
}
public void after() {
System.out.println("Aspect after");
}
}
Spring配置文件中配置:
<!-- 被代理对象subject -->
<bean id="subject" class="com.junit.proxy.Subject"></bean>
<!-- 切面bean -->
<bean id="aspect" class="com.junit.proxy.Aspect"></bean>
<!-- AOP配置 -->
<aop:config>
<aop:pointcut expression="execution(* com.junit.proxy.Subject.test())" id="test" />
<aop:aspect ref="aspect">
<aop:before method="before" pointcut-ref="test"/>
<aop:after method="after" pointcut-ref="test"/>
</aop:aspect>
</aop:config>
Junit测试代码:
/**
* Junit测试Spring AOP
*/
public class Test4AOP extends BaseJunit4Web {
@Test
public void testAOP() throws Exception {
Subject subject = (Subject) applicationContext.getBean("subject");
System.out.println("开始执行bean的test()方法。。。");
subject.test();
System.out.println("结束执行bean的test()方法。。。");
}
}
控制台输出结果:
开始执行bean的test()方法。。。
Aspect before!
==test==
Aspect after
结束执行bean的test()方法。。。
==================================================
以上为测试内容,求解:为什么Subject类没有实现任何接口,依然可以为其配置AOP?不是说AOP也是利用了JDK的动态代理吗?
Spring AOP利用了JDK的动态代理,也就是说spring管理的bean想要配置AOP的话,bean的类必须实现某接口,这样才能对该bean进行AOP配置。
但是经测试,发现bean的类不实现和继承任何接口类,配置了AOP后,一切都能正常执行,代码如下所示
/**
* 被代理对象class(注意:没有实现、继承任何接口、类)
*/
public class Subject {
/**
* AOP中的切点
*/
public void test() {
System.out.println("==test==");
}
}
/**
* AOP中的切面类
*/
public class Aspect {
public void before() {
System.out.println("Aspect before!");
}
public void after() {
System.out.println("Aspect after");
}
}
Spring配置文件中配置:
<!-- 被代理对象subject -->
<bean id="subject" class="com.junit.proxy.Subject"></bean>
<!-- 切面bean -->
<bean id="aspect" class="com.junit.proxy.Aspect"></bean>
<!-- AOP配置 -->
<aop:config>
<aop:pointcut expression="execution(* com.junit.proxy.Subject.test())" id="test" />
<aop:aspect ref="aspect">
<aop:before method="before" pointcut-ref="test"/>
<aop:after method="after" pointcut-ref="test"/>
</aop:aspect>
</aop:config>
Junit测试代码:
/**
* Junit测试Spring AOP
*/
public class Test4AOP extends BaseJunit4Web {
@Test
public void testAOP() throws Exception {
Subject subject = (Subject) applicationContext.getBean("subject");
System.out.println("开始执行bean的test()方法。。。");
subject.test();
System.out.println("结束执行bean的test()方法。。。");
}
}
控制台输出结果:
开始执行bean的test()方法。。。
Aspect before!
==test==
Aspect after
结束执行bean的test()方法。。。
==================================================
以上为测试内容,求解:为什么Subject类没有实现任何接口,依然可以为其配置AOP?不是说AOP也是利用了JDK的动态代理吗?