Spring开发中主要是对Bean的配置,Bean的常用配置一览如下:
Xml配置方式 | 功能描述 |
<bean id="" class=""> | Bean的id和全限定名配置 |
<bean name=""> | 通过name设置Bean的别名,通过别名也能直接获取到Bean实例 |
<bean scope=""> | Bean的作用范围,BeanFactory作为容器时取值singleton和prototype |
<bean lazy-init=""> | Bean的实例化时机,是否延迟加载。BeanFactory作为容器时无敌 |
<bean init-method=""> | Bean实例化后自动执行的初始化方法,method指定方法名 |
<bean autowire="byType"> | 设置自动注入模式,常用的有按照类型byType,按照名字 byName |
<bean factory-bean="" factory-method=""/> | 指定哪个工厂Bean的哪个方法完成Bean的创建 |
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");//延迟加载时下一行创建
UserService userService = (UserService)applicationContext.getBean("userService");
System.out.println(userService);
}
1)Bean的基础配置
例如:配置UserDaoImpl由Spring容器负责管理
<bean id="userDao" class="com.mink.dao.impl.UserDaoImpl"/>
此时存储到Spring容器(singleObjects单例池)中的Bean的beanName时userDao(内部将beanId转换设置为beanName),值时UserDaoImpl对象,可以根据beanName获取Bean实例
applicationContext.getBean("userDao");
如果不设置id,则Spring会把当前Bean实例的权限名作为beanName
applicationContext.getBean("com.mink.dao.impl.UserDaoImpl");
2)Bean的别名配置
<bean id="userDao" name="aaa,bbb,ccc" class="com.mink.dao.impl.UserDaoImpl"/>
可以通过别名获取Bean,如果没有配置id,别名的第一个为BeanName
3)bean的范围配置
默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototype
- singleton : 单例,默认值,Spring容器创建的时候,就会进行Bean的实例化,并存储到容器内部的单例池中,每次getBean时,都是从单例池中获取相同的Bean的实例;
- prototype :原型,Spring容器初始化时不会创建Bean实例,当调用getBean时才会实例化Bean,每次getBean都会创建一个新的Bean实例。
- request
- session
4)bean的延迟加载
lazy-init="true" 为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时再创建Bean实例并存储到单例池中去,后续再使用该Bean直接从单例池获取,本质上该Bean还是单例的,只对Application有效
<bean id="userDao" name="aaa,bbb,ccc" class="com.mink.dao.impl.UserDaoImpl" lazy-init="true"/>
5)bean的初始化方法和销毁方法配置
Bean在被实例化后,可以执行指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作,初始化方法名称和销毁方法名称通过
<bean id="userDao" class="com.mink.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"/>
public class UserDaoImpl implments UserDao(){
public UserDaoImpl() {
System.out.println("UserDaoImpl创建了(构造方法)。。。");
}
public void init(){
System.out.println("UserDaoImpl初始化方法。。。");
}
public void destroy(){
System.out.println("UserDaoImpl销毁方法。。。");
}
}
扩展:除此之外,我们还可以通过实现 InitializingBean 接口,完成一些Bean的初始化操作。
public class UserServiceImpl implements UserService, InitializingBean {
public UserServiceImpl(){
System.out.println("UserServiceImpl实例化");
}
private UserDao userDao;
public void setUserDao(UserDaoImpl userDao) {
System.out.println("mink DI,属性设置完毕。。。");
this.userDao = userDao;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet执行。。。");
}
}
6)Bean 的实例化配置(重点)
spring的实例化方式主要有如下两种:
- 构造方式实例化:底层通过构造方法对Bean进行实例化
- 工厂方式实例化:底层通过调用自定义的工厂发方法对Bean进行实例化 ,又分为三种
- 静态工厂方法实例化Bean
public class MyBeanFactory1 {
// 下方的xml文件 factory-method 对应
public static UserDao userDao() {
// bean 创建之前可以进行一些其他的业务操作
return new UserDaoImpl();
}
}
<bean id="userDao1" class="com.mink.factory.MyBeanFactory1" factory-method="userDao"></bean>
- 实例工厂方法实例化Bean(非静态)
public class MyBeanFactory2 {
public UserDao userDao() {
return new UserDaoImpl();
}
}
<!-- 先配置工厂对象-->
<bean id="myBeanFactory2" class="com.mink.factory.MyBeanFactory2"></bean>
<bean id="userDao2" factory-bean="myBeanFactory2" factory-method="userDao"></bean>
public class MyBeanFactory1 {
// 含参
public static UserDao userDao(String name, int age) {
return new UserDaoImpl();
}
}
<bean id="userDao1" class="com.mink.factory.MyBeanFactory1" factory-method="userDao">
<constructor-arg name="name" value="mink"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
- 实现FactoryBean规范延迟实例化Bean(用的时候再创建,放到单例池)
public class MyBeanFactory3 implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return null;
}
}
7)Bean的一些注入配置
bean的依赖注入的两种方式:
注入方式 | 配置方式 |
通过bean的set方法注入 | <property name="userDao" ref="userDao"/><property name="userDao" calue="haohao"/> |
通过构造Bean的方法进行注入 | <constructor-arg name="name" ref="userDao"/><constructor-arg name="name" value="userDao"/> |
ref 对象引用,value普通引用。
依赖输入的数据类型有如下三种:
- 普通数据类型,例如:String,int,boolean等,通过value属性指定。
- 引用数据类型,例如:UserDaoImpl、DataSource等,通过ref属性指定。
- 集合数据类型,例如:List,Map,Properties等。
// 注入List
private List<String> stringList;
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
<bean id="userService" class="com.mink.service.Impl.UserServiceImpl">
<property name="stringList">
<list>
<value>qqq</value>
<value>www</value>
<value>eee</value>
</list>
</property>
</bean>
// 注入map
private Map<String,UserDao> map;
public void setMap(Map<String, UserDao> map) {
this.map = map;
}
<property name="map">
<map>
<entry key="mink" value-ref="userDao1"></entry>
</map>
</property>
扩展:自动装配方式
如果被注入的属性类型是Bean引用的话,那么可以在<bean> 标签中使用 autowire 属性去配置自动注入方式,属性值有两个:
- byName:通过属性名自动装配,即去匹配 setXxx 与 id="xxx"(name="xxx")是否一致;
- byType:通过Bean的类型从容器中匹配,匹配出多个相同Bean类型时,报错。
<bean id="userService" class="com.mink.service.Impl.UserServiceImpl" autowire="byType"></bean>
<bean id="userDao" class="com.mink.dao.impl.UserDaoImpl"></bean>
private UserDao userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
8)Spring的其他配置标签
大体分为两类,一种是默认标签,一种是自定义标签
- 默认标签:就是不用额外导入其他命名空间约束的标签,例如 <bean> 标签
标签 | 作用 |
<beans> | 一般作为xml配置根标签,其他标签都是该标签的子标签 |
<bean> | Bean的配置标签 |
<import> | 外部资源导入标签 |
<alias> | 指定Bean的别名标签,使用较少 |
<beans> 标签,除了经常用的作为哦根标签外,还可以嵌套在根标签内,使用 profile 属性切换开发环境
<!-- 配置测试环境下,需要加载的Bean实例 -->
<beans profile="test">
</beans>
<!-- 配置开发环境下,需要加载的Bean实例 -->
<beans profile="dev">
</beans>
可以使用以下两种方式指定被激活的环境:
- 使用命令行动态参数,虚拟机参数位置加载 -Dspring.profiles.active=test
- 使用代码的方式设置环境变量 System.setProperty("spring.profiles.active","test")
- 自定义标签:就是需要额外引入其他命名空间约束,并通过前缀引用的标签,例如 context:peoperty-placeholder/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder></context:property-placeholder>