gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:21:02 24 4
gpt4 key购买 nike

我有一个用于识别用户的jsp登录页面。为了配置 JdbcTemplate ,我在“WEB-INF/applicationContext.xml”下使用 spring 设置了其属性,因此为了加载 spring 上下文,我在 web.xml 中添加了一些标签。但是,在 UserDao 类中 Autowiring 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;
}

另请注意,不建议直接自动连接字段。您可以找到有关此主题的更多信息 here .

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

我想强调的是,不推荐这种方法,你应该避免它并正确使用依赖注入(inject)。如果您需要使用该方法 - 您的应用程序的架构可能是错误的。

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);
}

关于java - 在服务器启动时加载 spring 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57676758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com