Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么
它就具备两个最基本的功能:
将对象存储到容器(Spring)中;
从容器中将对象取出来。
在Java语言中,对象也叫做Bean, 所以后面的对象以Bean相称。
一、Spring创建与使用
接下来使⽤ Maven ⽅式来创建⼀个 Spring 项⽬,创建 Spring 项⽬和 Servlet 类似,总共分为以下 3步:
1.创建⼀个普通 Maven 项⽬。
2.添加 Spring 框架⽀持(spring-context、spring-beans)。
在pom.xml里添加Spring框架的支持
添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块
3.添加启动类。
最后在创建好的java项目文件夹下创建一个启动类,包含main方法
二、存储Bean对象
存储 Bean 分为以下 2 步:
1. 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean。
2. 将创建的 Bean 注册到 Spring 容器中。具体实现如下
2.1创建Bean
Bean就是一个java语言中普通对象
public class User { public String Hello(String name){ return name+"hello"; } }
2.2将Bean注册到容器
第一个:方法注解实现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" 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">
</beans>
然后注册User对象到Spring中就可,具体是在<beans>中添加配置:
<beans> <bean id="User" class="com.demo.User"> </beans>
第二种方法:通过方法注解实现Bean对象的存储
@Service //这个就是方法注解
public class UserService {
public void sayHi(){
System.out.println("Hi, UserService");}
}
注:使用注解存储Bean和使用XML存储Bean是可以混用的
三、类注解存储Bean的命名问题:(默认命名规则):
结论:如果首字母大写,第二个字母小写,那么Bean的名称就是类名小写
如果不满足首字母大写,第二个字母小写的话,那么Bean名称就是原类名
什么是原类名?
让我们看看Bean生成名称源代码:
命名规则:首字母和第二个字母大写返回原类名,否则就是首字母小写。
四、获取使用Bean对象
获取并使⽤ Bean 对象,分为以下 3 步:
1. 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下⽂。
2. 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
3. 使⽤ Bean 对象。
4.1创建Spring上下文
Spring 上下⽂对象可使⽤ ApplicationContext,实现代码如下:
//得到Spring上下文对象,创建的时候需要配置Spring配置信息
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
除了ApplicationContext,我们还可以使用BeanFactory来作为Spring的上下文,如以下代码:
BeanFactory beanFactory=
new XmlBeanFactory( new ClassPathResource ("spring-config.xml") );
ApplicationContext 和 BeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的⼦类,它们的区别如下
ApplicationContext VS BeanFactory(重点)
1.继承关系与功能方面:
Spring容器有两个顶级的接口 :BeanFactory 和 ApplicationContext
其中 BeanFactory提供了基础的访问容器的能力,而ApplicationContext属于BeanFactory的子类,它除了继承了BeanFactory的全部功能以外,还有自己的独特特性,添加了国际化的支持,资源访问支持,以及事件传播等方面的支持。
2.性能方面:
ApplicationContext 是一次性加载并初始化所有的Bean对象,而BeanFactory是需要哪个才会去加载哪个,因此更加轻量化。
注:ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
4.2获取指定的Bean对象
// 1.得到 Spring 上下⽂对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加载某个 bean
User user = (User) context.getBean("user");
4.2.1注意事项
Bean的id必须一一对应
4.2.2 getBean ⽅法的更多⽤法
getBean() ⽅法有很多种重载⽅法,我们也可以使⽤其他⽅式来获取 Bean 对象,⽐如以下这两种:
根据类型获取 Bean:
UserController user=context.getBean(UserController.class);
名称+类型获取Bean:
UserController user=context.getBean("user",UserController.class);
区别:当有一个类型被重复注册到spring-config.xml中时,只能使用根据名称获取:
比如以下程序:
以上场景导致程序报错:如下图所示
解决方案:
1.将属性名字和Bean名字对应上
2.@Autowired配合@Qualifier一起使用
3.3 使⽤ Bean
public class APP2 {
public static void main(String[] args) {
//1.加载配置(获取所有的注册Bean信息)
BeanFactory context=new XmlBeanFactory(
new ClassPathResource("spring-config.xml"));
//2.得到Bean[依赖查找-》IOC的一种实现】
UserService userService=(UserService) context.getBean("user");
//3.使用Bean对象(非必须)
userService.sayHi();
}
}
四、总结
1.操作容器之前,先要有容器,所有先要得到容器。
2.存对象
a.创建Bean(普通类)
b.将Bean注册(配置)到spring-config.xml中
3.取对象
a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
b. 获取某⼀个 Bean 对象。
c. 使⽤ Bean 对象
附上流程图