Spring - 03配置文件
(1)Bean标签
(1.1)Bean标签基本配置
用于配置交由Spring来创建的对象。默认情况下,它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
id: Bean实例在Spring容器中的唯一标识
class: Bean的全限定名称
(1.2)Bean标签范围配置
scope:指对象的作用范围,取值如下:
| 取值范围 | 说明 |
|
singleton
|
默认值,单例的
|
|
prototype
|
多例的
|
|
request
|
WEB项目中,Spring创建一个Bean对象,将对象存入到request域中
|
|
session
|
WEB项目中,Spring创建一个Bean对象,将对象存入到session域中
|
|
global session
|
WEB项目中,应用在Portlet环境,如果没有Portlet环境,那么 globalSession相当于session
|
(1.3)测试singleton
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="singleton"></bean>
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDaoImpl 创建了......");
}
public void save() {
System.out.println("UserDao Save 执行了.....");
}
}
// main 方法
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
UserDaoImpl 创建了......
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5e3a8624
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5e3a8624
(1.4)测试prototype
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="prototype"></bean>
UserDaoImpl 创建了......
UserDaoImpl 创建了......
com.bearpx.sp01basic.dao.impl.UserDaoImpl@27efef64
com.bearpx.sp01basic.dao.impl.UserDaoImpl@6f7fd0e6
(1.5)总结
当scope取值为singleton时,Bean只有一个,当Spring核心文件被加载时,创建容器时,实例化配置的Bean。应用卸载,销毁容器时,对象被销毁。
当scope取值为prototype时,Bean有多个,当调用getBean()方法时实例化Bean。 当对象长时间不用时,被Java垃圾回收器回收。
(2)Bean生命周期配置
init-method: 指定类中的初始化方法名称
destroy-method:指定类中的销毁方法名称
public void initUserDao(){ System.out.println("UserDaoImpl初始化方法......"); } public void destoryUserDao(){ System.out.println("UserDaoImpl销毁方法......"); }
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" init-method="initUserDao" destroy-method="destoryUserDao"></bean>
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) app.getBean("userDao"); System.out.println(userDao); ((ClassPathXmlApplicationContext) app).close();
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
UserDaoImpl 创建了......
UserDaoImpl初始化方法......
十一月 05, 2020 8:56:34 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Thu Nov 05 20:56:34 CST 2020]; root of context hierarchy
com.bearpx.sp01basic.dao.impl.UserDaoImpl@5c3bd550
UserDaoImpl销毁方法......
(3)Bean实例化的三种方式
- 无参构造方法实例化
- 工厂静态方法实例化
- 工厂实例方法实例化
(3.1)无参构造方法
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl" scope="prototype"></bean>
(3.2)工厂静态方法
public class StaticFactory { public static UserDao getUserDao(){ return new UserDaoImpl(); } }
<bean id="userDao" class="com.bearpx.sp01basic.factory.StaticFactory" factory-method="getUserDao"></bean>
(3.3)工厂实例方法
public class DynamicFactory { public UserDao getUserDao(){ return new UserDaoImpl(); } }
<bean id="factory" class="com.bearpx.sp01basic.factory.DynamicFactory"></bean> <bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>
(4)依赖注入
(4.1)依赖注入分析
目前UserService实例和UserDao实例都存在于Spring容器中,当前的做法是在容器外部获取UserService实例和UserDao实例,然后在程序中结合。
getBean(name:"userService")获取UserService实例,发现UserService实例内部需要UserDao实例的save方法,所以在UserService内部获得UserDao实例
getBean(name:"userDao")相当于在Spring容器外将Dao组装到Service内部完成的操作。
(4.2)Bean依赖注入概念
依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。
IOC解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。业务层和持久层的依赖关系,在使用Spring后,由Spring维护了。
坐等框架把持久层对象传入业务层,而不用我们自己去获取。
(4.3)Bean的依赖注入方式
- 构造方法
- set方法
p命名空间注入本质也是set方法注入,比较方便,加入 xmlns:p="http://www.springframework.org/schema/p",修改注入方式
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){ // setter方法设置属性
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao){ // 构造器
this.userDao = userDao;
}
// public void setUserDao(UserDao userDao){
// this.userDao = userDao;
// }
public void save() {
userDao.save();
}
}
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.bearpx.sp01basic.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
(5)Bean的依赖注入的数据类型
上面都是注入的引用Bean, 除了对象的引用可以注入,普通数据类型、集合等都可以在容器中进行注入。
注入数据的三种数据类型:
- 普通数据类型
- 引用数据类型
- 集合数据类型
(5.1)普通数据类型
public class UserDaoImpl implements UserDao { private String userName; private int age; public void setUserName(String userName){ this.userName = userName; } public void setAge(int age){ this.age = age; } public void save() { System.out.println(userName + "======" + age); System.out.println("UserDao Save 执行了....."); } }
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"> <property name="userName" value="wukong"/> <property name="age" value="590"/> </bean>
输出:
wukong======590
UserDao Save 执行了.....
(5.2)集合数据类型
package com.bearpx.sp01basic.domain; public class User { private String name; private String addr; // 省略 getter 和 setter 方法 }
public class UserDaoImpl implements UserDao { private List<String> strList; private Map<String, User> userMap; private Properties properties; // 省略 getter 和 setter 方法 public void save() { System.out.println(strList); System.out.println(userMap); System.out.println(properties); System.out.println("UserDao Save 执行了....."); } }
注入List
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"> <property name="strList"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> </bean>
[aaa, bbb, ccc]
注入Map
<bean id="user1" class="com.bearpx.sp01basic.domain.User"> <property name="name" value="sunwukong"/> <property name="addr" value="huaguoshan"/> </bean> <bean id="user2" class="com.bearpx.sp01basic.domain.User"> <property name="name" value="zhubajie"/> <property name="addr" value="gaolaoguang"/> </bean>
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"> <property name="userMap"> <map> <entry key="u1" value-ref="user1"/> <entry key="u2" value-ref="user2"/> </map> </property> </bean>
{u1=User{name='sunwukong', addr='huaguoshan'}, u2=User{name='zhubajie', addr='gaolaoguang'}}
注入Properties
<bean id="userDao" class="com.bearpx.sp01basic.dao.impl.UserDaoImpl"> <property name="properties"> <props> <prop key="p1">ppp1</prop> <prop key="p2">ppp2</prop> <prop key="p3">ppp3</prop> </props> </property> </bean>
{p3=ppp3, p2=ppp2, p1=ppp1}
(6)引入其他配置文件
实际开发中,Spring的配置内容非常多,导致Spring配置很繁杂且体积很大,可以将部分配置拆解到其他配置文件中,主配置文件通过import标签进行加载。
<import resource="applicationContext-user.xml"></import>
applicationContext-user.xml配置文件:

浙公网安备 33010602011771号