一、前言
前面学完Spring之后知道,Spring框架的核心功能有两个:①Spring容器负责创建、管理所有的Java对象,然而这些Java对象被称为Bean。②Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。对于开我们这些开发者而言,使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入"。
二、Bean的定义
Bean是一个由Spring IoC容器实例化、组装和管理的对象。
2.1.1 Bean的基础配置(id和class)
<bean id = " " class = " "/>
关于<bean>标签的功能、使用方式以及id和class属性的作用,我们通过一个表格详解。
类别 | 描述 |
名称 | bean |
类型 | 标签 |
所属 | beans标签 |
功能 | 定义Spring核心容器管理的对象 |
格式 | <beans> <bean /> <bean></bean> </beans> |
属性 列表 |
Id:bean中的id,使用容器可以通过id值获取对应的bean,在一个容器中id的值是唯一的,简称bean的唯一标识符 Class:bean的类型,即配置的bean的全路径类名,指定bean的具体实现类。 |
例子 | <bean id = "bookDao" class = " com.system.dao.impl.BookDaoImpl" /> <bean id = "bookService" class = " com.system.service.impl.BookServiceImpl"></bean> |
2.1.2特别说明:
Class属性里面不能写接口!!!因为接口是没有办法创建对象的。一般情况下,Spring会直接使用new关键字来创建该Bean的实例。所以class类里必须提供bean实现类的类名。
2.1.3入门案例代码实现:
需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。
(1)在IDEA中创建Maven项目
(2)在pom.xml中添加Spring依赖的jar包
(3)创建BookService、BookServiceImpl、BookDao和BookDaoImpl四个类
(4)在resource文件夹里面添加Spring的配置文件,完成Bean的配置
(5)使用Spring提供的接口完成IOC容器的创建
(6)从容器中获取对象进行方法的调用
步骤1:在IDEA中创建Maven项目
步骤2:在pom.xml中添加Spring依赖的jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
步骤3:创建BookService、BookServiceImpl、BookDao和BookDaoImpl四个类
步骤4:在resource文件夹里面添加Spring的配置文件,完成Bean的配置
resources下添加Spring配置文件applicationContext.xml,并完成Bean的配置
步骤5: 在配置文件中完成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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
-->
<bean id="bookDao" class="com.system.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.system.service.impl.BookServiceImpl"/>
</beans>
步骤6:获取IOC容器
使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法
public class App {
public static void main(String[] args) {
//获取IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
步骤7:从容器中获取对象进行方法调用
public class APP2 {
public static void main(String[] args) {
//3.获取IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean
//BookDao bookDao =(BookDao) ctx.getBean("bookDao");
//bookDao.save();
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}
步骤8:运行程序
测试结果为:
2.2 Bean中的name属性
类别 | 描述 |
名称 | name |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的别名,可定义多个,使用逗号(,)分号(;)空格( )分隔 |
例子 | <bean id = "bookDao" name = " dao bookDaoImpl" class = " com.system.dao.impl.BookDaoImpl" /> <bean name = "service,bookServiceImpl" class = " com.system.service.impl.BookServiceImpl"> </bean> |
2.2.1使用说明
步骤1:配置别名
打开Spring的配置文件applicationContext.xml
<?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">
<!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
<bean id="bookService" name="service service4 bookEbi" class="com.system.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
<bean id="bookDao" name="dao" class="com.system.dao.impl.BookDaoImpl"/>
</beans>
说明:Ebi全称Enterprise Business Interface,翻译为企业业务接口
步骤2:根据名称容器中获取bean对象
public class AppForName {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//此处根据bean标签的id属性和name属性的任意一个值来获取bean对象
BookService bookService = (BookService) ctx.getBean("service4");
bookService.save();
}
}
步骤3:运行程序
2.3Bean中的scope配置
关于Bean的作用范围是Bean属性配置的一个重点内容
先通过表格看下Bean作用范围的配置属性:
类别 | 描述 |
名称 | scope |
类型 | 属性 |
所属 | bean标签 |
功能 | 定义bean的作用范围,可选范围如下 (1)singleton:单例(默认) (2)prototype:非单例 |
例子 | <bean id = "bookDao" class = "com.system.dao.impl.BookDaoImpl" scope = "prototype"/> |
2.3.1 验证IOC容器中对象是否为单例
验证思路:
同一个bean获取两次,将对象打印到控制台,看打印出的地址值是否一致。
具体实现:
创建一个AppForScope的类,在其main方法中来验证。
public class AppForScope {
public static void main(String[] args) {
ApplicationContext ctx = new
ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
System.out.println(bookDao1);
System.out.println(bookDao2);
}
}
打印,观察控制台的打印结果:
结论:
Spring创建的bean对象都是单例的
2.3.2配置bean为非单例
(1)在Spring配置文件中,配置scope属性来实现bean的非单例创建
(2)在Spring的配置文件中,修改<bean>的scope属性
<bean id="bookDao" name="dao" class="com.system.dao.impl.BookDaoImpl" scope=""/>
(3)将scope设置为singleton
<bean id="bookDao" name="dao" class="com.system.dao.impl.BookDaoImpl" scope="singleton"/>
运行AppForScope,打印看结果
(4)将scope设置为prototype
<bean id="bookDao" name="dao" class="com.system.dao.impl.BookDaoImpl" scope="prototype"/>
运行AppForScope,打印看结果
结论:使用bean的
scope
属性可以控制bean的创建是否为单例:
singleton
默认为单例
prototype
为非单例
2.4Bean基础配置小结
关于Bean的基础配置中,需要掌握以下属性
<bean
id="bean的唯一标识"
class="bean的类全名"
scope="bean的作用范围,有singleton(默认)和prototype"
name="为bean取的别名"/>