Spring是一个包含了众多工具方法的Ioc容器,它包含以下两个最基本的功能:
Spring项目的创建与Servlet类似,分为以下3步:
创建成功的效果:
在项⽬的 pom.xml 中添加 Spring 框架的支持,xml 配置如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
可以看到,这里添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。
在创建好的项⽬ java ⽂件夹下创建⼀个启动类main:
可以试着运行打印一下:
可以看到,是没有问题的。
存储Bean分为以下2步或者3步:
第一次使用的时候需要添加配置文件。步骤如下:
(1) 在 resources 的根⽬录下创建一个xml文件,这里我们起名字要规范一点,这个resource一般保存的是我们的静态文件。
(2)把下面的配置文件复制到里面,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>
这里所谓的创建Bean ,其实就是创建一个 Java 的普通类。只不过权限是由 spring 所持有,千万不要被名字唬到。
然后先写一个方法,等下用来测试:
我们需要在配置文件中,将需要保存到 spring中的 bean 对象进行注册。
在我们刚刚创建的xml文件里面添加下面内容
<bean id="user" class="com.beans.UserBean"></bean>
这里的 id 可以理解为一个别名,我们给刚刚创建的这个UserBean类,起了一个叫“user"的别名
而这个class则是它的存储路径,我们待会通过这个路径来进行找这个”user“。
因此,我们这里的user取名要规范,便于一看就知道是那个的别名。(起外号要形象)
在这里也可以分为3步:
//1.得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
这个步骤需要注意的是()里面改的内容需要与我们之前创建xml文件名是一致的。
//2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
UserBean user = (UserBean) context.getBean("user");//需要强转
这里面最后一个括号的内容是我们上面起的别名:
//3.调用对象里面的方法
user.sayHi("aaa");
public class test {
public static void main(String[] args) {
//1.得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
UserBean user = (UserBean) context.getBean("user");//需要强转
//3.调用对象里面的方法
user.sayHi("aaa");
}
}
效果:
这里我们没有new就获取到了一个对象。
除了 ApplicationContext 之外,我们还可以使⽤ BeanFactory 来作为 Spring 的上下⽂。如下:
public static void main(String[] args) {
// //1.得到上下文对象
// ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// //2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
// UserBean user = (UserBean) context.getBean("user");//需要强转
// //3.调用对象里面的方法
// user.sayHi("aaa");
//1.使用BeanFactory方法来获取上下文对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2.获取Bean
UserBean userBean = (UserBean) beanFactory.getBean("user");
//3.使用Bean
userBean.sayHi("aaa");
}
getBean() ⽅法有很多种重载⽅法,我们也可以使⽤其他⽅式来获取 Bean 对象,如下:
(1)使用bean name获取bean
UserBean userBean = (UserBean) beanFactory.getBean("user");
(2)根据bean type 获取bean
UserBean userBean = (UserBean) beanFactory.getBean("UserBean.class");
这种方式写法简单,但容易出问题,当同一个类型被注入到spring中多次的时候,就会报错。如下:
当我们有多个bean对象的时候:
这里去获取bean对象就会报错,因为spring要求,获取对象是必须是唯一的,而恰恰这里不唯一。
(3)根据bean name 和类型获取bean
UserBean userBean = beanFactory.getBean("user",UserBean.class);
相同点:
- 都提供了getBean方法
不同点:
- 从继承关系和功能⽅⾯来说,ApplicationContext属于BeanFactory的子类。BeanFactory 只提供了基础访问Bean的方法,而ApplicationContext除了拥有BeanFactory的所有功能之外,还提供了更的方法实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持。
- 从性能方面来说二者是不同,BeanFactory 是按需加载Bean,因此更轻量,ApplicationContext是饿汉方式,在创建时会将所有的Bean都加载起来,以备以后使用。
- 操作容器之前,先要有容器,所以先要得到容器。
a.创建项目
b.添加 Spring 框架支持,引入 spring-context 和 spring-beans 依赖
c.创建一个启动类 和 main方法- 存对象
a. 创建 Bean(普通类)。
b. 将 Bean 注册(配置)到 spring-confing.xml 中。- 取对象
a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
b. 获取某⼀个 Bean 对象。
c. 使⽤ Bean 对象
完!