Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I annotate an inherited final property with @Autowire?

Resolution: No I'm no longer extending the original parent.

Original:
Is there a way to annotate an inherited final setter method? I am extending a class which has a final setter which I would like to @Autowire with Spring. The parent class is from a library and cannot be modified.

A workaround I have found is to write a proxy method, but this seems like more work than necessary.

public abstract class SqlMapClientDaoSupport ... {
    public final void setSqlMapClient(SqlMapClient smc) {
        ...
    }
}

@Component
public class AccountDao extends SqlMapClientDaoSupport {
    // all this just to annotate an existing method?
    @Autowire
    public final void setSqlMapClientWorkaround(SqlMapClient smc) {
        super.setSqlMapClient(smc);
    }
}

Edit 1: Above example modified to reflect use case:
The use case is implementing DAO objects for Ibatis/Spring which extend a common base class. Each DAO needs the same property set, and each needs to be configured as a bean. I currently do this by configuring each individually in applicationContext.xml.

<bean id="accountDAO" 
  class="com.example.proj.dao.h2.AccountDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<bean id="companyDAO" 
  class="com.example.proj.dao.h2.CompanyDAOImpl"
  p:sqlMapClient-ref="sqlMapClient" />
<!-- etc... -->

I would prefer to use component-scan to discover and autowire the DAO objects automatically, which I can't copy/paste botch.

<context:component-scan base-package="com.example.proj.dao.h2" />

I do not see in the annotation guide how one would annotate a property/member other than where declared. I'm hoping that is something I'm missing though.

Edit 2: I am no longer extending the SqlMapClientDaoSupport class, instead my AccountDao is a POJO which implements what little functionality was being provided by the Support class. This allows me to use @Autowire at will.

like image 826
Chadwick Avatar asked Nov 05 '22 20:11

Chadwick


1 Answers

Have you tried configuring it with xml? Because it's an existing class which it looks like you can't change, it's a definite candidate for configuring it with xml. Then you can specify it as autowire", or even configure the property in the xml.

like image 138
Michael Wiles Avatar answered Nov 11 '22 04:11

Michael Wiles