繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM