1 解析
1.1 aop:declare-parents 标签简介
1.2 标签使用样式
2 代码演练
2.1 introductions标签应用
1 解析
1.1 aop:declare-parents 标签简介
允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象
不同于aop:before等其他标签,元素声明该元素用于声明所匹配的类型拥有一个新的parent(父类)。所以测试类getBean后可以强转
1.2 标签使用样式
<aop:declare-parents types-matching=" com.imooc.aop.schema.advice.biz.*(..))" <!--包--> implement-interface="com.imooc.aop.schema.advice.Fit" <!--接口--> default-impl="com.imooc.aop.schema.advice.FitImpl" <!-- 实现类--> />
2 代码演练
2.1 introductions标签应用
实体类:
package com.imooc.aop.schema.advice.biz; public class AspectBiz { public void biz(){ System.out.println("MoocAspect biz"); // throw new RuntimeException(); } public void init(String bizName,int times){ System.out.println("AspectBiz init:"+ bizName + " "+times); } }
测试类:
package com.imooc.test.aop; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.aop.schema.advice.Fit; import com.imooc.aop.schema.advice.biz.AspectBiz; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestAOPSchemaAdvice extends UnitTestBase { public TestAOPSchemaAdvice(){ super("classpath:spring-aop-schema-advice.xml"); } @Test public void testBiz(){ AspectBiz aBiz = super.getbean("AspectBiz"); aBiz.biz(); } @Test public void testInit(){ AspectBiz aBiz = super.getbean("AspectBiz"); aBiz.init("moocService",3); } @Test /** * 配合spring-aop-schema-advice.xml 使用,调的是接口类,但是实际使用的是实现类 */ public void testFit(){ Fit fit = (Fit)super.getbean("AspectBiz"); fit.filter(); } }
配置文件:
<?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" 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-4.0.xsd"> <bean id = "moocAspect" class = "com.imooc.aop.schema.advice.MoocAspect"></bean> <bean id = "AspectBiz" class = "com.imooc.aop.schema.advice.biz.AspectBiz"></bean> <aop:config> <aop:aspect id="moocAspectAOP" ref="moocAspect"> <!-- 声明切入点:从哪里开始执行 --> <!-- 执行com.imooc.aop.schema.advice.biz包下的所有Biz结尾的java类中的所有方法时 --> <!-- <aop:pointcut expression="execution(* com.imooc.aop.schema.advice.biz.*Biz.*(..))" id="moocPointCut"/> --> <!-- <aop:before method="before" pointcut-ref="moocPointCut"/> --> <!-- <aop:after-returning method="afterreturning" pointcut-ref="moocPointCut"/> --> <!-- <aop:after-throwing method="throwing" pointcut-ref="moocPointCut"/> --> <!-- <aop:after method="after" pointcut-ref="moocPointCut"/> --> <!-- <aop:around method="around" pointcut-ref="moocPointCut"/> --> <!-- <aop:around method="aroundInit" pointcut="execution(* com.imooc.aop.schema.advice.biz.AspectBiz.init(String,int)) and args(bizName,times)"/> --> <!-- type-matching 要匹配的是这个包下的所有方法,(后便注释是我自己解释的,看不懂可以不看,报错了可以仔细想一下)
注意:type-matching 一定要匹配这个包下的所有类(包含我要执行的接口,实现类,以及super.getBean到的类) -->
<aop:declare-parents types-matching=" com.imooc.aop.schema.advice.biz.*(..))"
implement-interface="com.imooc.aop.schema.advice.Fit"
default-impl="com.imooc.aop.schema.advice.FitImpl"/>
</aop:aspect> </aop:config> </beans>
接口:
package com.imooc.aop.schema.advice; public interface Fit { void filter(); }
实现类:
package com.imooc.aop.schema.advice; public class FitImpl implements Fit { @Override public void filter() { System.out.println("FitImpl 执行中"); } }
打印日志:
四月 20, 2019 9:50:09 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6e1d4150: startup date [Sat Apr 20 09:50:09 CST 2019]; root of context hierarchy 四月 20, 2019 9:50:09 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [spring-aop-schema-advice.xml] FitImpl 执行中 四月 20, 2019 9:50:09 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6e1d4150: startup date [Sat Apr 20 09:50:09 CST 2019]; root of context hierarchy
诸葛