Java 在服务器启动时加载spring配置

Java 在服务器启动时加载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

我有一个用于识别用户的jsp登录页面。为了配置JdbcTemplate,我在“WEB-INF/applicationContext.xml”下使用spring设置了它的属性,因此为了加载spring上下文,我在WEB.xml中添加了一些标记。但是,在UserDao类中自动连接JDBCTemplatebean会导致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>  
班级服务

  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-