在往spring IOC容器注入对象时,如果都是使用隐式的无参构造,直接<bean id=.. class=.. > 如果要注入的对象是带参数实例化的例时,这时可以采用三种办法实现。这部分内容在spring官方文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-setter-injection 的Constructor argument type matching位置部分。本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
先我们定义一个class,比如定义一个计算机类,有两个属性:品牌brank和size尺寸。本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
package cn.hellomaven; public class Computer { private String brank; private int Size; //带参数构造 public Computer(String brank, int size) { super(); this.brank = brank; Size = size; } public String getBrank() { return brank; } public void setBrank(String brank) { this.brank = brank; } public int getSize() { return Size; } public void setSize(int size) { Size = size; } }本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
添加我们的java测试例,调用spring容器取得computer类。本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
package cn.hellomaven; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.kermit.test.Computer; public class Params { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Computer computer = (Computer) context.getBean("computer"); System.out.println(computer.toString()); } } #ApplicationContext.xml配置中的注入配置 #<bean id="computer" class="cn.kermit.test.Computer" ></bean>本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
这时如果ApplicationContext.xml中注入Computer类中如果使用上面的写法就会报错,因为Computer类没有不带参数的实例化的方法,报错内容示例如下: org.springframework.context.support.AbstractApplicationContext refresh 警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'computer' defined in class path resource [ApplicationContext.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'computer' defined in class path resource [ApplicationContext.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
此时有以下三种方法来完成有参数的类的实例化。本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
第一种:根据参数的顺序索引来注入参数本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
#ApplicationContext.xml配置 <bean id="computer" class="cn.kermit.test.Computer" > <constructor-arg index="0" value="IBM"></constructor-arg> <constructor-arg index="0" value="17寸"></constructor-arg> </bean>本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
第二种:使用类型来注入,type是参数的类型。但这种方法在有两个相同类型的参数时就不能用了。本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
<bean id="computer" class="cn.kermit.test.Computer" > <constructor-arg type="java.lang.String" value="IBM" /> <constructor-arg type="int" value="17" /> </bean>本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
第三种:使用name指定参数名再赋值,这个方法最实用本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
<bean id="computer" class="cn.kermit.test.Computer" > <constructor-arg name="brank" value="IBM" /> <constructor-arg name="size" value="17" /> </bean> #运行结果: #Computer [brank=IBM品牌, Size=17]本文地址:http://47.93.183.36/article/872.html,未经许可,不得转载.
本文地址:http://47.93.183.36/article/872.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
手机扫码直接打开本页面 |