Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么它就具备两个最基本的功能:将对象存储到容器(Spring)中;从容器中将对象取出来。
在 Java 语⾔中对象也叫做 Bean,所以后⾯咱们再遇到对象就以 Bean 著称。严格的来说Bean就是能被多次使用的对象
接下来使⽤ Maven 方式来创建⼀个 Spring 项目,创建 Spring 项⽬和 Servlet 类似,总共分为以下3步:
在项⽬的 pom.xml 中
添加下列代码
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.2.3.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>5.2.3.RELEASEversion>
dependency>
dependencies>
最后在创建好的项⽬ java ⽂件夹下创建⼀个启动类,包含 main ⽅法即可:
存储 Bean 分为以下 2 步:
所谓的 Bean 就是 Java 语⾔中的⼀个普通对象,实现代码如下:
首先需要创建一个包,再把你自己创建的bean对象放到这个包里
在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources 的根⽬录下,如下图所示
Spring 配置文件的固定格式为以下内容(以下内容无需记忆,只需要保存到自己可以找到的地方就可以了,因为它是固定不变的):
<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 htt
p://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
接下来,再将 User 对象注册到 Spring 中就可以,具体操作是在 中添加如下配置:
class是你要存储到ioc中的bean的完整路径(包名+类名),你创建的包是啥,你就在class后面写上包名.bean名
这个id是你给当前存入到spring中的bean起的名字
<bean id="user" class="springdemo.User">bean>
总的就是
<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">
<bean id="user" class="springdemo.User">bean>
beans>
以上步骤完成之后,只是一个声明,并没有真的把bean对象放到ioc容器中,而是在你调用相关方法的时候才会真正的去存,声明就是告诉容器下次有人调用我的时候我在过来
但是从语义(浅层)来理解就是存储到spring中了,从深层理解就相当于懒汉模式,调用的时候再存储使用
获取并使⽤ Bean 对象,分为以下 3 步:
Spring 上下⽂对象可使⽤ ApplicationContext,实现代码如下:
// 1.得到 Spring 的容器(上下⽂)对象,创建的时候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con
fig.xml");
//2.得到bean
context.getBean("user");//user就是你之前设置的id
user.sayHi("小白");
总的代码
public class App
{
public static void main(String[] args) {
// 1.得到 Spring 的容器(上下⽂)对象,创建的时候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2.得到bean[依赖查找-->IoC的一种实现]
//也就相当于现在调用这个bean了,然后把这个bean放到容器里面,再给这个user对象,因此我们就不需要自己new一个新的对象了,直接从容器里面取就行了
User user=(User)context.getBean("user");//user就是你之前设置的id
//3.使用bean(非必须)
user.sayHi("小白");
}
}
如果你后续要改
这个文件的名字,也可以实现,你只要保证这个文件存在即可
//1.获取上下文对象
BeanFactory context=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2.获取bean
User user=(User) context.getBean("user");
//3.使用bean
user.sayHi("小白");
ApplicationContext VS BeanFactory有什么区别?
相同点:都是容器管理对象,都可以获取Bean对象。
区别:
1.ApplicationContext属于BeanFactory的子类,ApplicationContext拥有更多功能(国际化支持、资源访问支持、以及事件传播等方面的支持…)。
2.加载Bean机制不同:BeanFactory是早期的加载bean对象的方式,由于早期内存缺乏,因此BeanFactory懒加载,按需加载(使用一个Bean加载一个Bean)
ApplicationContext使用靠后,使用ApplicationContext的时候内存已经非常富裕了,因此ApplicationContext一次性加载所有Bean对象。
因此ApplicationContext启动比较慢(内存占用大),因为启动的时候是加载所有bean对象的,但是它的性能很快,也就是说启动之后获取对象非常快,因为不用现成加载新的对象了,而BeanFactory正好相反启动快(内存占用小),但是后期的获取慢
1.跟据名称获取Bean对象(也就是上面代码展示的)
2.跟据类型获取Bean对象
User user=context.getBean(User.class);//不需要强制类型转换
这个方法有可能有问题,如果你只有一个User类型注入到ioc里面,那么没问题,如果有多个,就会有问题了,报错如下
比如我是个老师,我叫穿白衣服的同学回答问题,那么我具体叫的是哪个穿白衣服的呢?可能有很多个穿白衣服的同学
这个问题目前是无解的
3.根据名称+类型来获取的
这种方法比较保险,最推荐的
User user=context.getBean("user",User.class);
//也不需要进行强制类型转换