目录
1.存储Bean对象到Spring容器中
1.1.创建Bean
1.2.将Bean注册到Spring容器中
1.2.1.第一次存储Bean(可选,如果是第二次及以后,此步骤忽略)
1.2.2.添加Bean标签
2.从Spring容器中获取并使用Bean对象
2.1.创建Spring上下文
2.1.1.Spring上下文对象可使用ApplicationContext
2.1.2.Spring上下文对象也可使用BeanFactory
2.1.3.(常见面试题)ApplicationContext VS BeanFactory
2.2.从Spring上下文对象中获取指定的Bean对象
2.2.1.根据id获取bean
2.2.2.根据类型获取bean
2.2.3.根据id+类型获取bean(推荐使用)
2.3.使用Bean对象(非必须)
3.总结
1.存储Bean对象到Spring容器中
1.1.创建Bean
1.2.将Bean注册到Spring容器中
1.2.1.第一次存储Bean(可选,如果是第二次及以后,此步骤忽略)
需要自己先在创建好的项目中添加Spring配置文件spring-config.xml(命名尽量要符合语义),将此文件放到resources(存放资源文件)的根目录下。
(xml语言:是做数据信息描述的语言)
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">
</beans>
1.2.2.添加Bean标签
将User对象注册到Spring中,具体操作是在<beans>中添加如下配置:
<beans>
<bean id="user" class="beans.User"></bean>
</beans>
其中:
- id:给bean起个名字(尽量符合语义),一会用的时候就用这个;且多个bean的id不重复。
- class:要注册的对象的完整路径(包名+类名)。
- 并不是当程序执行到这行代码时就把bean注册到Spring中了,而是当用的时候才会启动。
- Spring中用的是懒加载(懒汉模式),SpringBoot中加注解属于饿汉模式。
2.从Spring容器中获取并使用Bean对象
(如果取多个Bean的话重复2.2.和2.3.步骤)
2.1.创建Spring上下文
得到Spring上下文对象,因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下文。
2.1.1.Spring上下文对象可使用ApplicationContext
//1.得到Spring的上下文对象,创建的时候需要配置Spring配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
和一定要对应一致,否则会报错。
2.1.2.Spring上下文对象也可使用BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
XmlBeanFactory()这个方法从Spring3.1后就过时了,可以采用上面的其他新方法来写(但写法复杂)。
2.1.3.(常见面试题)ApplicationContext VS BeanFactory
Spring容器有两个顶级的接口:ApplicationContext和BeanFactory,二者效果是一样的,区别如下:
①从继承关系和功能方面来说:
BeanFactory是ApplicationContext的父类。
BeanFactory只是提供了基础操作bean的方法,ApplicationContext除了继承BeanFactory的所有功能之外,还提供了自己独有的功能,比如:国际化支持,资源访问支持以及事件传播等方面的支持。
②从性能方面来说:
子:ApplicationContext是一次性加载并初始化所有bean,在创建对象的时候就会将所有的bean进行创建并初始化。(用户体验上更好,已经经历过加载初始化的过程,以后会快)
优点:第一次使用bean的时候比较快;
缺点:启动的时候比较慢,可能会造成资源的浪费。
父:BeanFactory是需要哪个bean才去加载哪个bean。(传统习惯节俭)
优点:是懒汉模式,不浪费任何资源;
缺点:第一次加载bean比较慢。
2.2.从Spring上下文对象中获取指定的Bean对象
getBean()方法有很多种重载方法:
2.2.1.根据id获取bean
//2.从Spring中得到bean对象
User user = (User) context.getBean("user");
context就是Spring对象的化身。
context.getBean("user")返回的是Object,此时需要强转为User。
缺点:如果是null,强转的话会报错。
另外注意:spring-config.xml中bean的id一定要和context.getBean中bean的id保持一致:
和
2.2.2.根据类型获取bean
User user = context.getBean(User.class);
优点:写法简单;
缺点:如果Spring中一个类型存在多个实例,不知道到底去拿哪个,那么程序就会报错:NoUniqueBeanDefinitionException(非唯一的bean异常)。
2.2.3.根据id+类型获取bean(推荐使用)
User user = context.getBean("user", User.class);
此种写法通常是使用频率比较高的,推荐用法,安全。
2.3.使用Bean对象(非必须)
//3.调用相应的方法
user.sayHi("Java");
若程序报错,一定要自己去看报错日志,解决方案主要有:
- 检查相关拼写是否正确;
- 检查两个对应是否一致;
- 检查生成的target文件夹下是否生成配置文件,若有缓存问题,删除target,重新运行,重新生成target。