关于spring配置文件的继承和抽象属性

抽象属性:

应用场景:如果我们把一个类加到spring容器中,但是又不想spring容器为它创建对象的话,那么使用bean中的abstract对象。比如说一些公共的类。就算创建了对象也没有用,由子类来继承
比如说:

//这是一个通用类,只是有这些方法,创建这个类的对象没有什么用
//让有实际应用场合的类来继承这个类
public class commonObject {
    public void add(){
        System.out.println("add");
    }
    public void delete(){
        System.out.println("delete");
    }
    public void update(){
        System.out.println("udpate");
    }
    public void query(){
        System.out.println("query");
    }
}

//这时候,一个学生类继承了这个类,虽然这里是空的,可是它拥有的父类的的Crud方法
public class StudentDAO extends commonObject{

}

//配置文件:
    <bean id="commonObject" class="cn.ansel.extend.commonObject"></bean>
    <bean id="studentDAO" class="cn.ansel.extend.StudentDAO"></bean>

//测试类
public class extendTest {
    /**
     * 首先我们先看看能不能得到通用类
     */
    @Test
    public void testExtend(){

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/ansel/extend/applicationContext-extend.xml");
        commonObject commonObject=(commonObject) applicationContext.getBean("commonObject");
        commonObject.add();
    }
}

运行结果毫无意外的成功了
这里写图片描述
那么要怎样设置成,让spring容器不创建这个对象呢?

在配置文件的bean中有一个属性:abstract。只要你想要哪个类不创建对象的话,将该bean的abstract设置成true即可.

//在这里我们就把通用类的abstract设置成true

<bean id="commonObject" class="cn.ansel.extend.commonObject" abstract="true"></bean>

然后再运行测试类(测试类的代码没有做任何修改):
这里写图片描述
可以看到,运行的时候报错了,原因就是和这个bean设置成了抽象类。

继承:

应用场景:我们继续那我们上面的两个例子来说,比如说我们已经在myEcplisr里面设置了studentDao继承了commonObject类,但是commonObject类里面还有一个属性,下面是修改后的commonObject的代码:


public class commonObject {
    //新属性
    private String s;

    public void add(){
        System.out.println("add");
    }
    public void delete(){
        System.out.println("delete");
    }
    public void update(){
        System.out.println("udpate");
    }
    public void query(){
        System.out.println("query");
    }
}

//studentDAO类:
public class StudentDAO extends commonObject{
    public void show(){
        //输出字符串s
        System.out.println("s="+s);
    }
}

配置文件:
    <bean id="commonObject" class="cn.ansel.extend.commonObject" abstract="true">
        <!-- 
            给属性s通过setter的方法赋值
         -->
        <property name="s" value="you can't see me"></property>
    </bean>
    <bean id="studentDAO" class="cn.ansel.extend.StudentDAO"></bean>
</beans>


测试类:

public class extendTest {

    @Test
    public void testExtend(){

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/ansel/extend/applicationContext-extend.xml");
        StudentDAO dao=(StudentDAO) applicationContext.getBean("studentDAO");
        //输出父类属性的值
        dao.show();
    }
}

运行结果:
这里写图片描述

我们可以看到,虽然我们在代码中写了继承commonObject类,并且在配置文件中给s这个属性赋了值,可是它依旧为null。那么要想解决这种情况,我们必须要在这个子类对应的配置文件中Bean的parent属性设置成妖继承的类,才能使用父类的属性。
修改过后的配置文件:

    <bean id="commonObject" class="cn.ansel.extend.commonObject" abstract="true">
        <!-- 
            给属性s通过setter的方法赋值
         -->
        <property name="s" value="you can't see me"></property>
    </bean>
    <!-- 
        只是spring容器,parent中的类为该类的父类
     -->
    <bean id="studentDAO" class="cn.ansel.extend.StudentDAO" parent="commonObject"></bean>

然后我们再次运行测试类:
这里写图片描述

以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值