spring的第二天

ssm框架 spring 

在昨天简单的介绍了一下spring,那么今天接着继续介绍。

  • spring值的注入
  • 自动装配【autowire】
  • 引用资源
  • applicationContext和beanFactory的关系

spring的值的注入

在spring的第一天里面我介绍了spring基本类型值的注入以及引用类型值的注入,那么这次我们讨论数组listmap值的注入问题

首先有一个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:

    1. 那么byTypebyName有什么区别呢?
      byType对于名字没有要求,在上面的代码中,即使id为teacher1,也可以成功导入,而byName却不行。
    2. 如果有多个相同类型的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。

  1. 提供了支持国际化的文本消息
  2. 统一的资源文件读取方式
  3. 已在监听器中注册的bean的事件

区别:

  1. 使用BeanFactory的时候,不会预处理Bean,所以及时正确的创建了BeanFactory实例,在getBean的时候仍任可能报错抛出异常。而在applicationContext中,会默认初始化所有的Bean,所以在前期applicationContext会有较大的开销,但是获取完后却能得到较好的性能。当然也可以使用lazy-init,阻止该bean的初始化。
  2. BeanFactory需要手动注册,而ApplicationContext是自动注册的。

spring的第二天的更多相关文章

  1. Spring框架第二天

    ## Spring框架第二天 ## ---------- **课程回顾:Spring框架第一天** 1. 概述 * IOC和AOP 2. 框架的IOC的入门 * 创建applicationContex ...

  2. #Spring实战第二章学习笔记————装配Bean

    Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...

  3. Spring Cloud第二篇 | 使用并认识Eureka注册中心

    ​ 本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 ​​ 一.Sprin ...

  4. spring实战第二章小记-装配bean

    时间:2020/02/06 一.思想 1.创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质. 对于上面这句话的个人理解:当我们在new一个对象时如果传入了别的对象作为参数(这个 ...

  5. 学习spring的第二天

    对昨天的查漏:关于<bean>标签的scope属性,是由它决定原型和单例的,而不是说你java代码中用到了单例模式就是单例了. 其二就是lazy-init属性,它对于scope=" ...

  6. 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】

    一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student& ...

  7. spring mvc 第二天【注解实现springmvc Handler处理ajax简单请求 的配置】

    这里使用的是在前台发起ajax请求Handler,后台伪造数据响应给前台, 配置对应ajax请求的Handler信息如下 @Controller public class MyController { ...

  8. 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)

    本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1  ...

  9. 《玩转Spring》第二章 BeanPostProcessor扩展

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shan9liang/article/details/34421141 上一章.介绍了怎样扩展spri ...

随机推荐

  1. DB2 键约束操作

    DB2 键约束操作 今天遇到一个问题,想要删掉一个表中的某列的唯一约束,google了一下,搜出来许许多多,找到能用的,记下来总结如下. 命令如下 select constname, tabname, ...

  2. solr7.7.0搜索引擎使用(三)(添加文件索引)

    众所周知,solr与es的最大区别是,solr可以对pdf,txt,doc等文件生成索引 那我们如何添加文件索引呢? 步骤1.添加core,取名暂且为 coreFile 在bin下执行命令 ./sol ...

  3. 归并排序(递归排序and外排排序)

    分析: /** * 归并排序 (先将数组利用归并排序排成 有序的左边数组和右边数组,再比较左边数组和右边数组的数值大小进行排序) * */ public class MergeSort { publi ...

  4. strftime使用%F格式化日期失败

    报错:invalid format directive 解决:把%F换成%Y-%m-%d

  5. vue使用矢量图

    1.在阿里巴巴矢量图标下载下来 2.放到static下 3.main.js下 import '../static/iconfont/iconfont.css' 4.调用<i class=&quo ...

  6. 关于ASP.NET MVC 中JsonResult返回的日期值问题

    最近开始用MVC做项目,在使用 JsonResult返回数据的时候,日期被反射成了/Date 1233455这种格式,遍查网上都是在客户端使用JS来处理这个问题的,这样的话,就需要在每一个涉及到日期的 ...

  7. Python自动化编程-树莓派GPIO编程(二)

    树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...

  8. python 使用进程池Pool进行并发编程

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...

  9. weblogic安装及配置

    WebLogic是用于开发.集成.部署和管理大型分布式Web应用.网络应用和数据库应用的Java应用服务器. 1.安装Weblogic:(1)点击Next按钮:(2) 选择Custom后点击Next按 ...

  10. maven配置多仓库的方法

    刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的 ...