Spring框架简介
-
Spring 是一个开源的Java企业级应用开发框架。
-
特点:
-
控制反转(IoC):通过依赖注入(DI)减少组件间的耦合,由Spring容器负责对象的创建和绑定。
-
面向切面编程(AOP):允许开发者分离应用程序的业务逻辑与系统服务(如事务管理和安全性)。
-
容器:提供用于配置和管理对象生命周期的容器,可通过XML、注解或Java代码配置。
-
抽象:为多种编程模型和协议(如JDBC、JMS、JPA等)提供抽象层,简化使用。
-
声明式事务管理:支持声明式事务管理,简化事务操作并分离业务代码。
-
社区和生态系统:拥有庞大的开发者社区及相关项目(如Spring Boot、Spring Cloud、Spring Data等)。
-
使用Spring完成第一个案例的步骤
-
创建Maven项目。
-
在
pom.xml
中导入Spring的JAR包:<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.9.RELEASE</version></dependency>
-
配置Bean对象的XML文件。
-
编写Spring测试代码:
public class MainApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");HelloWorld helloWorld = (HelloWorld) app.getBean("helloWorld");String message = helloWorld.getMessage();System.out.println(message);}}
BeanFactory和IOC容器
-
BeanFactory:Spring中最基础的核心接口,提供IOC功能,负责实例化、配置和组装Bean。
-
ApplicationContext:BeanFactory的子接口,提供更多企业级支持功能,如国际化、事件传播、AOP等。
IOC和DI
-
IOC(控制反转):将对象的创建和管理控制权从程序代码转移到外部容器或框架。
-
DI(依赖注入):实现IOC的具体技术,通过动态注入依赖关系到组件中,降低组件间耦合度。
Bean实例化对象的基本流程
-
资源定位:通过资源定位机制找到配置文件。
-
Bean定义读取:使用Bean定义读取器读取配置文件中的信息。
-
创建BeanDefinition对象:为每个Bean创建一个
BeanDefinition
对象。 -
注册BeanDefinition:将
BeanDefinition
对象注册到BeanDefinitionRegistry
。 -
BeanDefinitionMap存储:存储在
BeanFactory
的BeanDefinitionMap
中。 -
请求Bean实例:应用程序请求容器中的Bean时,查找
BeanDefinitionMap
。 -
实例化Bean:根据
BeanDefinition
信息创建Bean实例。 -
依赖注入:通过构造器注入或设值注入为Bean实例注入依赖。
-
Bean生命周期处理:调用Bean的生命周期回调方法。
-
存储到singletonObjects:单例Bean实例存储在容器的
singletonObjects
缓存中。 -
使用Bean:Bean实例准备好,可供应用程序使用。
-
容器关闭:调用单例Bean的销毁方法。
XML方式配置Bean
-
bean标签常用属性:
-
id
:Bean的唯一标识。 -
name
:Bean的别名。 -
class
:定义类的全限定名。 -
singleton
:定义Bean是否为单例。 -
depends-on
:指定当前Bean的依赖Bean。 -
init-method
:指定Bean的初始化方法。 -
destroy-method
:指定Bean的销毁方法。 -
lazy-init
:指定Bean的初始化时间。 -
autowire
:指定Bean的自动注入方式。 -
scope
:Bean的作用范围。 -
dependency-check
:指定Bean的依赖检查模式。
-
-
autowire:有五个值(no, byName, byType, constructor, autodetect, default)。
-
scope:有五个值(singleton, prototype, request, session, globalSession)。
-
dependency-check:有四个值(simple, object, all, none)。
-
property标签:
-
name
:指定属性的名称。 -
value
:指定属性的值。 -
ref
:指定引用对象类型的值。
-
Spring实例化对象的几种方式
-
通过构造器实例化。
-
Spring容器启动时读取XML配置文件。
-
根据配置文件中的<bean>标签,使用反射机制创建ExampleBean类的实例。
-
如果有属性注入,Spring会在创建实例后填充这些属性。
-
-
通过FactoryBean接口进行实例化。
-
建一个类实现FactoryBean接口。
-
实现getObject()方法,该方法返回实际要创建的Bean实例。
-
在Spring配置中定义这个FactoryBean。
-
-
通过静态工厂。
-
通过实例工厂。
-
通过注解。
-
在类上添加@Component或其衍生注解(如@Service、@Repository)。
-
配置Spring的组件扫描,指定要扫描的包。
-
启动Spring容器,它会扫描指定的包并查找标记了注解的类。
-
Spring容器会自动实例化这些类。
-
Spring依赖注入的几种方式
-
set方式注入。
-
构造器方式注入。
还是以set方式注入的代码为例;使用构造器方式注入的话只需要改变两个地方即可: 一:把set方法改成带参的构造方法; 二:把bean.xml里面的<property>标签换成<constructor-arg>标签 详解如图所示:
-
自动装配(byName, byType)
-
autowire='byName'
在前面set方式注入的基础代码上,使用自动装配后就不需要我们手动在bean.xml文件里面用标签去配置,而是使用autowire属性指明。看图说明:
-
autowire='byType'
如果自动装配时选择byType作为值,那么名字一不一致就无所谓了,但是要求注入的Type只能是一个,如果有多个则发生报错。看图:
-