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提供一个全局访问点。
Spring有三种创建Bean的方式
1、调用构造器创建Bean对象 (实际开发中常用的)
通过调用构造器创建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属性注入参数。
2)利用有参构造函数直接注入值构造Bean对象实例
当利用有参构造注入值构造时,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属性指定了:构造方法赋值
2、调用静态工厂方法创建Bean对象
静态工厂方法创建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 />元素传入
3、调用实例工厂方法创建Bean对象
调用实例工厂方法创建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 />元素传入
原创声明,本文系作者授权云+社区发表,未经许可,不得转载。
如有侵权,请联系 yunjia_community@tencent.com 删除。
编辑于 2018-12-24