spring 中的 abstract="true" 是啥意思?
Posted
技术标签:
【中文标题】spring 中的 abstract="true" 是啥意思?【英文标题】:What is meant by abstract="true" in spring?spring 中的 abstract="true" 是什么意思? 【发布时间】:2012-03-12 22:37:01 【问题描述】:抽象类不能在 java 中实例化。但是 spring 说类似 abstract="true"
的 bean 创建。如果抽象类的状态仅由其子类实例初始化(我想我是对的),那么如果我需要在抽象类中定义的方法中使用该属性,那么......是否有可能它?我有一组代码如下:
class abstract A
private Something somethingObj;
// getters and setters are present.
public void logSomething()
try
//some code which throws exception
catch(Exception e)
somethingObj.logIt(e);// I have some logic inlogIt method.
【问题讨论】:
【参考方案1】:Spring 中的抽象 bean 与抽象类有些不同。事实上,Spring 中的抽象 bean 甚至不必映射到任何类。以此为例:
<bean id="dao" abstract="true">
<property name="dataSource" ref="dataSource"/>
<property name="someHelper" ref="someHelper"/>
</bean>
<bean id="fooDao" class="FooDao" parent="dao">
<property name="fooHelper" ref="fooHelper"/>
</bean>
<bean id="barDao" class="BarDao" parent="dao">
<property name="barHelper" ref="barHelper"/>
</bean>
和类:
public class FooDao
private DataSource dataSource;
private SomeHelper someHelper;
private FooHelper fooHelper;
//setters
public class BarDao
private DataSource dataSource;
private SomeHelper someHelper;
private BarHelper barHelper;
//setters
请注意,FooDao
和 BarDao
没有任何共同的父(抽象或非抽象)基类。父抽象 bean 定义仅用于对公共属性进行分组,因此您可以避免在 XML 中重复。
另一方面,引入FooDao
和BarDao
都继承自的抽象Dao
类将是一个好主意:
public abstract Dao
protected DataSource dataSource;
protected SomeHelper someHelper;
//setters
public class FooDao extends Dao
private FooHelper fooHelper;
//setters
public class BarDao extends Dao
private BarHelper barHelper;
//setters
但dao
bean 仍然不必定义类。当多个具体 bean 具有相同的依赖关系时,将抽象 bean 视为减少 XML 中重复的一种方法。
【讨论】:
需要注意的是抽象bean不是被Spring实例化的 在基于注解的bean配置中如何设置abstract="true"?【参考方案2】:其实,抽象的父bean不需要定义类属性,你可能只需要一个公共属性来共享。
据此tutorial
父 bean 不能自己实例化,因为它是 不完整,并且它也被明确标记为抽象。当一个 定义是这样抽象的,只能作为纯模板使用 用作子定义的父定义的 bean 定义 定义。
【讨论】:
以上是关于spring 中的 abstract="true" 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Spring事务配置(在SpringContext中配置)?
Spring 用注解Annotation注入 abstract 抽象父类的属性
Spring学习笔记——Spring中lazy-init与abstract具体解释
利用hibernate+spring向mysql数据库加入数据。执行成功,但是数据库没数据。如果用hibernate查寻结果正常