@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 有不对的地方欢迎指正 谢谢