开篇点题:为什么要用到Spring?
参考这篇文章: http://t.csdn.cn/oR5lM
一、创建一个Maven项目
1.创建一个Maven项目
2.添加Spring依赖/框架支持
在pom.xml中添加框架的支持,xml配置如下:( 下载失败参考: http://t.csdn.cn/zUYhO)
<dependencies>
//spring-context:spring 上下文
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
//spring-beans:管理对象的模块
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
3.添加启动类
其实是非必要步骤,正常项目一般使用Tomcat,但是我们测试学习还是使用启动类方便
随便创建一个类,里面一个main方法就行,没有什么特殊含义,比如我们创建一个App类
二、存储Bean对象
bean:豆子 Enterprise Java Bean: Java的软件组件模型
1.创建一个bean
和平常创建一个类基本没啥区别
2.把Spring配置文件加入到resources中
在创建好的项目中 添加 Spring 配置文件 spring-config.xml ,将此文件 放到 resources 的根目录下,直接复制下面代码粘贴即可,最终结果如下图
<?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:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>
3.将bean对象配置到spring配置文件当中
bean的id属性: 相当于一个别名/名称,区别是这个id是唯一的,不能重复
bean的class属性: 对象本身,一般是 包名+类名
三、读取Bean对象
在哪读? 在main方法中进行读取操作。
1.得到 Spring 上下文对象
对象都交给 Spring 管理了,获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下文。
除了 ApplicationContext 之外,我们还可以使用 BeanFactory 来作为 Spring 的上下文。他们两种效果是一样的, ApplicationContext 属于 BeanFactory 的子类。
//1. 得到Spring对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
2.获取某一个指定的 Bean 对象
在Spring中获取这个对象
//1. 得到Spring对象,传入的是xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象
//要进行强制类型转换,getBean方法返回值是 Object
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id
获取Bean的几种方式
① 通过Bean的id
推荐将id设置为类名的小写,便于在强制转换的时候不容易写错
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id
② 通过Bean类型
不推荐使用,因为如果同时注入两个类名相同,会查询不到唯一的User。报错: single matching
bean but found 2:....
Bean bean = context.getBean(bean.class);//直接传入bean的类名+后缀
③ 两者都传入
将id传入进去,并且将类型传入进去,这样不易写错,如果不存在的时候,直接就是null了。没有了暴力转换的问题 .主流常用推荐方式。
Bean bean = context.getBean("bean",Bean.class);//直接传入bean的类名+后缀
3.使用 Bean 对象
//1. 得到Spring对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象
//要进行强制类型转换,getBean方法返回值是 Object
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id
//3. 使用bean对象
System.out.println(bean.sayOk());//简单的使用一下试试
如下图,可以看到能够正常打印结果。
四、ApplicationContext 和 BeanFactory
面试:请问ApplicationContext 和 BeanFactory 的区别和联系:
继承关系和功能方面来说:Spring 容器有两个顶级的接口:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。
从性能方面来说:ApplicationContext 是一次性加载并初始化所有的 Bean 对象,而BeanFactory 是需要那个才去加载那个,因此更加轻量。BeanFactory是比较轻量化的,但是ApplicationContext是牺牲空间换取性能了,性能更高,但其实现在并不是全部加载而是根据硬件配置,根据多方面具体情况。能够几乎最大限度的找到取舍点,是比较智能的。比如资源足够的时候直接 饿汉模式,一次性加载全部。
ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
五、总结
//1. 得到Spring对象,ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。传入的参数就是xml
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象,有三种方式,一般使用 id 和 class都传入的方法
Bean bean = context.getBean("bean",Bean.class);
//3. 使用bean对象
System.out.println(bean.sayOk());
通过这个代码的实现,再回顾上一篇博客http://t.csdn.cn/pkvz2
就会有更加深刻的理解,比如xml的文件命名是随意的,因为只需要传入到ClassPathXMLApplicationContext的名字相同就可以(通常命名为 spring-config.xml)
而Spring其实就是一种Ioc(控制反转)的思想,DI(依赖注入)实现的。提现到代码就是 直接从Spring容器中取出对象,不再进行new的方法来实现 低耦合。
而这种 每个类都需要在xml中声明标注id和class的方法其实还是比较麻烦的,是几年前的旧方法了,后面还会有更加方便的方式。