====================================>User.java
public class User {
private Integer id;
private String name;
private Integer age;
public User(){}
public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
//setter and getter method ......
}
===================================================>Test.java
@org.junit.Test
public void testCase(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)context.getBean("user");
System.out.println(user.getId()+":"+user.getName()+":"+user.getAge());
}
=====================================>applicationContext.xml
<bean id="user" class="com.ustcinfo.entity.User">
<constructor-arg index="0" type="int">
<value>1</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>scott</value>
</constructor-arg>
<constructor-arg index="2" type="java.lang.Integer">
<value>30</value>
</constructor-arg>
</bean>
用set方式不会报错,但是用构造器缺报错了:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1049)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:953)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.ustcinfo.entity.Test.testCase(Test.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
======================================>解决方案
看到红色加粗字体没?注意将type属性删除,只留一个index属性也是可以的(构造函数非重载的情况下),当然不删除最好,避免重载时出错,最好的解决办法是index和type同时配置。下面我来解释下为何添加上type属性后报错:注意我的实体类User中属性id是Integer类型,而applicationContext.xml中配置的是int,所以解决办法有两种,其一,将User中id类型改为int类型,其二,或者改applicationContext.xml配置为type="java.lang.Integer"
相关推荐
在Spring Boot应用中,构造器注入是一种常见的依赖注入方式,但它可能会引发循环依赖的问题。循环依赖是指两个或多个Bean之间形成一个闭环,彼此依赖对方,导致Spring容器在初始化Bean时无法确定创建顺序,从而抛出...
总结来说,Spring的setter和构造注入是实现依赖注入的关键技术,它们提供了灵活且强大的方式来管理对象间的依赖关系,从而提高代码的可维护性和测试性。在实际项目中,开发者可以根据需求和场景选择合适的注入方式。
标题中的“spring介绍(set和构造器注入)”是指在Spring框架中两种主要的依赖注入(Dependency Injection,简称DI)方式:setter注入和构造器注入。在Spring框架中,DI是一种核心特性,它允许我们解耦组件之间的关系...
3. **构造器注入**: 在`Client`类中,我们需要有一个带有`Service`参数的构造器,Spring会通过这个构造器注入`ServiceImpl`: ```java public class Client { private final Service service; public Client...
Spring支持多种类型的构造器注入,包括单一参数的构造器和多个参数的构造器。 1. 单一参数构造器注入 当只有一个参数时,Spring会自动匹配类型并调用相应的构造器。例如: ```java public class UserService { ...
构造器注入是 Spring 4.x 版本推荐的注入方式,通过在构造函数中注入依赖。这种方式可以保证依赖不可变,并且确保需要的依赖不为空。 2.3 Setter 注入 Setter 注入是 Spring 3.x 版本推荐的注入方式,通过 setter ...
3. **注入类型不匹配**:setter方法的参数类型与配置的值类型不匹配,也会导致注入失败。 4. **注入的bean不存在**:当试图注入一个在XML配置中未定义的bean时,Spring会抛出`NoSuchBeanDefinitionException`。 5....
Spring 框架基于这些知识点,为我们提供了两种注入方式:setter 注入和构造器注入。 二、setter 注入 setter 注入是指通过 setter 方法将依赖对象注入到 Bean 中。例如,在 BookServiceImpl 中定义了引用类型属性 ...
在实际开发中,可以根据需求选择合适的方式,通常推荐使用构造器注入,因为它可以提供更好的类型安全性和明确的构造过程。 总结起来,Spring的依赖注入机制是其核心特性之一,它简化了对象间的依赖关系管理,提高了...
在这里,`UserRepository`是`UserService`的依赖,Spring会自动寻找匹配类型的bean并注入。 其次,设值注入是通过setter方法来注入依赖。这种方式更为灵活,因为对象可以在创建后任何时候进行注入,但可能导致对象...
- 在Spring中,可以通过`@Autowired`注解标记在构造函数上,Spring容器会自动匹配并注入相应的依赖。 - 示例:`example4forConstructor`可能是一个展示构造器注入的例子,其中包含一个或多个带注解的构造函数,...
Spring容器在创建对象时,会根据构造器的参数类型自动匹配并注入相应的bean。这种方式确保了对象在创建时就已经具备所有必需的依赖,提高了代码的稳定性。 其次,setter注入是通过在类中声明setter方法,Spring容器...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本教程将专注于Spring中的复杂类型注入,包括集合、自定义类以及...
NULL 博文链接:https://zhangyulong.iteye.com/blog/856986
该变量将在构造器中被初始化,通过构造注入steelAxe bean实例作为参数传递给Chinese构造器。 在Spring框架中,构造注入可以通过两种方式实现,一种是使用constructor-arg元素,另一种是使用 @Autowired 注解。使用...
Spring提供了多种注入方式,包括set注入、构造注入和自动注入,让我们逐一深入探讨。 1. **Set注入** Set注入是最常见的注入方式,它通过setter方法来设置对象的依赖。首先,你需要在类中声明需要注入的属性,并...
3. **接口注入**:Spring不直接支持,但在某些特殊情况下,可以通过实现特定接口并在接口中定义注入点来实现。 **三、@Autowired注解** `@Autowired`是Spring提供的一个注解,用于自动装配bean。它可以应用在字段...
在这个例子中,UserService通过构造器注入的方式接收了一个UserRepository实例。UserService类被标记为@Service,表明它是一个业务层组件;UserRepository类被标记为@Repository,表明它是一个数据访问层组件。 ###...
使用构造器注入时,Spring 根据参数类型或索引来匹配构造函数参数。在这个例子中,`value` 属性对应于构造函数的参数值。 总结: - **setter 方法注入**:灵活性高,适用于可选依赖,但可能导致对象状态不一致。 ...
当找不到与名称匹配的 bean 时才按照类型进行装配。@Resource 可以用在方法、属性、类上,通过 CommonAnnotationBeanPostProcessor 类实现依赖注入,与 @Autowired 一致。但可以指定 name 属性来指定 beanName,但...