Java 在服务器启动时加载spring配置
我有一个用于识别用户的jsp登录页面。为了配置JdbcTemplate,我在“WEB-INF/applicationContext.xml”下使用spring设置了它的属性,因此为了加载spring上下文,我在WEB.xml中添加了一些标记。但是,在UserDao类中自动连接JDBCTemplatebean会导致NullPointerException applicationContext.xmlJava 在服务器启动时加载spring配置,java,spring,nullpointerexception,web.xml,jdbctemplate,Java,Spring,Nullpointerexception,Web.xml,Jdbctemplate,我有一个用于识别用户的jsp登录页面。为了配置JdbcTemplate,我在“WEB-INF/applicationContext.xml”下使用spring设置了它的属性,因此为了加载spring上下文,我在WEB.xml中添加了一些标记。但是,在UserDao类中自动连接JDBCTemplatebean会导致NullPointerException applicationContext.xml <context:annotation-config /> <context
<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>
班级服务
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>
上下文配置位置
/WEB-INF/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
我打赌您的UserDAO
类没有定义为Springbean。在这种情况下,您有两个选择:用XML定义bean或对其进行注释
选项1:XML
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>
在这种情况下,您不需要在现场安装@Autowired
选项2:基于注释的
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>
UserDAO.java
@组件
公共类UserDAO{
@自动连线
私有JdbcTemplate JdbcTemplate;
}
还请注意,不建议直接自动连接字段。您可以找到有关此主题的更多信息
DummyClass.java
@Component//也必须是bean
公共类DummyClass{
私有最终UserDAO UserDAO;
@自动连线
公共DummyClass(UserDAO UserDAO){
this.userDao=userDao;
}
}
选项3:从应用程序上下文手动提取Bean
我想强调的是,不推荐使用这种方法,您应该避免使用它,并正确使用依赖项注入。如果需要使用这种方法,那么应用程序的体系结构可能是错误的
SpringBeanUtil.java
@组件
公共类SpringBeanUtil实现ApplicationContextAware{
私有静态应用上下文上下文;
@凌驾
public void setApplicationContext(ApplicationContext ApplicationContext)抛出BeansException{
上下文=应用上下文;
}
公共静态T getBean(类beanClass){
返回context.getBean(beanClass);
}
}
UserDAO.java
公共类UserDAO{
私有JdbcTemplate JdbcTemplate=SpringBeanUtil.getBean(JdbcTemplate.class);
}
我打赌您的UserDAO
类没有定义为Springbean。在这种情况下,您有两个选择:用XML定义bean或对其进行注释
选项1:XML
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>
在这种情况下,您不需要在现场安装@Autowired
选项2:基于注释的
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>
UserDAO.java
@组件
公共类UserDAO{
@自动连线
私有JdbcTemplate JdbcTemplate;
}
还请注意,不建议直接自动连接字段。您可以找到有关此主题的更多信息
DummyClass.java
@Component//也必须是bean
公共类DummyClass{
私有最终UserDAO UserDAO;
@自动连线
公共DummyClass(UserDAO UserDAO){
this.userDao=userDao;
}
}
选项3:从应用程序上下文手动提取Bean
我想强调的是,不推荐使用这种方法,您应该避免使用它,并正确使用依赖项注入。如果需要使用这种方法,那么应用程序的体系结构可能是错误的
SpringBeanUtil.java
@组件
公共类SpringBeanUtil实现ApplicationContextAware{
私有静态应用上下文上下文;
@凌驾
public void setApplicationContext(ApplicationContext ApplicationContext)抛出BeansException{
上下文=应用上下文;
}
公共静态T getBean(类beanClass){
返回context.getBean(beanClass);
}
}
UserDAO.java
公共类UserDAO{
私有JdbcTemplate JdbcTemplate=SpringBeanUtil.getBean(JdbcTemplate.class);
}
UserDAO对象是通过Spring创建的还是使用新操作符创建的?UserDAO类是否使用任何spring注释进行注释?@RamPrakash UserDAO对象使用一个新的运算符进行实例化以重复:您不能直接通过构造函数创建spring Bean对象。这不是依赖注入的概念。无论您在哪里需要UserDAO,都需要自动连接它,否则它将无法工作。
UserDAO对象是通过Spring创建的还是使用new操作符创建的?UserDAO类是否使用任何spring注释进行注释?@RamPrakash UserDAO对象使用一个新的运算符进行实例化以重复:您不能直接通过构造函数创建spring Bean对象。这不是依赖注入的概念。无论您在哪里需要UserDAO,都需要自动连接它,否则它将无法工作。
@Najla Chabeb-dominikbrandon绝对正确。如果你觉得他的回答有帮助,请“向上投票”并“接受”。此外,您可能对这个链接感兴趣:您是指构造函数吗?您不能直接通过构造函数创建Springbean对象。这不是依赖注入的概念。无论你在哪里需要你的UserDAO,你都需要自动连接它,否则它将无法工作。你不能这样做。如果您想让它工作,您需要从应用程序上下文中手动提取bean,但强烈建议不要这样做。请正确使用依赖项注入。您可以阅读更多内容。@NajlaChabeb我刚刚编辑了我的答案,并添加了第三个选项,这正是您需要的。这将使它为你工作。但是,我仍然鼓励您阅读更多关于正确使用Springbeans的内容。在这种情况下,您需要自动连接UserDAO对象。当您试图直接用构造函数实例化Springbean时,@Autowired
-注释字段将不会初始化。这意味着无论何时您想要使用UserDAO对象,您使用它的类也必须是bean。@Najla Chabeb-