zoukankan      html  css  js  c++  java
  • 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 有不对的地方欢迎指正 谢谢

  • 相关阅读:
    BZOJ 1101: [POI2007]Zap [莫比乌斯反演]
    磁盘I/O高居不下,通过什么来查看占用I/O的进程?
    jmeter中特殊的时间处理方式
    Fiddler抓包工具版面认识(一)
    Jmeter 时间函数工具汇总
    Jmeter之__CSVRead随机读取变量
    jmeter配置元件之计数器
    Jmeter全局变量设置
    数据驱动和关键字驱动
    sqlmap工具命令行的含义
  • 原文地址:https://www.cnblogs.com/ff111/p/8710504.html
Copyright © 2011-2022 走看看