![](/img/trans.png)
[英]Spring Cloud Config Server Circular Dependency With Netflix Eureka Discovery on Startup
[英]Loading a spring config at server startup
我有一个用于标识用户的jsp登录页面。 为了配置JdbcTemplate,我在spring的“ WEB-INF / applicationContext.xml”下设置了它的属性,因此为了加载spring上下文,我在web.xml中添加了一些标签。 但是,在UserDao类中自动装配jdbcTemplate bean会导致NullPointerException!
applicationContext.xml
<context:annotation-config />
<context:component-scan base-package="com.firstapp.dao"/>
<bean id="datasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="oracle" />
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
DAO类
public class UserDAO
{
@Autowired
private JdbcTemplate jdbcTemplate;
....}
班级服务
public class UserService
{
private UserDAO userDAO = new UserDAO ();
....}
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
我敢打赌,您的UserDAO
类未定义为Spring Bean。 在这种情况下,您有两个选择:用XML定义bean或对其进行注释。
选项1:XML
applicationContext.xml
<bean id="userDao" class="[package of UserDAO class].UserDAO">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
在这种情况下,您无需在现场使用@Autowired
。
选项2:基于注释
applicationContext.xml
<context:annotation-config/>
<context:component-scan base-package="[package of UserDAO class]"/>
UserDAO.java
@Component
public class UserDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
}
另请注意,不建议直接自动连接字段。 您可以在此处找到有关此主题的更多信息 。
DummyClass.java
@Component // must be a bean as well
public class DummyClass {
private final UserDAO userDao;
@Autowired
public DummyClass(UserDAO userDao) {
this.userDao = userDao;
}
}
选项3:从应用程序上下文中手动提取Bean
我想强调一点,不建议使用此方法,您应避免使用此方法,并正确使用依赖项注入。 如果您需要使用该方法-应用程序的体系结构可能是错误的。
SpringBeanUtil.java
@Component
public class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
UserDAO.java
public class UserDAO {
private JdbcTemplate jdbcTemplate = SpringBeanUtil.getBean(JdbcTemplate.class);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.