基于xml的Spring配置一(SpringBean 的配置详解)

时间:2022-12-07 13:58:03

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  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 与 (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>