2017-03-14 3 views
3

Lets nehme ich eine Klasse, wie unten dargestellt:Federkern JNDI Konfiguration mit Bohnen

public interface UserDAO { 
    public List<User> list(); 
} 

public class UserDAOImpl implements UserDAO { 
    private DataSource dataSource; 

    public UserDAOImpl(DataSource dataSource) { 
     this.dataSource = dataSource; 
} 

Nehmen wir an, JNDI Konfiguration korrekt in tomcat getan.

Jetzt für die Frühling-Bean-Mapping in vielen Standorten fand ich die folgende Konfiguration:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/UsersDB"/> 
</bean> 

    <bean id="userDao" class="net.codejava.spring.dao.UserDAOImpl"> 
    <constructor-arg> 
     <ref bean="dataSource" /> 
    </constructor-arg> 
</bean> 

Hier ist, was meine Frage ist UserDAOImpl Klasse für Datasource-Objekt suchen, aber wir injizieren JndiObjectFactoryBean Objekt [Welche nicht eine Unterklasse ist von DataSource], da wir nicht einmal die Fabrikmethode erwähnen, wie oder wo die Konvertierung stattfindet?

Antwort

0

Ich weiß nicht, wie es getan wird, aber Spring Frameworks weiß, dass Bohnen eine Fabrik von DataSource Bohnen ist, dann kann es die entdeckte Datenquelle in Ihre anderen Bohnen injizieren.

Ich möchte Sie wissen, wie es gemacht wird, dann können Sie den Quellcode sehen Sie in Spring Framework Github

1

JndiObjectFactoryBean ist Bohne vom Typ org.springframework.beans.factory.FactoryBean. Diese Bohnen werden als Fabrik für ein zu belichtendes Objekt verwendet. Nachfolgend sind Auszüge aus dem Javadoc für FactoryBean;

Schnittstelle, die von Objekten implementiert werden soll, die in einer BeanFactory verwendet werden, die ihrerseits Fabriken für einzelne Objekte sind. Wenn ein Bean diese Schnittstelle implementiert, wird es als Factory für ein Objekt verwendet, das nicht direkt als eine Bean-Instanz verfügbar gemacht werden soll.

Hinweis: Eine Bean, die diese Schnittstelle implementiert, kann nicht als normale Bean verwendet werden. Ein FactoryBean ist in einem Bean-Stil definiert, aber das Objekt, das für Bean-Referenzen (getObject()) verfügbar gemacht wird, ist immer das Objekt, das er erstellt.

FactoryBeans kann Singletons und Prototypen unterstützen und Objekte entweder bei Bedarf oder beim Start dynamisch erstellen. Die SmartFactoryBean-Schnittstelle ermöglicht die Darstellung detaillierterer Verhaltensmetadaten.

Als Federrahmen die Datenquelle ist autowiring es useDaoImpl überprüft, ob ein datasource bean vom Typ FactoryBean, die es in diesem Fall so wird das Objekt von getObject() Methode der JndiObjectFactoryBean zu der Datenquelle zugeordnet werden. Wenn Sie das mehr verstehen wollen, sehen Sie sich die Methoden ClassPathXmlApplicationContext.finishBeanfactoryInitialization(..) und DefaultListableBeanFactory.preInstantiateSingletons() an, die in diesem Fall das Autowiring durchführen.

+0

Danke, hab es. – vicky