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