在Spring3.0之前,Spring主要创建对象的方法是基于配置文件的,即在配置文件中为对象进行注册,并且可以在配置文件当中为对象的字段或者称之为属性值进行赋值,接下来首先介绍基于配置文件的创建对象的方式。

1.1 基于配置文件的无参数构造函数的对象创建

package bjtu.wellhold.testSpring;

//当类当中没有任何构造函数的时候,默认就是一个无参数的public的构造函数会被生成,如果一旦有任何一个构造函数
//则该默认的构造函数不会被生成。
public class Person { private String name;
private Integer id; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
} }

这里有一点需要特别强调的,在只有无参数构造函数的情况下(或默认不写),Spring在通过setter方式进行注入的时候,无论是否添加属性的注入,Spring都会去寻找无参数的构造函数,通过这个无参数构造函数去进行注入,而在该Person的Pojo类当中,没有显式声明任何构造函数(有参和无参的),在java当中JVM会默认为这个类生成一个无参数的构造函数,所以该类对于Spring是可用的。

<?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.xsd"> <bean class="bjtu.wellhold.testSpring.Person" id="person">
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean> </beans>

这是Spring的配置文件,通过Pojo类当中的setter方法为对象的属性进行了注入,并且创建了该Pojo对象的实例保存在Spring的IOC容器当中,等待其他类或者代码块进行调用。

package bjtu.wellhold.testSpring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class testUnit { public static void main(String[] args) { ApplicationContext cfg=new ClassPathXmlApplicationContext("Config.xml");
Person person=(Person)cfg.getBean("person");
System.out.println(person);
}
}

这是测试代码块,可以看到打印出来的person的具体信息。

1.2 基于配置文件的带参数构造函数的对象创建

package bjtu.wellhold.testSpring;

public class Person {

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

代码当中提供了一个有参数的构造方法。

<?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.xsd"> <bean class="bjtu.wellhold.testSpring.Person" id="person">
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="LiuChunfu"></constructor-arg>
</bean> </beans>

而在spring的配置文件当中,则是通过标签<constructor-arg>去为对象注入属性值,其中name字段对应的是pojo类构造方法当中的形参名称。

测试代码与1.1一样,此处就不重复上代码了。

2.1 基于配置文件的静态工厂方法的仅有无参数构造函数的对象创建

package bjtu.wellhold.testSpring;

public class Person {

    private String name;
private Integer id; public void setName(String name) {
this.name = name;
} public void setId(Integer id) {
this.id = id;
} @Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
} }

在该pojo类当中,仅有默认不写的无参数构造函数,所以我们要对其进行属性值注入,仅能通过setter的方法进行注入,即和1.1的形式类似,但是这里我们是通过工厂的静态方法的形式去进行的,所以这里我们还需要一个工厂类

package bjtu.wellhold.testSpring;

public class PersonStaticFactory {

    public static Person createPerson() {
return new Person();
} }

这个工厂类仅有一个方法,就是creatPerson,即返回一个Person对象的实例,而这个实例化的方法调用的是Person类当中默认的无参数构造函数,那么这时候我们来思考一个问题,能为这个Person实例注入属性值嘛?答案是肯定的,即与1.1当中的方法类似,通过标签<property name="xxxx" value="yyy"></property>去通过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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="person" class="bjtu.wellhold.testSpring.PersonStaticFactory" factory-method="createPerson">
<property name="id" value="123"></property>
<property name="name" value="wellhold"></property>
</bean> </beans>

这里要简单解释一下,与1.1不同,这里是通过PersonStaticFacotory这个工厂类当中的CreatePerson方法去进行Person实例化的,在1.1当中则是通过Spring直接去实例化Person类的,方式是不同的。但是属性值注入的方式则是一样的。

测试模块的代码与1.1相同,这里不在重复。

2.2 基于配置文件的静态工厂方法的有参数构造函数的对象创建

package bjtu.wellhold.testSpring;

public class Person {

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

这个Pojo类当中含有两个构造函数,一个是全参的构造函数,一个是无参的构造函数,我们就可以通过构造函数去为Person的实例进行属性值注入,所以这里不再需要setter方法,并且我们的工厂类当中,应该也对应两个构造函数的createPerson的方法,代码如下:

package bjtu.wellhold.testSpring;

public class PersonStaticFactory {

    public static Person createPerson() {
return new Person();
} public static Person createPerson(Integer id,String name){
return new Person(name,id);
} }

通过配置文件当中的<constructor-arg name="xxxx" value="yyyy"><constructor-arg>标签去进行属性值的注入,代码如下:

 <bean id="person" class="bjtu.wellhold.testSpring.PersonStaticFactory" factory-method="createPerson">
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="LiuChunfu"></constructor-arg>
</bean>

这里要额外的提醒一点,在使用标签<constructor-arg name="xxxx" value="yyyy"><constructor-arg>的时候,要与工厂类当中所有的静态方法的形参对应,即要调用无参数的createPerson,则无需使用该标签,要调用全参数的createPerson则需要将所有的参数都填上,否则会报错误。

3.1 基于配置文件的工厂方法的无参数构造函数的对象创建

使用工厂方法与使用工厂静态方法的唯一的区别就在于,因为工厂方法没有设置成静态的,所以再使用工厂之前,需要通过Spring去创建一个工厂的实例,才可以去调用该工厂实例的方法,创建工厂的实例相信从1.1当中就可以知道如何去创建,之后再通过已经被Spring管理起来的工厂实例去创建Person实例即可,其他的和工厂静态方式没有什么不同。

package bjtu.wellhold.testSpring;

public class Person {

    private String name;
private Integer id; public Person(String name, Integer id) {
super();
this.name = name;
this.id = id;
} public Person()
{ } @Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
} }
package bjtu.wellhold.testSpring;

public class PersonStaticFactory {

    public static Person createPerson() {
return new Person();
} public static Person createPerson(Integer id,String name){
return new Person(name,id);
} }
<?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.xsd"> <bean id="personFactory" class="bjtu.wellhold.testSpring.PersonFactory"></bean> <bean id="person" factory-bean="personFactory" factory-method="createPerson">
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="wellhold"></constructor-arg>
</bean> </beans>

注意,与使用静态方法不同的一点在于,在生成Person实例的时候,使用的标签从class变成了factory-bean,这里要注意一下。除了使用构造函数进行属性注入,也可以使用setter去进行属性注入,这里就不在重复了,形式可以参考章节2当中的内容去自行进行尝试。

本文主要参考了:http://www.cnblogs.com/LiuChunfu/p/5574383.html,并且通过自己的一些实践,转换成自己的思路和语言表述并记录。

Spring:基于配置文件的创建对象的各种方式的更多相关文章

  1. Spring基于注解注入的两种方式

    1.@Autowried 1)默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的). 2)当实现类的Bean大于一个的时候,需结合@Qualifier,根据Bean的名称来指定需 ...

  2. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP

    基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...

  3. 基于配置文件的Spring注入

    基于配置文件的Spring注入 1.依赖注入的概述 依赖注入指的是通过Spring配置文件的方式创建对象时,直接通过配置的方式将数据注入到该对象的标量类型属性,并从Spring容器中获取指定对象注入到 ...

  4. Spring AOP基于配置文件的面向方法的切面

    Spring AOP基于配置文件的面向方法的切面 Spring AOP根据执行的时间点可以分为around.before和after几种方式. around为方法前后均执行 before为方法前执行 ...

  5. Spring基于XML方式的使用

    一.IoC配置 IoC的配置是通过Spring的xml文件的bean标签进行的. 1.bean标签介绍 bean标签一般是在xml文件进行配置的,xml文件一般样式如下: <?xml versi ...

  6. spring Quartz基于配置文件和注解的实现

    这里仅仅是做简单的记录怎样实现. 一.基于配置文件的实现 ①编写须要调度的类 package com.study; import org.springframework.scheduling.anno ...

  7. 7 -- Spring的基本用法 -- 11... 基于XML Schema的简化配置方式

    7.11 基于XML Schema的简化配置方式 Spring允许使用基于XML Schema的配置方式来简化Spring配置文件. 7.11.1 使用p:命名空间简化配置 p:命名空间不需要特定的S ...

  8. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  9. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

随机推荐

  1. java前台传参json,后台用map或者实体对象接收

    (一)前台传js对象,里面包含数组,后台用map接收 (1)第一种情况:数组里不包含js对象 var param ={}: param.id=id; param.name=name; var scor ...

  2. PQFitness

    <html> <head> <title></title> <style> *{margin:o;padding:0;} #header{ ...

  3. 《Cracking the Coding Interview》——第16章:线程与锁——题目4

    2014-04-27 20:06 题目:设计一个类,只有在不产生死锁的时候才分配资源. 解法:不太清楚这个题是要分配何种资源,以何种形式?所以没能动手写个可运行的代码,只是闲扯了几句理论分析. 代码: ...

  4. 一个初学者的辛酸路程-jQuery

    前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...

  5. cocos2d安装

    cocos2d引擎要求Python 2 为2.6 以上版本,Python 3 为3.3以上版本 cocos2d引擎安装支持pip安装,安装指令如下: pip install cocos2d

  6. 洛谷P1071潜伏者(提高组)

    题目描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于S国的R 国间谍小C终于摸清了 S 国军用密码的编码规则: 1. S国军方内部欲发送的原信息经过加密后在网 ...

  7. 【Python】重定向 Stream 到文件

    Python 系统模块 sys 中有三个变量 stdin . stdout 与 stderr ,分别对应标准输入流.输出流与错误流.stdin 默认指向键盘, stdout 与 stderr 默认指向 ...

  8. 【LeetCode】Swap Nodes in Pairs(两两交换链表中的节点)

    这是LeetCode里的第24题. 题目要求: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定1->2->3->4, 你应该返回2->1->4- ...

  9. 团队项目-第四次Scrum 会议

    时间:10.26 时长:30分钟 地点:线上 工作情况 团队成员 已完成任务 待完成任务 解小锐 编写project和projectGenerator类 编写下一步的规格说明 陈鑫 采用creator ...

  10. Nginx主要模块常用指令说明

    核心模块(Core Modules): 主模块(Main Module):配置和服务器全局有关的一些参数,比如错误日志.进程.权限等 user worker_processes error_logsy ...