spring的属性注入和构造器注入

spring在向IOC容器中注入Bean的时候,有三种注入方式:

属性注入
构造器注入
工厂方法注入
平常中用到的前两种方法较多,下面对前两种方法举例。
一、属性注入
1、创建一个car类,作为注入的bean

package com.lzj.spring;
public class Car {

private String brand;
private float price;

public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}

}

注意:如果要把定义的类通过xml的属性注入IOC容器中,定义的类一定不要定义有参的构造器,否则会提示没有默认的无参构造器错误。属性注入是通过Car类的set方法进行注入的,因此一定要对类的属性定义set方法。
2、配置bean.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-4.0.xsd">

<bean id="car" class="com.lzj.spring.Car">
<property name="brand" value="baoma"></property>
<property name="price" value="100000"></property>
</bean>

</beans>

bean标签中的class一定要写成全类名的形式,因为spring是根据类的全类名进行反射获取类的。在进行属性注入的时候,由于Car类有两个属性brand和price,所以定义两个property标签,name分别为Car类的两个属性,值分别为初始化属性的值。通过属性注入后,在IOC容器中就有了一个Bean为car的bean,即IOC容器中有一个Car类的实例car,实例的两个属性值分别为baoma和100000。
3、测试类

package com.lzj.springtest;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lzj.spring.Car;

public class SpringTest {

public static void main(String[] args) {

ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("bean.xml");

/*1、在容器中可以通过bean的id名字获取bean,但是获取到的bean默认为object类型,需要转型为Car类型*/
//Car car = (Car) ctx.getBean("car");
/*2、在容器中也可以通过类的名字获取bean,但前提是容器只有一个指定类的bean,否则出错:没有唯一的bean*/
Car car = ctx.getBean(Car.class);
System.out.println(car);
}

}

经测试,Console中输出:
Car [brand=baoma, price=100000.0]

二、构造器注入
1、创建Person类

package com.lzj.spring;
public class Person {

private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}

由于需要把Person类进行构造器注入到IOC容器中,所以不需要定义set方法,但要定义有参构造器,因为spring是通过Person的构造器进行初始化的。
2、配置bean.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-4.0.xsd">

<bean id="person" class="com.lzj.spring.Person">
<!--注意constuctor的顺序是按Person类的构造器的初始化顺序-->
<constructor-arg value="lzj"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
<constructor-arg value="female"></constructor-arg>
</bean>

</beans>

在进行构造器注入的时候,也可以写成

<bean id="person" class="com.lzj.spring.Person">
<constructor-arg value="lzj" index="0"></constructor-arg>
<constructor-arg value="20" index="1"></constructor-arg>
<constructor-arg value="female" index="2"></constructor-arg>
</bean>

用index来定义构造器中参数的顺序。也可以通过属性的类型进行定义。例如:

<bean id="person" class="com.lzj.spring.Person">
<constructor-arg value="lzj" type="java.lang.String"></constructor-arg>
<constructor-arg value="20" type="int"></constructor-arg>
<constructor-arg value="female" index="2"></constructor-arg>
</bean>

也可以通过属性名进行注入值,例如:

<bean id="person" class="com.lzj.spring.Person">
<constructor-arg value="lzj" type="java.lang.String"></constructor-arg>
<constructor-arg value="20" type="int"></constructor-arg>
<!--也可以通过属性名进行注入值-->
<constructor-arg name="sex" value="female"></constructor-arg>
</bean>

3、测试类

public class SpringTest {

public static void main(String[] args) {

ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("bean.xml");
Person person = ctx.getBean(Person.class);
System.out.println(person);
}

}

输出内容为:

Person [name=lzj, age=20, sex=female]

以上即为属性输入和构造器注入的区别。

原文地址:https://www.cnblogs.com/panchangde/p/11684133.html

时间: 2024-11-07 21:07:35

spring的属性注入和构造器注入的相关文章

Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器实现. BeanFactory: IOC 容器的基本实现. ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口. BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身: Appli

spring的两种属性注入方式setter注入和构造器注入或者自动注入

1.这里的属性自动注入,与注解配置bean是两回事.这里的自动注入,指的是bean属性的自动注入. bean属性自动注入,包括byNAme和ByType两码事. 2.所有的applicationContext都实现了resourceLoader接口,通过resourceLoader可以获得resource实例,进而可以访问资源文件. 所以要在类中获得resource实例,必须实现applicationContextAware接口.

实现spring IOC的常见二种方法 setter注入与构造器注入

案例: beans.xml配置 <?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.o

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Spring JavaBean属性值的注入方式( 属性注入, 特殊字符注入 &lt;![CDATA[ 带有特殊字符的值 ]]&gt; , 构造器注入 )

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

深入源码分析Spring中的构造器注入

# 1. 示例 构造器注入类,分别有三个构造器,一个是无参构造器,一个是注入一个Bean的构造器,一个是注入两个Bean的构造器: public class ConstructorAutowiredTest { private User user; private Role role; public ConstructorAutowiredTest() { } public ConstructorAutowiredTest(User user) { this.user = user; } pub

关于Spring的构造器注入

构造器注入常量很简单了,如下↓ 此处是model类注入属性 构造器注入变量(bean): 注:bean一定是一个实现类,或者是一个普通类,否则就无意义 第一步是要给当前的bean(此处为Service实现类)提供要注入的bean的有参构造器,同时不要忘记把无参构造器写上 这里我们要注入的是UserDao的bean ,所以参数为UserDao Spring配置中 service实现类的构造器见第二张图 测试: 原文地址:https://www.cnblogs.com/EEEEC/p/1162350

Spring常用属性的注入及属性编辑器

对于对象的注入,我们使用ref方式,可以指定注入的对象,下面看下对于基本类型的注入,以及当spring无法转换基本类型进行注入时,如何编写一个类似转换器的东西来完成注入. 一,基本类型的注入 下面写一个简单类,来看下spring中对于基本类型的注入: <bean id="bean1" class="com.shuitian.spring.Bean1"> <!-- <property name="strValue" valu

Spring之属性注入

时间:2017-1-31 23:38 --Bean的属性注入方式 有三种注入方式:    1)接口注入:        定义一个接口,定义setName(String name)方法,定义一个类,实现该接口,并提供private String name. 2)构造器注入:        定义一个类,声明一个private String name,通过构造器this.name = name;进行注入.        在配置文件中使用<constructor-arg>标签. 3)通过set方法注入