spring-security 为什么我会收到名为“NoSuchBeanDefinitionException:在使用“context.refresh()"后,没有名为”database“的Bean可用?

q3aa0525  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(139)

在我的spring项目中初始化上下文后:

AnnotationConfigApplicationContext context = 
            new AnnotationConfigApplicationContext();

之后,我尝试在调用“getBean()”之前刷新配置文件:

context.refresh(); // explicit refresh of the config file.

然后:

ICustomerDal customerDal
        = context.getBean("database", ICustomerDal.class);
    customerDal.add();

但最后我得到了“NoSuchBeanDefinitionException:没有名为“database”的Bean可用”错误。
IC客户日期类文件:

package com.springdemo;

public interface ICustomerDal {
    void add();
}

我的SqlCustomerDal.类文件:

package com.springdemo;

import org.springframework.stereotype.Component;

@Component("database")
public class MySqlCustomerDal implements ICustomerDal {
    String connectionString;
    // Getter
    public String getConnectionString() {
        return connectionString;
    }
    // Setter
    public void setConnectionString(String connectionString) {
        this.connectionString = connectionString;
    }
    @Override
    public void add() {
        System.out.println("Connection String : " + this.connectionString);
        System.out.println("Added to MySQL Database!"); // MySQL Codes.

    }
}

IocConfig.类文件:

package com.springdemo;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.springdemo")
public class IocConfig {

}

但是如果我像下面的代码块那样做,就不会有错误:

AnnotationConfigApplicationContext context = 
            new AnnotationConfigApplicationContext("com.springdemo"); // implicitly registering and refreshing config file.

    ICustomerDal customerDal = context.getBean("database", ICustomerDal.class);
    customerDal.add();

我只是不明白,如果我在第一个场景中得到“NoSuchBeanDefinitionException”,为什么我在ApplicationContext参数中传递包名后没有得到错误?
提前感谢您的宝贵意见。

vfwfrxfs

vfwfrxfs1#

对于可能在此处遇到相同问题的任何人:

其实我已经想办法了解并解决了这里的情况。
我意识到我需要在ApplicationContext中指定配置文件,或者通过注册手动指定。
我们还可以为另一个附加方法指定如下配置文件:

new AnnotationConfigApplicationContext(IocConfig.class); // Specifying the exact class name rather than the package name itself.

使用下面的代码可以帮助我获得另一个方法,而不是将参数传递到“AnnotationConfigApplicationContext”中:

context.register(IocConfig.class); // --> To specify the config file. 
   context.refresh();                 // --> Need to explicitly refresh the config file after registering.

相关问题