首页 > 其他分享 >基于xml的Spring配置一(SpringBean 的配置详解)

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

时间:2022-12-07 10:31:07浏览次数:40  
标签:xml UserDaoImpl userDao Spring SpringBean Bean 实例 标签 public

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>


标签:xml,UserDaoImpl,userDao,Spring,SpringBean,Bean,实例,标签,public
From: https://blog.51cto.com/u_15227402/5917917

相关文章

  • 如何使用JPA实现Spring 授权服务器的核心服务
    本指南展示了如何使用JPA实现Spring授权服务器​的核心服务。本指南的目的是提供自己实现这些服务的起点,以便您可以根据需要进行修改。定义数据模型创建JPA实体创建Spr......
  • 十四、Docker入门系列--Docker搭建部署SpringCloud微服务项目Demo
    十四、Docker入门系列--Docker搭建部署SpringCloud微服务项目Demo系列文章地址:一、Docker入门系列--Docker简介二、Docker入门系列--Docker安装三、Docker入门系列--D......
  • SpringCloud该如何入门及相关组件介绍
    前言什么是微服务?什么是SpringCloud?那SpringBoot与SpringCloud的区别又是什么?这几个问题是java开发工程师从SpringBoot向SpringCloud升级的一定回有的疑惑。......
  • 使用Spring Cloud Stream 驱动 RabbitMQ 代码示例
    1、SpringCloudStream官方文档官方配置文档参考:SpringCloudStreamReferenceDocumentationSpringCloudStreamRabbitMQBinderReferenceGuide说明:在网上查......
  • Spring Cloud - Feign
    JAVA项目中如何实现接口调用?1)HttpclientHttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包,并且它......
  • SpringCloud-负载均衡和通信(Ribbon、Feign)
    1.Ribbon:负载均衡(基于客户端)1.1负载均衡以及RibbonRibbon是什么?SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是......
  • SpringCloud-Eureka服务注册中心
    1什么是EurekaNetflix在涉及Eureka时,遵循的就是API原则.Eureka是Netflix的有个子模块,也是核心模块之一。Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发......
  • SpringCloud-入门
    1、学习前言1.2文章大纲SpringCloud五大组件服务注册与发现——NetflixEureka负载均衡:客户端负载均衡——NetflixRibbon服务端负载均衡:——Feign(其也是依......
  • SpringBoot构建RESTful风格应用
    SpringBoot构建RESTful风格应用1.Web开发的两种模式:前后端不分离:以前没有移动互联网时,我们做的大部分应用都是前后端不分的,比如jsp,或者thymeleaf等后端分离模板,在这种架......
  • SpringMVC —— 响应
    响应页面  响应文本数据  响应json数据  响应json集合数据  注解    转换json时使用了类型转换器     ......