Spring 的开发步骤

1.导入 Spring 的 maven 坐标

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
</dependencies>

2.创建 Bean
3.创建 applicationContext.xml 配置文件
4.在配置文件中进行配置
5.创建 ApplicationContext 对象 getBean

Spring 配置文件要点

Bean 标签

Bean 标签用于在容器中创建标准 java 对象,Spring 默认情况下,创建对象时会调用无参构造,也可以通过配置,调用有参构造来创建对象。

  • 无参构造创建对象
<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 id="userDao" class="com.itheima.user.userImpl.UserDaoImpl" />
</beans>
  • 有参构造创建对象
    通过 constructor-arg 属性向有参构造中传入参数,可以传入引用,也可以传入普通值
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
       <!-- name 代表有参构造的参数名 -->
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>

scope 属性

scope 属性指对象的作用范围,取值如下:
1.singleton 默认值,单例的
2.prototype 多例的,从容器中getBean拿对象时,都会获取一个新的对象
3.request WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中
4.session WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中
5.global session WEB项目中,应用在Portlet环境,如果没有Portlet环境那么globalSession相当于session
注意:在 singleton 的作用域下,创建 spring 容器时,会创建 Bean;而在 prototype 的作用域下,会在调用 getBean 的时候创建Bean

Bean生命周期

  • init-method: 指定类中的初始化方法名称,初始化之后,就会调这里的方法
  • destroy-method:指定类中销毁方法名称,结束之前会调这里的方法
<bean id="userDao" class="com.itheima.user.userImpl.UserDaoImpl" init-method="init"/>

Bean 实例化

Bean 实例化的三种方式:

  1. 无参构造方法实例化(默认)
  2. 工厂静态方法实例化
  3. 工厂实例方法实例化

工厂静态方法实例化

配置工厂静态方法实例化,class 为工厂函数的全限定名,factory-method 为创建 userDao 对象的方法名

// xml 配置文件
<bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao"></bean>
// java 代码
public class StaticFactory {
    // 工厂静态方法,可以配置到spring配置文件中,让spring调用此方法进行初始化
    public static UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

工厂实例化方法

工厂实例化方法是指的先创建工厂对象,然后通过工厂实例调用创建方法来创建对象进行返回

// xml 配置文件
 <!-- 先创建工厂对象 -->
   <bean id="dynamicFactory" class="com.itheima.factory.DynamicFactory" />
   <!--  userDao 的工厂函数指向dynamicFactory 的 getUserDao 方法 -->
   <bean id="userDao" factory-bean="dynamicFactory" factory-method="getUserDao"/>
// java 代码
// 工厂实例方法,可以配置到spring配置文件中,
    // 必须得先有DynamicFactory对象,再调用getUserDao创建对象,因为getUserDao不是静态方法,不能用类名直接调用
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }

Bean 的依赖注入

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。 IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法,那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

Bean 依赖注入方式

  • 构造方法
  • set 方法

set 方法注入

方式一
在 Service 内声明一个静态变量,创建一个set方法。配置 property 标签声明 name 和 ref,其中 name 为 set 方法名后面一截。

<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 id="userService" class="com.itheima.service.impl.UserServiceImpl">
  <property name="userDao" ref="userDao"></property>
</bean>
</beans>

方式二
p 命名空间注入本质也是 set 方法注入,但比起上述的 set 方法注入更加便捷,主要体现在配置文件中,需要引入P命名空间,修改注入方式。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="userService" class="com.itheima.service.impl.UserServiceImple" p:userDao-ref="userDao“ />
</beans>

注意:p:userDao=“userDaoText" 代表注入普通属性。

3.8 Bean的依赖注入的数据类型

依赖注入的数据可以是如下三种类型

  • 普通数据类型
  • 引用数据类型
  • 集合数据类型

先在 daoImpl 中声明私有变量,普通数据类型注入,通过 value 属性注入,集合通过相应的标签注入,具体参见代码:

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
                  <!-- value 标签代表list内部是普通属性,ref 标签代表里面是引用 -->
        </list>
    </property>
    <property name="userMap">
        <map>
            <entry key="user1" value-ref="user1"/>
            <entry key="user2" value-ref="user2"/>
        </map>
    </property>
    <property name="properties">
        <props>
            <prop key="p1">ppp1</prop>
            <prop key="p2">ppp2</prop>
            <prop key="p3">ppp3</prop>
        </props>
    </property>
</bean>
<!-- 普通属性用 value -->
<bean id="user1" class="com.itheima.domain.User">
    <property name="name" value="tom"/>
    <property name="addr" value="beijing"/>
</bean>
<bean id="user2" class="com.itheima.domain.User">
    <property name="name" value="lucy"/>
    <property name="addr" value="tianjin"/>
</bean>

引入其他配置文件(分模块开发)

实际开发中,Spring 的配置内容非常多,这就导致 Spring 配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在 Spring 主配置文件通过 import 标签进行加载。可以按照业务模块来拆解,一个服务一个 xml,或者一个模块一个 xml。

<import resource="applicationContext-xxx.xml"/>