SSM开源框架是现在市场上主流的Java开发框架,其中包含了Spring、SpringMVC以及Mybatis三大主要框架。在SSM框架中Spring是整个框架的核心,这是因为Spring有强大的资源整合能力,下面让我们一起来学习一下强大的Spring框架。
我们首先来简单了解一下Spring框架中有哪些模块
其中主要有四大核心模块:
1、IOC模块(即上图中的 CoreContainer模块)
IOC模块是最核心、最基础的模块,又称控制反转容器:负责对象的创建,对象的存储,对象的依赖管理;
2、WEB模块(即MVC,主要解决与表示层的通讯问题)
3、AOP模块(实现系统功能的动态扩展)
4、Data模块(整合JDBC、JPA、Mybatis等)
今天主要讲一下Spring中的IOC模块,以及其创建Bean的三种方式
我们首先了解一下什么是IOC:
IOC是一种设计思想,我们称之为控制反转,在程序中我们通常将对象控制权进行转移的这种设计理解为IOC。例如:对象的创建和管理由第三方框架去实现;又比如在生活中我们将钱存入余额宝,由余额宝管理和使用我们的钱去投资,这也是IOC思想的一种体现。简单的来说就从“ 我要做什么就做什么 ”变为“ 你让我做什么我就做什么 ”。
Spring中的IOC模块是IOC思想的一种完美实现。它通过反射构建对象,通过Map存储对象,通过DI机制实现对象的依赖管理,通过Context提供一个全局访问点。
通过调用构造器创建Bean对象是我们在实际开发中最常用的方式,而构造器创建Bean对象又有两种方式:
1)利用无参构造函数 + setter方法注入值构造Bean对象实例
其本质是 SpringContext 利用无参的构造函数创建一个对象,然后利用setter方法赋值,所以需要在pojo中提供无参数构造函数,并定义对应字段的setter方法。如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。
<!-- setter方法注入值时bean的配置方式 -->
<bean id="user" class="com.beans.user">
<property name="id" value="666"></property>
<property name="name" value="Leorizon"></property>
</bean>
setter方法注入值时,xml配置bean时使用的 <property name="属性名" value="值" ></property>标签对属性进行赋值
Spring容器通过该方法为name属性注入参数。
当利用有参构造注入值构造时,pojo中不需要setter方法;
<!-- 构造注入值时bean的配置 -->
<bean id="user" class="com.beans.user" >
<constructor-arg name="id" value="666"></constructor-arg>
<constructor-arg name="name" value="Leorizon"></constructor-arg>
</bean>
在构造注入值时,xml配置bean时通过使用<constructor-arg name="属性名" value="值"></constructor-arg>标签的name属性和value属性指定了:构造方法赋值
静态工厂方法创建bean对象的核心是: class + factory-method
首先是封装类对象,如果需要对属性注入值,则需要定义有参构造方法或者生产setter方法;
其次是定义静态工厂方法
public class UserFactory {
// 在这里我们定义创建方法是调用构造方法来创建对象
public static User createPerson(){
return new User();
}
public static User createPerson(Integer id,String name){
return new User(id,name);
}
}
然后在XML文件定义bean对象
<!-- 调用静态工厂方法创建bean对象 -->
<bean id="user" class="com.beans.factory.UserFactory" factory-method="createPerson">
<constructor-arg name="id" value="666"></constructor-arg>
<constructor-arg name="name" value="Leorizon"></constructor-arg>
</bean>
使用静态工厂方法创建Bean实例需要为<bean />元素指定出id外如下属性:
class:指定静态工厂的实现类( 即包名.类名 )【相当于指定工厂的地址】
factory-method:指定由静态工厂的哪个方法创建该Bean实例(方法名)【指定由工厂的哪个车间创建Bean】
如果静态工厂方法需要参数,则使用<constructor-arg />元素传入
调用实例工厂方法创建bean对象相比较静态工厂方法创建bean对象,就是将静态方法中的factory实现类先实例化一个factorBean对象,然后调用factorBean对象来创建bean对象;
<!-- 先配置工厂Bean,class指定该工厂的实现类,该Bean负责产生其他Bean实例 -->
<bean id="userFactory" class="com.beans.factory.UserFactory"/>
<!-- 再引用工厂Bean来配置 其他Bean -->
<bean id="user" factory-bean="userFactory" factory-method="createPerson">
<constructor-arg name="id" value="666"></constructor-arg>
<constructor-arg name="name" value="Leorizon"></constructor-arg>
</bean>
调用实例化工厂需要为<bean />指以下两个属性
factory-bean :该属性指定工厂Bean的id
factory-method:该属性指定实例工厂的工厂方法。
如果方法需要参数,则使用<constructor-arg />元素传入
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。