Bonjour,

j'ai un devoir qui consiste, entre autres, à passer d'un singleton basique (connexion JDBC) à l'utilisation de Spring.
En bref, je dois virer le singleton de mon projet et utiliser l'injection de dépendances.
Mais j'ai quelques problèmes pour le faire...

Actuellement, j'ai un singleton qui instancie un objet de type Connection :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
public class ConnectionManager
{
        private Connection connect;
 	private static final Logger log = LoggerFactory.getLogger(ConnectionManager.class);
 
	public static Connection getInstance()
	{
		if (connect == null) {
			try {
				connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/projetspring", "root", "password");
			}
			catch (SQLException e) {
				log.debug("Connection failed ! ", e);
			}
		}
 
		return connect;
	}
}
Pour réaliser mon travail et remplacer ce fameux singleton, j'ai donc essayé avec Spring ceci dans mon applicationContext.xml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:database.properties" />
	</bean>
 
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
Mon database.properties:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/projetspring
jdbc.username=root
jdbc.password=password
Mais là, je tombe sur un problème. Premièrement, mon code dans Spring instancie un objet de type "DriverManagerDataSource". Or, j'aimerai obtenir un objet de type Connection !

Du coup, j'ai tenté dans mon DAO :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class UserDao {
	private final static Logger log = LoggerFactory.getLogger(MediaDao.class);
	@Resource DriverManagerDataSource dataSource;
	Connection conn;
	
	public UserDao()
	{
		try {
			this.conn = this.dataSource.getConnection();
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
Mais ça ne fonctionne pas. L'objet retourné est NULL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [fr.gesa.opr.user.dao.UserDao]: Constructor threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)
	... 43 more
Caused by: java.lang.NullPointerException
	at fr.gesa.opr.user.dao.UserDao.<init>(UserDao.java:35)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
	... 45 more

Ma question est donc la suivante : Comment puis-je récupérer un objet de type Connection avec Spring afin de l'injecter dans ma classe DAO ?

Je vous remercie