gpt4 book ai didi

java - Spring Autowiring 无法看到上下文 bean,除非在基础包上定义了组件扫描

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

我目前使用 @SpringBootApplication 设置 Spring 应用程序,一切正常,但是,我无法使用 Autowiring 注入(inject) xml 中定义的 bean。

如果我通过 xml 配置定义依赖项注入(inject),则注入(inject)的工作方式如下

<bean id="dao" class="com.elevations.dao.Dao">
<property name="dataSource" ref="dataSource"/>
</bean>

但是,如果我用 @ComponentScanning( "elevations") 表示我的应用程序,(elevations 是我的基础包) Autowiring 工作,但是我的 Controller 端点停止工作。为什么会这样?

我的应用程序 com.elevations.Application 定义为

@SpringBootApplication
public class Application
{
public static void main( String[] args )
{
SpringApplication.run( Application.class, args );
ApplicationContext context = new ClassPathXmlApplicationContext( "context.xml" );
}
}

xml 配置定义为

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com.elevations.dao"/>

<!--postgresql jdbc bean-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" autowire="byType">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/elevationdb"/>
<property name="username" value="postgres"/>
<property name="password" value=""/>
</bean>


<bean id="dao" class="com.elevations.dao.Dao"/>

</beans>

我尝试 Autowiring com.elevations.dao.Dao 的测试类

@Component
public class Dao
{
private DataSource m_dataSource;

@Autowired
public void setDataSource( DataSource dataSource )
{
m_dataSource = dataSource;
}
}

Controller com.elevations.controllers.ApplicationController

@Controller
public class ApplicationController
{
@RequestMapping( value = "/elevations", method = RequestMethod.GET )
public String pageGet()
{
return "elevationMaps";
}

@RequestMapping( value = "/elevationData", method = RequestMethod.GET )
@ResponseBody
public LatLng mapGet( @RequestParam( "bounds" ) String bounds, @RequestParam( "diameter") String diameter )
{

JsonParser parser = new JsonParser();
JsonElement viewBounds = parser.parse( bounds );

return new LatLng( 1, 0 );
}
}

最佳答案

如果您想使用 xml,请将 @ImportResource 添加到您的应用程序类。

@ImportResource("context.xml")
@SpringBootApplication
public class Application {

public static void main( String[] args ) {
SpringApplication.run( Application.class, args );
}
}

但是,我强烈建议放弃您的 xml,只需将 application.properties 添加到 src/main/resources 并添加以下属性即可。

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/elevationdb
spring.datasource.username=postgres
spring.datasource.password=

然后从您的类中删除 @ImportResource 并重新启动。

关于java - Spring Autowiring 无法看到上下文 bean,除非在基础包上定义了组件扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606671/

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