Spring @DeclareParents 的扩展应用实例
@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(); }
兔子接口实现
@Component public 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(); } }
增强引入配置
/** * 增强引入 */ @Aspect public 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 有不对的地方欢迎指正 谢谢