博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring @DeclareParents 的扩展应用实例
阅读量:4938 次
发布时间:2019-06-11

本文共 2491 字,大约阅读时间需要 8 分钟。

@DeclareParents

这个标签为增强引用,网上找了好多例子写是会写但是没有领悟到其中实际应用,通过自己摸索发现了一个比较实用的用法,现在分享出来,供大家学习参考,我所有Spring配置都采用java配置请大家借鉴

想了解基本应用参考传送门(https://blog.csdn.net/u010502101/article/details/76944753)

 

下面我就贴出我的设计方式

兔子接口

public interface Rabbit {    public void say(String msg);    public void setName(String name);    public String getName();}

  

兔子接口实现

@Componentpublic class RabbitImpl implements Rabbit{    private String  name;    public void say(String msg)    {        System.out.println(getName()+" 说 "+msg);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

  

红兔子接口

public interface RedRabbit extends Rabbit {    public void jump();}

  

红兔子接口实现

public class RedRabbitImpl extends RabbitImpl implements RedRabbit {    public void jump()    {        System.out.println(getName()+" 跳一跳");    }    @Override    public void say(String msg) {        super.say(msg);    }    @Override    public void setName(String name) {        super.setName(name);    }    @Override    public String getName() {        return super.getName();    }}

  

JAVA代码方式配置Spring

/** * spring配置类 * 类似xml的加载 * * @ContextConfiguration(classes = SpringConfig.class) 再使用类上这样加载 */@Configuration//标识是一个配置类@EnableAspectJAutoProxy//启用注解@ComponentScan(basePackages = {"com.cn.aop","com.cn.bean", "com.cn.impl"})public class SpringConfig {        @Bean(name="rabbitExAop")    public RabbitExAop rabbitExAop() {        return  new RabbitExAop();    }}

  

增强引入配置

/** *  增强引入 */@Aspectpublic class RabbitExAop {    @DeclareParents(value = "com.cn.impl.RabbitImpl+", defaultImpl = RedRabbitImpl.class)    public RedRabbit redRabbit;}

  

调用代码

/** * 利用spring自动装载方式 */@ContextConfiguration(classes = SpringConfig.class)public class MainAutoUtil extends SpringTestBase {    @Autowired    private Rabbit rabbit;    @Test    public void test() {        rabbit.setName("小黄");        rabbit.say("我很一个沮丧的小兔子");        RedRabbit redRabbit=(RedRabbit)rabbit;        redRabbit.say("我很一个快乐的小兔子");        redRabbit.jump();    }

 

执行结果

小黄 说 我很一个沮丧的小兔子小黄 说 我很一个快乐的小兔子小黄 跳一跳

 

附带贴上我srping test 配置

/** * 单元测试配置类 */@RunWith(SpringJUnit4ClassRunner.class)public class SpringTestBase extends AbstractJUnit4SpringContextTests {}

  

以上就是我的代码

如果兔子接口和实现类是其他系统封装的一个jar包,你没有办法获得其源码,只能通过继承来获得对象.

在实际应用过程中你想动态增强引用其他系统的对象,比如红兔子,红兔子是增强版的兔子,他拥有增强兔子没有的扩展方法jump方法,这样你获得兔子实例的时候就可以强转成红兔子实例,从而让兔子实例拥有增强引用方法jump,方便后续开发.

从而实现子类可以指向父类对象

本人初学srping 有不对的地方欢迎指正 谢谢

 

转载于:https://www.cnblogs.com/ff111/p/8710504.html

你可能感兴趣的文章
LINUX中搭建DNS服务器,实现正向、反向以及访问不同DNS解析
查看>>
SCCM2012 R2实战系列之十:解决WDS服务无法启动问题(错误1067:进程意外终止)...
查看>>
ubuntu 下安装 mysql
查看>>
关于k-means聚类算法的matlab实现
查看>>
Git分支2
查看>>
一键安装Gitlab后的备份、迁移与恢复
查看>>
因为本人工作繁忙,精力有限,本博客停止更新。有兴趣的博友可以关注我在CSDN上的主博客...
查看>>
SQL server查看触发器是否被禁用
查看>>
[C++基础]在构造函数内部调用构造函数
查看>>
跟随我在oracle学习php(8)
查看>>
Spring 3.1.0 Hibernate 3.0 Eclipse Spring WEB例子
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
求两个集合的交集,并集,差集
查看>>
Kotlin的语法糖(一)基础篇
查看>>
OkHttp源码分析
查看>>
让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
查看>>
windows kernel exploitation基础教程
查看>>
NS_OPTIONS枚举的用法
查看>>
java9系列(九)Make G1 the Default Garbage Collector
查看>>
QAQ高精度模板笔记√
查看>>