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

原文地址:https://www.cnblogs.com/ff111/p/8710504.html