【Spring】03 XML配置
Alias别名设置
可以为一个Bean的ID再设置一个ID
多一个可用标识,大概...

在获取实例注入参数时,两个标识都可以使用

除了Alias可以设置别名之外,Bean的标签本身也可以设置第二别名

name属性还可以设置多个别名,使用的分隔符没有限制

所以目前得出的结论是,别名标签是早期Spring设计出的一个功能,
但是在后面的版本被其他更强大的功能替代了,
所以放在现在看来,别名标签的用途似乎非常鸡肋
Import 多容器合并导入
在快速入门的测试类中,Spring官方给出的是一个多容器文件注入
其实多个容器文件可以使用此标签合并至一个容器中统一处理
实际的开发用途可以表现在多人协作开发中

依赖注入 Dependency Injection
依赖 即:对象的创建依赖于Spring容器实现
注入 即:对象的属性由Spring容器注入
三种方式:
构造器注入
Setter方法注入
拓展方式注入
构造器注入
1、调用带参构造器注入值,name表示按参数的标识符注入

2、也可以按参数列表的形式,直接取参数的索引位置注入

3、根据参数的类型注入,如果定义多个同类型参数如何才能分辨呢?

4、根据引用来注入,此方式是引用Spring容器的其他Bean的ID
由于还未注册其他Bean,约束提示语法错误

Setter方法注入
设置一个新的实体类
package cn.dai.pojo; import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; /**
* @author ArkD42
* @file Spring
* @create 2020 - 05 - 04 - 19:38
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person { private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,Object> card;
private Set<String> game;
private String wife;
private Properties info;
}
里面基本包括了所有的数据类型
常用的数据类型
<property name="name" value="arkD42"/>
引用类型,被引用的类必须在Bean容器中注册才能被引用
<property name="address" ref="ads"/>
数组类型
<property name="books">
<array>
<value>编程思想 </value>
<value>高效的Java </value>
<value>Think in Java </value>
<value>C Prime Plus </value>
<value>TCP/IP Agreement</value>
</array>
</property>
List集合
<property name="hobbys">
<list>
<value>骑车</value>
<value>敲代码</value>
<value>学习</value>
</list>
</property>
Map集合
<property name="card">
<map>
<entry key="ID" value="336696219682038"/>
<entry key="BankID" value="3365v234xcv2324xrw2343"/>
</map>
</property>
空赋值
<property name="wife">
<!-- 空字符串 <property name="wife" value="" /> -->
<null/> <!-- <null></null> -->
</property>
Set集合
<property name="game">
<set>
<value>LOL</value>
<value>CSGO</value>
<value>COD</value>
</set>
</property>
配置类
<property name="info">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
拓展方式注入
需要约束支持
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
实体类
package cn.dai.pojo; import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; /**
* @author ArkD42
* @file Spring
* @create 2020 - 05 - 04 - 21:07
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String username;
private String password;
}
C命名【构造器命名注入】
可以使用C约束构造器参数注入
<bean id="user" class="cn.dai.pojo.User"
c:username="root" c:password="123456"/>
除了直接按参数标识符注入之外
构造器跟标签一样支持了
1、参数索引注入
2、引用类型注入【Bean注入】

P命名【字段命名注入】
可以使用P约束直接字段赋值注入
<bean id="user" class="cn.dai.pojo.User"
p:username="root" p:password="123456"/>
P属于Setter方法注入,不是参数列表
但是也有引用式的Bean注入

P & C就是字段和构造器的简写
Spring称这是一种更为快捷的注入方式,
但是如果是复杂类型的数据注入,最好还是以XML标签的形式配置
Bean的作用域 Scope
Singleton单例模式
当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,
并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,
不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
注意,Singleton作用域是Spring中的缺省作用域。
要在XML中将bean定义成singleton,可以这样配置:

Prototype 原型模式
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。
Prototype作用域的bean会导致在每次对该bean请求
(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)
时都会创建一个新的bean实例。
Prototype是原型类型,它在我们创建容器的时候并没有实例化,
而是当我们获取bean的时候才会去创建一个对象,
而且我们每次获取到的对象都不是同一个对象。
根据经验,对有状态的bean应该使用prototype作用域,
而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

1、Scope属性默认是单例的,每次获取的都是同一个对象
2、原型模式每次从容器获取的都是不同的对象
3、其余的Session、Request、Application、Socket都是在Web应用中使用
自动装配、自动匹配 AutoWired
Spring可以依靠这一特性给对象自动的匹配属性
这也是Bean依赖的一种方式
三种自动装配方式:
1、XML显示配置
2、Java显示配置
3、缺省配置
测试环境:
猫类 & 狗类 & 人类
public class Cat {
public void meow(){
System.out.println("喵喵喵???");
}
}
public class Dog {
public void bark(){
System.out.println("汪汪汪???");
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private Cat cat;
private Dog dog;
private String name;
}
bean容器
<?xml version="1.0" encoding="UTF-8"?>
<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="cat" class="cn.dai.pojo.Cat"/>
<bean id="dog" class="cn.dai.pojo.Dog"/> <bean id="person" class="cn.dai.pojo.Person">
<property name="name" value="ajj" />
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
</beans>
测试
public class AutoWiredTest {
@Test
public void awt(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Person person = applicationContext.getBean("person", Person.class);
System.out.println(person);
}
}
现在我们删掉对猫和狗类型的字段注入
尝试我们的自动装配来实现
<?xml version="1.0" encoding="UTF-8"?>
<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="cat" class="cn.dai.pojo.Cat"/>
<bean id="dog" class="cn.dai.pojo.Dog"/> <bean id="person" class="cn.dai.pojo.Person" autowire="byName">
<property name="name" value="ajj" />
</bean> </beans>
autowire="byName" 根据Bean的ID或者其别名进行自动装配
标识符能在容器中被查找到,匹配了和Person类的setter方法所注入的参数标识

将狗类的ID故意写错,Spring容器将无法识别到

autowire="byType" 根据类型自动查找,即是名称写错也会进行匹配
并正确的注入

但是ByType的问题就是,容器中不可以存在多个相同类型的Bean,
这对ByType来说造成了歧义
总而言之:
ByName 按Bean的标识 + 别名 进行匹配,
必须和setter方法的参数标识一样,但是Bean可以设置多个
ByType 按Bean的类型 匹配
必须保证容器的Bean是唯一的
【Spring】03 XML配置的更多相关文章
- spring的xml配置声明以及相应的问题处理
spring的xml配置声明: xml配置声明 Code 问题处理 问题1 xml报错: cvc-elt.1: Cannot find the declaration of element 'bea ...
- spring+mybaits xml配置解析----转
一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...
- spring中用xml配置构造注入的心得
spring中用xml配置构造注入时,如果 <constructor-arg> 属性都是 ref ,则不用理会参数顺序 <constructor-arg ref="kill ...
- Spring 中 Xml配置文件属性的说明
Xml配置文件属性的说明: <bean id="TheAction" ⑴ class="net.xiaxin.spring.qs.UpperAction" ...
- Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因
1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...
- Spring 基于XML配置
基于XML的配置 对于基于XML的配置,Spring 1.0的配置文件采用DTD格式,Spring2.0以后采用Schema格式,后者让不同类型的配罝拥有了自己的命名空间,使得配置文件更具扩展性.此外 ...
- spring ioc xml配置
一个完整的spring xml配置:是把action,service,dao以及其它的资源性配置(如basedao)和公共性配置(如连接数据库)配置在resource.xml中,这样就有四个xml配置 ...
- spring 5.x 系列第3篇 —— spring AOP (xml配置方式)
文章目录 一.说明 1.1 项目结构说明 1.2 依赖说明 二.spring aop 2.1 创建待切入接口及其实现类 2.2 创建自定义切面类 2.3 配置切面 2.4 测试切面 附: 关于切面表达 ...
- spring利用xml配置定时任务
在开发中会经常遇到做定时任务的需求,例如日志定时清理与处理,数据信息定时同步等需求. 1.在spring中利用xml配置定时任务,如下 <!-- ftpiptv信息同步接口定时任务配置--> ...
- Spring 基于xml配置方式的AOP
我们具体用代码来说明: 1.ArithmeticCalculator.java package com.proc; public interface ArithmeticCalculator { in ...
随机推荐
- (数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用
本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,经过六年多的 ...
- 数据库系列16:MyISAM与InnoDB的索引对比
相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩 ...
- journalctl 命令使用总结
转载请注明出处: journalctl 命令是 Linux 系统中一个用于查询和管理系统日志的命令行工具,它基于 systemd 的日志守护进程 systemd-journald 的功能. 1. 介绍 ...
- mysql8 windows 数据库名 表名 大小写
由于Apollo的SQL 脚本是大小写的.mysql8 默认又是纯小写的. 解决方法: 方法1.卸载MYSQL,重新安装MYSQL时,高级选项中指定区分大写小.这种会清空所有库和数据.不建议. 方法2 ...
- C#.NET Winform使用线程承载WCF (硬编码配置)
winform同步承载WCF时,遇到大量请求,可能会阻塞UI线程.这时就需要开个线程来承载WCF. 1.硬编码形式创建WCF服务,WCFServer类: using CommonUtils; usin ...
- 5 分钟小工具:使用 dive 分析 docker 镜像
需求 拿到一个镜像之后,我想知道: 分层查看镜像里都有哪些文件 各层使用了什么命令构建的这个镜像 镜像里比较大的文件有哪些(可能需要优化) dive 工具介绍 dive 工具可以做这些分析.dive ...
- Javascript高级程序设计第四章 | ch4 | 阅读笔记
变量.作用域与内存 原始值与引用值 什么是字面量形式? let obj = { key1: val1, key2: val2, foo () { } } 这就是字面量形式,手动声明一个对象的属性和方法 ...
- 如何应用 matrix3d 映射变幻
如何应用 matrix3d 映射变幻 先上 demo 记得是在 2015 看到过的一个 html5 演示效果, 很惊艳 当时没明白如何实现,现在我会了,做一个类似的: 又弄了一个拖动的 demo 我数 ...
- Linux多网卡的bond模式原理
Linux多网卡绑定 网卡绑定mode共有7种: bond0,bond1,bond2,bond3,bond4,bond5,bond6,bond7 常用的有三种: mode=0: 平衡负载模式, ...
- xshell+ssh+网络+加密
使用xshell+ssh用于管理linux服务器,大概是目前最为流行的方式. 这个工具和技术涉及到: 计算机网络 加密解密 虽然不是专门的系统工程师,但还是相对频繁使用这套工具,有时候难免遇到一些不知 ...