您可以删除 @autowire 注释并使用 @PostConstruct 和 ServiceLocatorFactoryBean 执行延迟的“自动装配”。
您的 GenericService 将与此类似
public class GenericService<T, T_DAO extends GenericDao<T>>{
@Autowired
private DaoLocator daoLocatorFactoryBean;
//No need to autowried, autowireDao() will do this for you
T_DAO dao;
@SuppressWarnings("unchecked")
@PostConstruct
protected void autowireDao(){
//Read the actual class at run time
final Type type;
type = ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[1];
//figure out the class of the fully qualified class name
//this way you can know the bean name to look for
final String typeClass = type.toString();
String daoName = typeClass.substring(typeClass.lastIndexOf('.')+1
,typeClass.length());
daoName = Character.toLowerCase(daoName.charAt(0)) + daoName.substring(1);
this.dao = (T_DAO) daoLocatorFactoryBean.lookup(daoName);
}
daoLocatorFactoryBean 为您施展魔法。
为了使用它,您需要添加一个类似于下面的接口:
public interface DaoLocator {
public GenericDao<?> lookup(String serviceName);
}
您需要将以下代码段添加到您的 applicationContext.xml
<bean id="daoLocatorFactoryBean"
class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
<property name="serviceLocatorInterface"
value="org.haim.springframwork.stackoverflow.DaoLocator" />
</bean>
这是一个不错的技巧,它将为您节省一些样板类。
顺便说一句,我不认为这个样板代码是一个大问题,我工作的项目使用 matsev 方法。