(一)设值注入就是指要被注入的类中定义有一个setter()方法,并在参数中定义需要注入的对象。简单的看个例子。

建一个User类:

package com.ioc;

public class User {
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String printInfo(){
return "name : "+ name +" ; age : "+age;
}
}

spring-ioc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <bean id="user" class="com.ioc.User">
<property name="name" value="Json" />
<property name="age" value="25" />
</bean> </beans>

测试:

package com.ioc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpingTest { @Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-ioc.xml") ;
User user = (User)context.getBean("user") ;
System.out.println(user.printInfo()) ; }
}

PS:这里用到了单元测试,稍后会做讲解
输出结果:

2015-6-26 14:50:08 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7d26f75b: startup date [Fri Jun 26 14:50:08 CST 2015]; root of context hierarchy
2015-6-26 14:50:08 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-ioc.xml]
name : Json ; age : 25

(二)构造注入就是指要被注入的类中声明一个构造方法,并在此方法的参数中定义要注入的对象。

修改一下User类:

package com.ioc;

public class User {
private String name ;
private int age ;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String printInfo(){
return "name : "+ name +" ; age : "+age;
}
}

spring-ioc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <bean id="user" class="com.ioc.User">
<constructor-arg name="name" value="Json" />
<constructor-arg name="age" value="22" />
</bean>
</beans>

测试:

package com.ioc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpingTest { @Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-ioc.xml") ;
User user = (User)context.getBean("user") ;
System.out.println(user.printInfo()) ; }
}

结果:

2015-6-26 15:05:53 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1342a80d: startup date [Fri Jun 26 15:05:53 CST 2015]; root of context hierarchy
2015-6-26 15:05:53 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-ioc.xml]
name : Json ; age : 22

 PS:Construcotrer注入和setter注入不同的XML写法方式

constructor注入4种不同写法

第1种方法:直接传值:

<!-- constructor方式注入写法1,直接传值 -->
<bean id="user" class="com.ioc.User">
<constructor-arg value="Json" />
<constructor-arg value="22" />
</bean>

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

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

<!-- constructor方式注入写法2,根据索引赋值 -->
<bean id="user" class="com.ioc.User">
<constructor-arg index="0" value="Json" />
<constructor-arg index="1" value="22" />
</bean>

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

 <!-- constructor方式注入写法3,根据所属类型传值 -->
<bean id="user" class="com.ioc.User">
<constructor-arg type="String" value="Json" />
<constructor-arg type="int" value="22" />
</bean>

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

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

<!-- constructor方式注入写法4,根据参数的名字传值:记得传入名是构造器的参数名(推荐用法) -->
<bean id="user" class="com.ioc.User">
<constructor-arg name="name" value="Json" />
<constructor-arg name="age" value="22" />
</bean>

setter注入3种不同写法

<!-- setter方式注入写法1,记得要有无参构造函数 -->
<bean id="user" class="com.ioc.User">
<property name="name">
<value>json</value>
</property>
<property name="age">
<value>22</value>
</property>
</bean>
<!-- setter方式注入写法2,记得要有无参构造函数 -->
<bean id="user" class="com.ioc.User">
<property name="name" value="Json" />
<property name="age" value="22" />
</bean>
<!-- setter方式注入写法7,记得要有无参构造函数  -->
<bean id="user" class="com.ioc.User"
p:name="Json" p:age="22" />

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

Spring学习(3)---Spring设值注入和构造注入的更多相关文章

  1. Spring基于构造函数和设值函数的依赖注入

    基于构造函数的依赖注入 我们知道,bean标签中指定的类会进行初始化,这个初始化过程中自然会调用构造函数,那我们也可以利用这个构造函数完成依赖注入. 先创建一个类: public class Text ...

  2. Spring注入值得2种方式:属性注入和构造注入

    Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了? 即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的 ...

  3. Spring学习(十一)-----Spring使用@Required注解依赖检查

    Spring学习(九)-----Spring依赖检查 bean 配置文件用于确定的特定类型(基本,集合或对象)的所有属性被设置.在大多数情况下,你只需要确保特定属性已经设置但不是所有属性.. 对于这种 ...

  4. Spring学习(六)-----Spring使用@Autowired注解自动装配

    Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...

  5. spring--设置注入VS构造注入

    1.在传统的程序设计中,调用亲自创建被调用者的实例,即由程序控制“对象之间的依赖关系”,这种方式的耦合度比较高:控制反转就是将由程序控制的“对象间的依赖关系”转交给Ioc容器来进行控制,被调用者的实例 ...

  6. 【Spring学习笔记-2.1】Spring的设值注入和构造注入

    设值注入: 先通过无参数的构造函数创建一个Bean实例,然后调用对应的setter方法注入依赖关系: 配置文件: <?xml version="1.0" encoding=& ...

  7. Spring接口编程_设值注入和构造注入

    说明: UserManagerImp是设值注入,UserManagerImp2是构造注入 接口不注入,也就是在Spring配置文件中没有接口的<bean>,但是定义的时候是用接口 priv ...

  8. 【Spring实战】—— 5 设值注入

    本篇主要讲解了Spring的最常用的功能——依赖注入. 注入的方式,是使用Getter Setter注入,平时大多的编程也都是使用这种方法. 举个简单的例子,还是表演者. 表演者有自己的属性,年龄或者 ...

  9. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

随机推荐

  1. 设置spring-boot的logging

    spring-boot默认使用logback来记录logger,spring-boot的包里面org.springframework.boot.logging.logback路径下面有一些配置文件,默 ...

  2. Struts2框架的基本使用

         前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性.从本篇开始我们学习Struts2的基本用法,本篇主要包括以下内容: Stru ...

  3. phpcms笔记

    一.建立虚拟站点 1.先更改www目录下的站点名称,再找到apache, 打开"Apache2\conf\extra"下的"httpd-vhosts.conf" ...

  4. MongoDB Java Driver 3.4操作

    导入jar包 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-dr ...

  5. 阿里云主机试用之自建站点和ftp上传所遇的2个问题

    1.Access to the requested object is only available from the local network 其实我并没有自建站点,只是使用了XAMPP来建了ap ...

  6. shop_list

    #!/usr/bin/env python # -*- coding: utf-8 -*- #输出商品列表,用户输入序号,显示用户选中的商品 li = ["手机", "电 ...

  7. String类理解

    1.首先应该知道的是:String是一个类,不属于基本类型,而是引用类型. 2.创建String对象的三种方式的比较: 第一种是先去String pool检查是否存在"abc"常量 ...

  8. 关于使用命令添加jar进自己的pom文件中-maven项目添加jar包

    现在几乎开发项目都是使用的maven项目,但是有的时候可以使用比较偏门或者新的jar可能在网上搜不到在pom文件里的配置应该如何写,因此写下这篇博客. 比如我现在想加入的AAA.jar这个包 打开cm ...

  9. Web 版 PowerDesigner (Canvas) 技术

    什么是 Canvas?    HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形. ...

  10. C#之自定义特性

    在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译器的支持. .NET Frmework也允许定义自己的特性. ...