【Spring】Construcotrer注入和setter注入不同的XML写法方式

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

本文主要讲解了Spring中constructor注入的4种不同写法和sette的3种不同写法

一、constructor注入4种不同写法

通过构造方法注入,就相当于给构造方法的参数传值set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean。

第1种方法:直接传值

	<!-- constructor方式注入写法1,直接传值 -->
	<bean id="student1" class="com.mucfc.beanfactory.Student">
		<constructor-arg value="小明" />
		<constructor-arg value="2001" />
	</bean>

直接给参数赋值,这种方法也是根据顺序排的,所以一旦调换位置的话,就会出现bug,这种方法已经很原始了

第2种方法:根据索引赋值,索引都是以0开头的:

<!-- constructor方式注入写法2,根据索引赋值 -->
	<bean id="student2" class="com.mucfc.beanfactory.Student">
		<constructor-arg index="0" value="阿狗" />
		<constructor-arg index="1" value="2002" />
	</bean>

第3种方法是根据所属类型传值

这种方法基本上不怎么适用,因为一个类里可以有好几个相同基本类型的变量,很容易就混淆值传给哪一个参数了所以做好不要使用这种方法:

<!-- constructor方式注入写法3,根据所属类型传值 -->
	<bean id="student3" class="com.mucfc.beanfactory.Student">
		<constructor-arg type="String" value="大白" />
		<constructor-arg type="int" value="2003" />
	</bean>

第4种方法:根据参数的名字传值:(推荐用法)

	<!-- constructor方式注入写法4,根据参数的名字传值:记得传入名是构造器的参数名(推荐用法) -->
    <bean id="student4" class="com.mucfc.beanfactory.Student">
		<constructor-arg name="name" value="大地" />
		<constructor-arg name="id" value="4503" />
	</bean>

在这几种方法里我感觉这种方法是最实用的,他是根据名字来传值的,所以基本上只要名字对了,这个值就可以获取到 

二、setter注入3种不同写法

1、

	<!-- setter方式注入写法1,记得要有无参构造函数 -->
	<bean id="student5" class="com.mucfc.beanfactory.Student">
		<property name="std_name">
			<value>天天</value>
		</property>
		<property name="std_id">
			<value>2005</value>
		</property>
	</bean>

2、

<!-- setter方式注入写法2,记得要有无参构造函数 -->
	<bean id="student6" class="com.mucfc.beanfactory.Student">
		<property name="std_name" value="水水" />
		<property name="std_id" value="3009" />
	</bean>

3、

<!-- setter方式注入写法7,记得要有无参构造函数  -->
	<bean id="student7" class="com.mucfc.beanfactory.Student"
		p:std_name="针地" p:std_id="3445" />

推荐用第2种或第3种,第1种要写的代码比较多,看直来也没那么顺。

三、使用范例

新建一个java project工程,名字自已取吧,然后把Spring的jar文件 和commons-logging的jar文件加载进来就行

不懂看这里【Spring】Spring配置及第个Spring HelloWorld

新建一个包,添加一个Student.java,代码如下:

/**
*功能 测试constructor和setter注入的不同写法
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.4
*/
package com.mucfc.beanfactory;
public class Student {
	private String std_name;
	private int std_id;

    public Student(){

    }
	public Student(String name,int id) {
     std_name=name;
     std_id=id;
	}

	public String getStd_name() {
		return std_name;
	}

	public void setStd_name(String std_name) {
		this.std_name = std_name;
	}

	public int getStd_id() {
		return std_id;
	}

	public void setStd_id(int std_id) {
		this.std_id = std_id;
	}
	public String toString(){
		return "学生姓名:"+std_name+" 学生学号:"+std_id;
	}

}

在当前工程的src文件夹下添加文件ApplicationContext.xml,就是工程-》右键-》new->other->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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<!-- constructor方式注入写法1,直接传值 -->
	<bean id="student1" class="com.mucfc.beanfactory.Student">
		<constructor-arg value="小明" />
		<constructor-arg value="2001" />
	</bean>
	<!-- constructor方式注入写法2,根据索引赋值 -->
	<bean id="student2" class="com.mucfc.beanfactory.Student">
		<constructor-arg index="0" value="阿狗" />
		<constructor-arg index="1" value="2002" />
	</bean>
	<!-- constructor方式注入写法3,根据所属类型传值 -->
	<bean id="student3" class="com.mucfc.beanfactory.Student">
		<constructor-arg type="String" value="大白" />
		<constructor-arg type="int" value="2003" />
	</bean>
	<!-- constructor方式注入写法4,根据参数的名字传值:记得传入名是构造器的参数名(推荐用法) -->
    <bean id="student4" class="com.mucfc.beanfactory.Student">
		<constructor-arg name="name" value="大地" />
		<constructor-arg name="id" value="4503" />
	</bean>

	<!-- setter方式注入写法1,记得要有无参构造函数 -->
	<bean id="student5" class="com.mucfc.beanfactory.Student">
		<property name="std_name">
			<value>天天</value>
		</property>
		<property name="std_id">
			<value>2005</value>
		</property>
	</bean>
	<!-- setter方式注入写法2,记得要有无参构造函数 -->
	<bean id="student6" class="com.mucfc.beanfactory.Student">
		<property name="std_name" value="水水" />
		<property name="std_id" value="3009" />
	</bean>

	<!-- setter方式注入写法7,记得要有无参构造函数  -->
	<bean id="student7" class="com.mucfc.beanfactory.Student"
		p:std_name="针地" p:std_id="3445" />
</beans>

好了,Ioc容器都配置好了。下面就是来使用了啦,直接看代码:

/**
*功能 测试constructor和setter注入的不同写法
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.4
*/
package com.mucfc.beanfactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class Test {

	public static void main(String[] args) {
		XmlBeanFactory bFactory = new XmlBeanFactory(new ClassPathResource("ApplicationContext.xml"));

		Student stu1 = (Student) bFactory.getBean("student1");
		Student stu2 = (Student) bFactory.getBean("student2");
		Student stu3 = (Student) bFactory.getBean("student3");
		Student stu4 = (Student) bFactory.getBean("student4");
		Student stu5 = (Student) bFactory.getBean("student5");
		Student stu6 = (Student) bFactory.getBean("student6");
		Student stu7 = (Student) bFactory.getBean("student7");

		System.out.println("-------------constructor方式注入写法-------------");
		System.out.println(stu1);
		System.out.println(stu2);
		System.out.println(stu3);
		System.out.println(stu4);

		System.out.println("-------------setter方式注入写法,记得要有无参构造函数-------------");
		System.out.println(stu5);
		System.out.println(stu6);
		System.out.println(stu7);
	}

}

输出结果:

这就是最后的结果,是不是很简单?若你觉得此文对你有用,那就帮我顶一票~~谢谢~~

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

时间: 2024-10-18 11:01:08

【Spring】Construcotrer注入和setter注入不同的XML写法方式的相关文章

Spring依赖注入的Setter注入(通过get和set方法注入)

导入必要的jar包(Spring.jar和commonslogging.jar) 在src目录下建立applicationContext.xml   (Spring 管理 bean的配置文件) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPEING//DTD BEAN//EN" "http://www.springframewor

Bean的构造器注入和setter注入

链接:https://pan.baidu.com/s/1vixLrr8harzZMwLsIB1Mwg 提取码:ou1n 首先要明白,为什么要注入? IOC容器会在初始化时,创建好所有的bean对象的实例(懒汉模式除外:https://www.cnblogs.com/ABKing/p/12044025.html) 这就带来一个问题,当bean中只有方法的时候还不会出问题. 但是如果bean中还有属性呢? 这就是属性注入的出现原因了.为了对bean的属性进行赋值,我们引入了注入的概念 0x00 构造

使用构造方法注入和setter注入的配置文件

<?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/sch

依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象

1.项目截图 2.黑白打印机类 package com.example.demo.printer; public class GrayPrinter implements Printer{ @Override public void init() { System.out.println("启动打印机"); } @Override public void print(String txt) { System.out.println("打印黑白文字:".concat(

Spring bean的三种注入方式

Spring的一个重要原理就是IOC(Inverse Of Control),即控制反转.IOC就是一种将组件依赖关系的创建和管理置于程序外部的技术,在Spring中Bean组件的实例化和依赖关系的管理控制都由Spring容器负责,对象与对象之间的关系可以简单的理解为对象之间的依赖关系:在 类 A 需要类 B 的一个实例来进行某些操作时,比如在类 A 的方法中需要调用类 B 的方法来完成功能,叫做类 A 依赖于类 B.依赖注入(DI:Dependency Injection) :两个对象之间的依

Spring常用的三种注入方式

好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入. 构造方法注入先简单了解一下测试项目的结构,用maven构建的,四个包: entity:存储实体,里面只有一个User类dao:数据访问,一个接口,两个实现类service:服务层,一个接口,一个实现类,实现类依赖于IUserDaote

[Spring实战系列](8)Spring注入方式之setter注入

通常,JavaBean 的属性是私有的,同时拥有一组存取器方法,以setXXX() 和getXXX() 形式存在.Spring 可以借助属性的set方法来配置属性的值,以实现setter方式的注入. 1. 注入简单值 在Spring 中我们可以使用<property> 元素配置Bean 的属性.<property>在许多方面都与<constructor-arg> 类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的setter 方法来注入值. 举例说明,让我们

[Spring入门点滴]利用构造函数和setter注入

构造器方式注入: 主要是了解构造器方式注入时,参数顺序的区分(index),以及类型的区分(type),以及两者的混合使用:另外就是,当传入的内容有特殊符号时,借助于value标签和CDATA的处理.以保障程序的正常运行! /** * Created by wangzh on 2016/4/26. * Description:通过构造器注入实体: * 两个构造器区别就是类型不同: * 在配置spring时,可以利用index或者type进行区分: * 而对于包含特殊符号的值,可以结合<![CDA

spring之setter注入

setter注入分为2种 第一:普通属性注入 <bean id="userAction" class="com.xx.action.UserAction"><!--第一种--> <property name="age" value="13"></property><!--第二种--><property name="name"> <