Remplacer Singleton de connexion à la bdd
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:
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:
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:
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:
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:
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