关于Spring的介绍有很多了,本篇文章旨在快速入门使用Spring。说起Spring,很多人都会脱口而出:IOC、DI、AOP等术语。简单说一下:
(1)IOC,是控制反转。这里,就有两个疑问了:
a)第一,控制什么?
这里的控制,主要是指控制对象的创建、销毁等
b)第二,反转了什么?
以前,我们依赖某个对象,都是通过new的方式创建对象的,比如说,A依赖B,那么在A类中,一般会持有一个B的引用,类似于这样: private B b = new B()。而有了Spring之后,我们不需要自己手动创建对象了,只需要配置,也就是说,Spirng会帮我们创建好对象,我们只需要关注创建对象之后的操作就可以了。所以,反转,指的创建对象的方式发生了反转,不再是我们自己创建了。
(2)DI,是依赖注入。这里要弄清楚,谁依赖谁,谁给谁注入了什么?
当然是我们的程序依赖于Spring容器了,并且是Spring容器给我们注入需要的对象。比如说,A需要一个B对象,那么我们不用创建对象,Spring会创建好对象,并把对象B注入给A。
(3)AOP,是面向切面编程。主要是抽取了一些公共的方法,比如说日志记录,事务控制等,一般在很多方法都需要添加相同的固定的代码,这些公共的代码,就可以理解为切面了。
项目对应的代码,我会放到GitHub上:https://github.com/qiuxinfa/spring-study。首先看下项目的结构:
1.创建maven工程,添加Spring依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
</dependencies>
2.创建一个实体类:
public class Person {
private String id;
private String name;
private Integer age;
public Person(){
System.out.println("开始创建Person对象了。。。");
}
//省略set、get、toString方法
}
3.在resources目录下,添加Spring配置文件applicationContext.xml,名字随便起。在<beans>节点下,添加一个<bean>节点,配置和说明如下:
<?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:唯一标识,下面的例子中,id就是 "my,person1"
name:就是bean的名称,也要唯一,可以有多个,用逗号分隔,下面的例子中,name有2个,you和person2
class:类的全限定类名
-->
<bean id="my,person1" class="com.qxf.pojo.Person" name="you,person2"></bean>
</beans>
4.创建一个测试类,详细的说明,写在代码中了:
public class HelloSpring {
public static void main(String[] args) {
//读取配置文件,启动
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中,根据id获取bean实例
Person person = context.getBean("my,person1", Person.class);
System.out.println("根据id获取的bean实例: "+person);
//从容器中,根据name获取bean实例
Person person2 = context.getBean("person2", Person.class);
System.out.println("name=person2,获取的bean实例: "+person2);
Person you = context.getBean("you", Person.class);
System.out.println("name=you,获取的bean实例: "+you);
//spring容器创建的bean实例默认是单例的
System.out.println("person==person2 ? "+(person==person2));
//关闭容器
context.close();
}
}
启动测试类的main方法,观察控制台输出,其结果为:
可以发现,对象已经创建成功,只是所有的属性都是null,并且可以通过id或者name获取到bean实例。从测试例子也可以看出,id只有一个,就算用逗号分隔也没有用,会当做一个整体,而一个bean的name可以有多个,用逗号分隔,通过任意一个name都可以获取到bean实例。而 person == person2 为true,则说明它们是同一个对象,间接说明了Spring创建的对象,默认是单例的。那么,怎样让实例变成多例的呢?只需要修改配置文件,添加作用域scope="prototype" 就可以了,prototype是多例的意思,而scope默认是singleton,即是单例的。
<bean id="my,person1" class="com.qxf.pojo.Person" name="you,person2" scope="prototype"></bean>