我有下面的课
@Component
public class MyBean {
private int val1;
public MyBean(int val1) {
this.val1 = val1;
}
public int getVal1() {
return val1;
}
public void setVal1(int val1) {
this.val1 = val1;
}
}
我想自动布线Mybean
,如下所示
@Service
public class MyService
{
@Autowire
private MyBean myBean;
}
运行时出现以下错误
构造函数MyBean的参数0需要类型为'int'的Bean,但找不到该Bean。
4条答案
按热度按时间9avjhtql1#
有许多方法可以实现它,所有这些都会导致将
MyBean
的适当示例注入到IOC容器中。*具有
@Configuration
注解处理器的Bean定义指示类声明一个或多个@Bean方法,并且可以由Spring容器处理以生成Bean定义。
*使用BeanFactory中的Bean感知接口,如InitializingBean
访问IOC容器本身的方法有很多种,直接通过fluent api,或者间接通过实现bean感知接口(如
InitializingBean
),特别是如果在创建bean示例后有一些操作,请使用this。*使用IOC示例作为ConfigurableApplication上下文
如前所述,此解决方法是直接访问IOC容器,假设您需要singelton作用域,并且Bean的规范名称为
MyBean
*XMl based bean声明
在Spring3.0之前,XML是定义和配置bean的唯一方式,现在它已经不再使用了。
lndjwyie2#
当通过构造函数进行自动装配时,Spring将每个参数都视为一个bean。换句话说,正如跟踪所示:项目/上下文中没有可用的
int
类型的@Bean
,因此无法生成MyBean
。如果您需要
MyBean
以原始int
初始化,则应该改用@Configuration
类别中的@Bean
注解,以便传递值。此外,如果该属性已经具有getter和setter,则可以将
val1
的类型更改为Integer
,删除构造函数或不带参数地声明它,并在MyService
中设置它的值。然而,根据用例的不同,
MyBean
可以是一个POJO,如果你需要用一个原语值来创建它的话。毕竟,不是Spring项目中的每个类都需要是Bean
。woobm2wo3#
我认为您的错误是因为spring告诉您它不知道使用哪个整数值来示例化Bean
MyBean
。您可以执行以下操作:**a)**直接在Bean中设置默认值并使用无参数构造函数:
**b)**为
MyBean
提供不带参数的默认构造函数,并将值作为属性文件中的属性注入:然后,在根资源目录中,需要有一个属性文件:
内容为:
阅读本文中有关属性的详细信息:https://www.baeldung.com/properties-with-spring
**c)**可能有很多其他的选项...这些将取决于你的具体用例。我们对你的类和哪些int值是合适的还不够了解。
brjng4g34#
无参数构造函数
您可以在
MyBean
类中引入一个 no-args 默认构造函数,Spring将使用它,并且val1
将具有一个0
值(因为它是int
类型的默认值)。@豆
或者,您可以在配置类中创建一个用
@Bean
注解的方法,并通过它提供一个MyBean
的示例,该示例具有您需要的任何val1
值。请注意,如果选择此选项,则需要从
MyBean
类中删除@Component
注解。定义多个相同类型的Bean
另外,请注意使用
@Bean
,您可以根据需要定义任意多的MyBean
风格。另一个优点是MyBean
不一定是您的域类(它可以来自第三方库或JDK),而原型注解只能放在您的自定义类之上。下面是一个例子:
需要使用
@Qualifier
注解来区分这些bean。它允许在应用程序的不同部分使用bean的不同风格。让我们在服务中使用值为
8000
的bean:注意不建议在字段上使用
@Autowired
。常用的方法是使用构造函数注入,如果类中只有一个构造函数,则不需要使用@Autowired
。