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 实例化的三种方式:
- 无参构造方法实例化(默认)
- 工厂静态方法实例化
- 工厂实例方法实例化
工厂静态方法实例化
配置工厂静态方法实例化,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"/>