循序渐进之Spring AOP(4) - Introduction
2024-08-26 03:01:53
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法。
在spring中可以通过扩展DelegatingIntroductionInterceptor类来实现引介增强类。
下面通过这种方式给一辆普通汽车加上无人驾驶功能
接口Auto
- public interface Auto {
- void driving();
- }
实现类
- public class MyCar implements Auto {
- @Override
- public void driving() {
- System.out.println("开车了");
- }
- }
新建一个接口Intelligent,它具有一个自动驾驶的方法,我们将把这个方法"添加"到MyCar上
- public interface Intelligent {
- void selfDriving();
- }
实现类IntelligentCar,注意,继承了DelegatingIntroductionInterceptor类
- public class IntelligentCar extends DelegatingIntroductionInterceptor implements Intelligent {
- @Override
- public void selfDriving() {
- System.out.println("开启无人驾驶了, 别挡路");
- }
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Object obj = super.invoke(invocation);
- return obj;
- }
- }
applicationContext.xml
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
- <bean id="carTarget" class="demo.aop.MyCar" />
- <bean id="introduceAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">
- <constructor-arg>
- <bean class="demo.aop.IntelligentCar" />
- </constructor-arg>
- </bean>
- <bean id="myCar" class="org.springframework.aop.framework.ProxyFactoryBean"
- p:target-ref="carTarget"
- p:interceptorNames="introduceAdvisor"
- p:proxyTargetClass="true" />
- </beans>
测试代码
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- Auto car = (Auto)context.getBean("myCar");
- car.driving();
- Intelligent intelligentCar = (Intelligent)car;
- intelligentCar.selfDriving();
- }
运行结果
- 开车了
- 开启无人驾驶了, 别挡路
最新文章
- dfs判断连通图(无向)
- download github files
- Base64正反编码
- Android Handler机制(三)----Looper源码解析
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Myeclipse中相同变量高亮显示
- Oracle GoldenGate配置异构数据库数据传输(oracle到sqlserer)的dml操作(带pump进程)
- JavaScript当页面关闭时向后台发送请求
- 重拾java中的 i++ 和 ++i
- 6.1、Android Studio的Android Monitor概览
- Python内置函数(26)——globals
- 『Python CoolBook』数据结构和算法_多变量赋值&;“*”的两种用法
- python - json/pickle
- js将字符串转json
- 【Amazon 必考】Amazon Leadership Principles 亚马逊领导力准则
- 【动态规划】数字分组I
- IOS微信后台运行时候倒计时暂停问题
- c#学习路线及目录导航
- ASP.NET#JavaScript中调用WebServer注意的问题
- Eclipse中使用Maven,报错&ldquo;$MAVEN_HOME&rdquo;