最近在系统的学习Spring,现在就Spring的一些知识进行总结。

我们知道Spring是一个开放源代码的设计层面的框架,他主要解决的是业务逻辑层与其他各层之间松耦合的问题。

Spring 有三个核心:

1.IOC 控制反转

我们以前在A对象中创建B对象时,都是直接在A对象内部使用new B() 的方法创建对象,这样下去,A和B有很强的的耦合性。那么我们用到了Spring ,我们可以把创建对象和管理对象的控制前交给了Spring , 这样就叫做控制反转,也就说让Spring 去管理和创建对象。

2.DI 依赖注入

Spring在使用构造器方法和set注入扥方式创建对象时,总会将属性自动设置为所需要的值的思想就是依赖注入的思想

3.AOP 面向切面编程

我们知道OOP是面向对象编程,就是把世界万物都抽象成一个搞对象。

AOP是对OOP的扩展和延伸,就是把一些对象共有的部分抽象成切面,然后对该切面进行一些权限控制、事务管理、日志管理等共性的操作的思想就是AOP思想。

那么如果使用Spring创建对象有哪几种方式呢?

有三种:

  1. 构造器方法
  2. 静态工厂方法
  3. 实力工厂方法

前提条件:

1.创建一个web项目

2.引入Spring的jar包

commons-io-2.4.jar
    commons-logging.jar
    spring-beans-3.2.8.RELEASE.jar
    spring-context-3.2.8.RELEASE.jar
    spring-core-3.2.8.RELEASE.jar
    spring-expression-3.2.8.RELEASE.jar

3.在src下创建applicationContext.xml文件

一.构造器方法

先创建一个Person类

package com.xljy.test.spring01;public class Person {private String name;private int id;public String getName() {System.out.println("getName");return name;}public void setName(String name) {System.out.println("setName");this.name = name;}public int getId() {System.out.println("getId");return id;}public void setId(int id) {System.out.println("setId");this.id = id;}public String toString(){return "该person为id="+id+", name="+name+"";}
}
这里没有写构造方法,在java中如果没有写构造方法,会默认有一个构造方法,如果已经写了一个无参构造方法,就不会默认创建无参构造方法。

所以此处我没有写任何一个构造方法,当然会默认创建一个无参的构造方法,下面我们就是用无参的构造方法来创建对象

下面是applicationContext.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.xsd"><bean class="com.xljy.test.spring01.Person" id="person"></bean></beans>

最简单的applicationContext.xml的写法,我们在此处声明了person bean

下面是测试类

package com.xljy.test.spring01;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestPersion01 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Person person = (Person) context.getBean("person");System.out.println(person.toString());}}

这里我们使用spring通过无参构造器来创建Person对象,toString()输出的结果为:

该person为id=0, name=null

看穿件对象时默认将属性设为初始值,int类型的初始值为0, String和引用类型的初始值为 null. 这就是依赖注入 DI的思想了;

并且在这里观察到setName()方法和setId()方法中的输出语句都没有输出,说明现在使用无参构造器的时候还没有用到set方法

假如我们在applicationContext.xml 配置文件的 person bean中加入参数设置,如下:

<bean class="com.xljy.test.spring01.Person" id="person"><property name="name" value="LiuChunfu"></property><property name="id" value="125"></property></bean>

测试方法不变,运行后的结果为:

setName
setId

该person为id=125, name=LiuChunfu

说明对象在创建的时候调用了set方法。这是使用无参构造函数创建对象的方式,下面我在Person中再假如无参构造函数看看:

其他的不变,输出结果为:

Person的无参构造函数
setName
setId

该person为id=125, name=LiuChunfu

又验证了我们所想:Spring通过无参构造器创建对象时,如果有参数设置就会调用set方法。

下面我们来看看使用有参构造器是一个什么样的情形。

我们在Person类中增加了有参构造方法,其他的不变,Person如下:

package com.xljy.test.spring01;public class Person {private String name;private int id;public Person(){System.out.println("Person的无参构造函数");}public Person(String name, int id){System.out.println("Person类的有参构造方法");this.name = name;this.id = id;}public String getName() {System.out.println("getName");return name;}public void setName(String name) {System.out.println("setName");this.name = name;}public int getId() {System.out.println("getId");return id;}public void setId(int id) {System.out.println("setId");this.id = id;}public String toString(){return "该person为id="+id+", name="+name+"";}
}

其他的都不变,直接运行测试类得到的结果还是:

Person的无参构造函数
setName
setId

该person为id=125, name=LiuChunfu

说明还是通过无参构造器来创建对象,那么如何通过有参构造器来创建对象呢?

修改applicationContext.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.xsd"><bean class="com.xljy.test.spring01.Person" id="person"><constructor-arg name="id" value="123"></constructor-arg><constructor-arg name="name" value="LiuChunfu"></constructor-arg></bean></beans>

其他的不变,运行测试类:

Person类的有参构造方法
该person为id=123, name=LiuChunfu

这回直接运行有参构造方法了,没有使用set()方法。

二。静态工厂方法创建对象

新建一个静态工厂类方法 StaticPersonFactory

package com.xljy.test.spring01;public class StaticPersonFactory {public static Person2 createPerson(){return new Person2();}public static Person2 createPerson(String name, int id){return new Person2(name, id);}}

这里既写了无参构造器,也写了有参构造器,方便看输出,又定义了一个Person2类,如下:

package com.xljy.test.spring01;public class Person2 {private String name;private int id;public Person2(){System.out.println("Person2的无参构造函数");}public Person2(String name, int id){System.out.println("Person2类的有参构造方法");this.name = name;this.id = id;}public String getName() {System.out.println("Person2---getName");return name;}public void setName(String name) {System.out.println("Person2--setName");this.name = name;}public int getId() {System.out.println("Person2---getId");return id;}public void setId(int id) {System.out.println("Person2--setId");this.id = id;}public String toString(){return "该Person2--person为id="+id+", name="+name+"";}
}

applicationContext.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.xsd"><bean class="com.xljy.test.spring01.Person" id="person"><constructor-arg name="id" value="123"></constructor-arg><constructor-arg name="name" value="LiuChunfu"></constructor-arg></bean><bean id="person2" class="com.xljy.test.spring01.StaticPersonFactory" factory-method="createPerson"></bean>
</beans>

这里定义了person2的bean, 使用的静态工厂方法创建Person2类,我们来看一下,测试类:

package com.xljy.test.spring01;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestPersion01 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//      Person person = (Person) context.getBean("person");
//      System.out.println(person.toString());}}

我们把后面两句注释掉,只加载配置文件,看输出:

Person类的有参构造方法

Person2的无参构造函数

说明和Spring在初始化的时候配置文件中的两个bean都被创建了,静态工厂方法也默认使用了无参构造方法。

三。实例工厂方法创建对象

首先创建实例工厂类方法:PersonFactory, 如下:

package com.xljy.test.spring01;public class PersonFactory {public Person3 createPerson(){return new Person3();}
}

然后创建一个Person3类

package com.xljy.test.spring01;public class Person3 {private String name;private int id;public Person3(){System.out.println("Person3的无参构造函数");}public Person3(String name, int id){System.out.println("Person3类的有参构造方法");this.name = name;this.id = id;}public String getName() {System.out.println("Person3--getName");return name;}public void setName(String name) {System.out.println("Person3--setName");this.name = name;}public int getId() {System.out.println("Person3-getId");return id;}public void setId(int id) {System.out.println("Person3--setId");this.id = id;}public String toString(){return "该Person3--person为id="+id+", name="+name+"";}
}

定义applicationContext.xml

<bean id="personFactory" class="com.xljy.test.spring01.PersonFactory">
        
    </bean>

<bean id="person3" factory-bean="personFactory" factory-method="createPerson">

如下:

<?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="com.xljy.test.spring01.Person" id="person"><constructor-arg name="id" value="123"></constructor-arg><constructor-arg name="name" value="LiuChunfu"></constructor-arg></bean><bean id="person2" class="com.xljy.test.spring01.StaticPersonFactory" factory-method="createPerson"></bean><bean id="personFactory" class="com.xljy.test.spring01.PersonFactory"></bean><bean id="person3" factory-bean="personFactory" factory-method="createPerson"></bean>
</beans>

如此,测试类:

package com.xljy.test.spring01;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestPersion01 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//      Person person = (Person) context.getBean("person");
//      System.out.println(person.toString());}}

还是把后两句注释,我们来看初始化spring容器时,输出如下:

Person类的有参构造方法
Person2的无参构造函数

Person3的无参构造函数

结果显示:

Person类是通过构造器的方式创建的

Person2类是通过静态工厂方法创建的

Person3类是通过实力工厂方法创建的

最后总结一下,spring创建对象的三种方式:

构造器

静态工厂方法

实例工厂方法

Spring 学习之 二----Spring创建对象的三种方式相关推荐

  1. spring入门:beans.xml不提示、别名、创建对象的三种方式

    spring的版本是2.5 一.beans.xml文件不提示 Location:spring-framework-2.5.6.SEC01\dist\resources\spring-beans-2.5 ...

  2. IoC、Spring 环境搭建、Spring 创建对象的三种方式、DI

    二.IoC 中文名称:控制反转 英文名称:(Inversion of Control) 3.I oC 是什么? 3.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情,转交给 Spri ...

  3. Spring创建对象的三种方式以及创建时间

    创建对象的三种方式: 1.采用默认的构造函数创建 2.采用静态工厂方法 1.写一个静态工厂方法类 public class HelloWorldFactory { public static Hell ...

  4. 【JavaScript】创建对象的三种方式

    JavaScript创建对象的三种方式 1.调用系统的构造函数创建对象2.自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)3.字面量的方式创建对象 一.调用系统的构造函数创建对象 举个栗 ...

  5. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  6. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

  7. Java动物类enjoy方法打印_Java反射学习-2 - 获取Class对象的三种方式

    1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...

  8. java创建QRCode二维码的三种方式

    自己在网上看视频学习了下如何使用java创建二维码,感觉还是挺有趣的,有小心思的还可以把秘密存入二维码中噢 视频源网址:http://www.imooc.com/learn/531 点击下载jar包 ...

  9. 生成二维码的三种方式

    一:二维码的概念 二维条码(2-dimemsional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形 二: 二维码的分类 通常分为三 ...

最新文章

  1. 机器学习数据预处理之缺失值:预测填充(回归模型填充、分类模型填充)
  2. 激活手表显示无法登陆服务器,在Firefox中使用Nightwatch运行测试无法连接到Selenium服务器...
  3. 【Prince2科普】衡量绩效的六大要素
  4. JZOJ 4933. 【NOIP2017提高组模拟12.24】C
  5. C# Winform 出现异常:无法将顶级控件添加到控件,解决方案如下:
  6. 请画图说明tcp/ip协议栈_5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南 - Android木子李老师...
  7. mysql 8.0.11-Windows (x86, 64-bit)下载地址与安装教程
  8. ruby hash方法_Ruby中带有示例的Hash.key?(obj)方法
  9. text-overflow:ellipsis的巧妙运用
  10. mysql数据库视图_MySQL数据库8(二十)视图
  11. linux maven安装与入门
  12. 简单的maven自定义webapp目录
  13. 如何在百度文库复制内容
  14. GB28181协议--设备注册和注销
  15. unity接入 微信登录sdk
  16. word 2010中页码从任意页开始
  17. lae界面开发工具入门之介绍八--消息转发器组件篇
  18. 《捉妖记》的命格解析
  19. docker搭建minio
  20. Jmeter解决上传附件中文名乱码问题

热门文章

  1. java 简单的计算器程序_java 简单计算器
  2. css样式实现炫彩字体
  3. 2000多万个微信号被封全面禁止集赞 微信雷霆行动这次玩真的
  4. matlab读取视频videoreader出错解决方法
  5. 8月27日至9月2日 区块链投融资事件
  6. 计算机高职400到430大学,高职考会计专业各高校的录取分数是多少?
  7. 如何正确配置与使用GradleMCP918并安装Optifine
  8. Gradle各版本下载
  9. BMCC摄像机ProRes编码的MOV视频文件损坏修复
  10. iOS 界面尺寸居然跟实际机型不符!