spring的第二天
spring的第二天
在昨天简单的介绍了一下spring,那么今天接着继续介绍。
- spring值的注入
- 自动装配【autowire】
- 引用资源
- applicationContext和beanFactory的关系
spring的值的注入
在spring的第一天里面我介绍了spring基本类型值的注入以及引用类型值的注入,那么这次我们讨论数组,list,map值的注入问题
首先有一个Person类
package com.weno.bean;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然后有一个Persons的类
package com.weno.bean;
import java.util.List;
public class Persons {
private List<Person> personList;
public List<Person> getPersonList() {
return personList;
}
public void setPersonList(List<Person> personList) {
this.personList = personList;
}
@Override
public String toString() {
return "Persons{" +
"personList=" + personList +
'}';
}
}
lsit
在xml文件中
<bean id="persons" class="com.weno.bean.Persons">
<property name="personList">
<list>
<!-- 使用外部bean则为<ref bean="***"/>-->
<bean class="com.weno.bean.Person">
<property name="name" value="张三"/>
<property name="age" value="14"/>
</bean>
<bean class="com.weno.bean.Person">
<property name="name" value="李四"/>
<property name="age" value="18"/>
</bean>
</list>
</property>
</bean>
数组
注入数组元素和注入
list元素是一样的,都是使用<list>标签,就不介绍了。set
<bean id="persons" class="com.weno.bean.Persons">
<property name="personSet">
<set>
<bean class="com.weno.bean.Person">
<property name="name" value="张三"/>
<property name="age" value="14"/>
</bean>
<bean class="com.weno.bean.Person">
<property name="name" value="李四"/>
<property name="age" value="18"/>
</bean>
</set>
</property>
</bean>然后有个好神奇的现象,将<set> 标签换成<list>竟然也可以完美运行。

map
<bean class="com.weno.bean.Persons" id="persons">
<property name="map">
<map>
<!-- 使用外部bean <entry key="person1" value-ref="***"/> -->
<entry key="person1">
<bean class="com.weno.bean.Person">
<property name="name" value="张三"/>
<property name="age" value="14"/>
</bean>
</entry>
<entry key="person2">
<bean class="com.weno.bean.Person">
<property name="name" value="李四"/>
<property name="age" value="17"/>
</bean>
</entry>
</map>
</property>
</bean>
当然,在这集中集合中,我们既可以引用基本类型,也可以使用引用类型,在使用引用类型中,我们既可以使用外部bean的方式去使用,也可以使用内部Bean的方式去引用。
自动装配
spring的自动装配的默认值为no,也就是不进行自动装配
spring的自动装配分为:
- byType 按照数据类型注入
- byName 按照pojo对应的属性名字进行匹配
- byConstruct
- 优先按照类型进行注入,如果匹配到一个,就直接注入,如果不止一个,就按照名字注入,如果一个都找不到,则注入失败。
- default(默认值)
如果在上面的Person类里面再加上了一个Teacher。
定义Teacher的类:
public class Teacher {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
'}';
}
byName
<bean id="person" class="com.weno.bean.Person" autowire="byName">
<!-- 通过名字自动装配 -->
<property name="name" value="王五"/>
<property name="age" value="18"/>
</bean> <bean id="teacher" class="com.weno.bean.Teacher">
<property name="name" value="老师"/>
</bean>
如果这时候将结果进行输出会怎样?
Person{name='王五', age=18, teacher=Teacher{name='老师'}}
在这里自动的将treacher装配进来了。这个是根据名字进行自动加载的,接下来看看
byType.byType
<bean id="person" class="com.weno.bean.Person" autowire="byType">
<!-- 通过类型进行导入 -->
<property name="name" value="王五"/>
<property name="age" value="18"/>
</bean> <bean id="teacher1" class="com.weno.bean.Teacher">
<property name="name" value="老师"/>
</bean>
Question:
- 那么
byType和byName有什么区别呢?
byType对于名字没有要求,在上面的代码中,即使id为teacher1,也可以成功导入,而byName却不行。 - 如果有多个相同类型的bean会怎么导入,怎么控制导入?
如果有多个相同的bean,byType导入会报错。Unsatisfied dependency expressed through bean property 'teacher': No qualifying bean of type [com.weno.bean.Teacher] is defined: expected single matching bean but found 2:
解决方法,使用primary设置优先级即可,将其中一个设置为主bean。
<bean id="teacher1" class="com.weno.bean.Teacher" primary="true">
<!-- primary默认是false,但是好像在某些版本默认是false -->
<property name="name" value="大老师"/>
</bean>
<bean id="Teacher" class="com.weno.bean.Teacher">
<property name="name" value="小老师"/>
</bean>
这时候就可以看到结果了
Person{name='王五', age=18, teacher=Teacher{name='大老师'}}
- 那么
byConstruct
与byType的方式类似,不同之处在于它应用于
构造器参数。优先按照类型进行注入,如果匹配到一个,就直接注入,如果不止一个,就按照名字注入,如果一个都找不到,则注入失败。在person类中加入构造方法
public Person(Teacher teacher) {
this.teacher = teacher;
} // 注意,这个也要保留
public Person() {
}
<bean id="person" class="com.weno.bean.Person" autowire="constructor">
<property name="name" value="王五"/>
<property name="age" value="18"/>
</bean> <bean id="teacher" class="com.weno.bean.Teacher">
<property name="name" value="大老师"/>
</bean> <bean id="teacher2" class="com.weno.bean.Teacher">
<property name="name" value="小老师"/>
</bean>
在这两个中,按照第一个会装配,而第二个不会装配。【ps:当匹配到多个时,优先按照名字装配,如ru果有多个,名字又不匹配,就报错】
引入资源
引入其他xml文件
试想一下,如果我们将所有的配置全部写在一个文件中,那么该多么庞杂,且不利于项目合作,这时候我们就可以使用一个主文件,目的是来导入其他文件。<!--导入其他-->
<import resource="classpath:personConfig.xml"/>
如果我们需要导入很多xml文件怎么办,这时候我们可以使用通配符
*来导入
假如在一个manager.xml文件中引入资源spring-person,spring-test,这时,我们可以这样做:<!-- 注意,使用通配符时,不要将总文件包含!
如果在这里将manager.xml命名为spring-manager.xml,
那么就会报错
-->
<import resource="spring-*.xml"/>
applicationContext和beanFactory的关系
BeanFactory是Spring容器最基本的接口,负责读取bean的配置文件,管理bean的加载和实例化。
而Application是BeanFactory的子接口,对BeanFactory进行了扩展,比如AOP,Web。
- 提供了支持国际化的文本消息
- 统一的资源文件读取方式
- 已在监听器中注册的bean的事件
区别:
- 使用BeanFactory的时候,不会预处理Bean,所以及时正确的创建了BeanFactory实例,在getBean的时候仍任可能报错抛出异常。而在applicationContext中,会默认初始化所有的Bean,所以在前期applicationContext会有较大的开销,但是获取完后却能得到较好的性能。当然也可以使用
lazy-init,阻止该bean的初始化。 - BeanFactory需要手动注册,而ApplicationContext是自动注册的。
spring的第二天的更多相关文章
- Spring框架第二天
## Spring框架第二天 ## ---------- **课程回顾:Spring框架第一天** 1. 概述 * IOC和AOP 2. 框架的IOC的入门 * 创建applicationContex ...
- #Spring实战第二章学习笔记————装配Bean
Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...
- Spring Cloud第二篇 | 使用并认识Eureka注册中心
本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 一.Sprin ...
- spring实战第二章小记-装配bean
时间:2020/02/06 一.思想 1.创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质. 对于上面这句话的个人理解:当我们在new一个对象时如果传入了别的对象作为参数(这个 ...
- 学习spring的第二天
对昨天的查漏:关于<bean>标签的scope属性,是由它决定原型和单例的,而不是说你java代码中用到了单例模式就是单例了. 其二就是lazy-init属性,它对于scope=" ...
- 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】
一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student& ...
- spring mvc 第二天【注解实现springmvc Handler处理ajax简单请求 的配置】
这里使用的是在前台发起ajax请求Handler,后台伪造数据响应给前台, 配置对应ajax请求的Handler信息如下 @Controller public class MyController { ...
- 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)
本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1 ...
- 《玩转Spring》第二章 BeanPostProcessor扩展
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shan9liang/article/details/34421141 上一章.介绍了怎样扩展spri ...
随机推荐
- Eclipse中 *.properties 文件编码设置
Eclipse 中的默认编码格式为 ISO-8895-1,在此编码下中文的会显示如下的效果 解决方法 Windows --> Preference --> General Types -- ...
- 渗透测试的理论部分2——OSSTMM的详细描述
昨天休息了一天,今天我要连更两篇博客,作为补充,以下为正文 本章详细描述了OSSTMM内的RAV得分这一理论概念,对日后从事正规安全工作至关重要 OSSTMM为开源安全测试方法论,对OSSTMM不了解 ...
- MySQL缓存参数优化(转)
MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...
- 提取日志中出现的userId或其他信息
项目上线后经常出现需要统计用户数据.接口请求等.完美的情况下,在项目开始前就设计好哪些request.中间过程需要落地到db.或以一定格式存入专门的log中,但也常需要同学们临时去业务日志中grep ...
- [算法专题] 二分搜索&排序数组
基础知识 二分非递归写法: int binary_search(const int a[], const int size, const int val) { int lower = 0; int u ...
- ie8兼容视频播放的探索(探索过程稍微有点长,时间紧迫和耐心稍微差一点点的小伙伴直接往下拉)
需求: 前几天接到一个需求,需要在网页中嵌入视频,并且要兼容ie8:然后我就开始了如下的探索...... 探索过程: 我先思考有什么方法可以在网页中嵌入视频,然后找到2种常用的方法——video标签和 ...
- kubernetes集群搭建(7):常见问题及处理
尤其在创建pod的时候,会遇见各类问题,请通过下列命令来查看错误详情 kubectl describe pod xxxxxx 1.问题现象:镜像始终获取不下来 解决办法:为docker设置镜像源 [r ...
- 机器学习技法笔记:04 Soft-Margin Support Vector Machine
Roadmap Motivation and Primal Problem Dual Problem Messages behind Soft-Margin SVM Model Selection S ...
- JavaScript 全屏展示
浏览器都有页面全屏的功能 F11 ,那么如何用JavaScript控制页面全屏呢?MDN上提供的的API , 一个小demo验证一下! <!DOCTYPE html> <html l ...
- 【sping揭秘】17、@Around,@Introduction
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...
