Spring概念和Bean管理(配置文件)

Easter79
• 阅读 598

Spring概念

1.spring是开源的轻量级框架(免费,依赖少,可以直接使用)

2.spring核心主要两部分:

  (1)aop:面向切面编程,扩展功能不是修改源代码实现

  (2)ioc:控制反转,

  -比如有个类,在类里面有个方法(不是静态方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创建类对象的过程,需要new 出来对象  

  -把对象的创建不是通过new方式实现,而是交给spring配置创建类对象

3.spring是一站式框架

  (1)spring在javaee三层结构中,每一层都提供不同的解决技术

  -web层:springMVC

  -service层:spring的ioc

  -dao层:spring的jdbcTemplate


Spring的ioc操作

1.把对象的创建交给spring进行管理

2.ioc的操作两部分:

  (1)ioc的配置文件方式【本篇的主要内容】

(2)ioc的注解方式【详细在下一篇福介绍】

3.IOC的底层原理

  1.ioc底层原理使用技术

    (1)xml配置文件

(2)dom4j解析xml

(3)工厂设计模式

(4)反射

2.画图分析ioc实现原理

(1)ioc技术之前存在的模式以及存在的缺陷

Spring概念和Bean管理(配置文件)

(2)ioc实现的原理

Spring概念和Bean管理(配置文件)

4.IOC入门案例

第一步 导入jar包

Spring概念和Bean管理(配置文件)

第二步 创建类,在类里面创建方法

Spring概念和Bean管理(配置文件)

第三步 创建spring配置文件,配置创建类

(1) Spring的核心配置文件名称和位置不是固定的

-建议放到src下面,官方建议applicationContext.xml

(2) 在xml中引入schema约束

Spring概念和Bean管理(配置文件)

(3)在以上beans元素内继续添加

Spring概念和Bean管理(配置文件)

注:id可以随便写,但是class的value即待创建类的路径信息一定要写对

第四步 写代码测试对象创建

(1)第四步只使用在测试-->新建一个测试类,在@Test的测试方法中以bean1.xml为例,先对其进行加载,然后用getBean(id)来获取得到这个待创建类的实例

Spring概念和Bean管理(配置文件)


spring的bean管理(xml配置文件)

1.1 Bean实例化的方式

      1. Bean的实例化是一种专业术语,即在spring里面通过xml配置文件创建对象

      2. bean实例化三种方式实现

        2.1  使用类的无参构造创建(重点)--参考ioc入门案例,

类里面没有无参数的构造时,将出现异常,比如入门案例中的第四步讲提示“No default constructor found”

        2.2  使用静态工厂创建

(1)工厂类中,创建了静态的方法,返回类对象,可以直接用类名.方法名来调用

其各个步骤类似与ioc入门案例,不同之处,在以下截图中有标注,主要体现在

1.创建了一个Bean2的工厂类,在其静态方法中返回待创建类的对象,

2.xml文件配置内容要进行修改:

Spring概念和Bean管理(配置文件)

        2.3 使用实例工厂创建

          (2)工厂类中,创建不是静态的方法,返回类对象。得用对象名.方法名来调用

          主要不同点体现在:

            1.工厂类中的创建目标类的方法是非静态方法

            2.xml中配置的修改,先生成工厂类。再根据工厂类生成待创建类,参考如下截图

      Spring概念和Bean管理(配置文件)

以上第一个bean中的id与第二个bean中的factory-bean是对应相等;

对于最后一个bean的实例化方式,在对应的入门案例的第四步中,直接用getbean(“bean3”)即可;

Bean的后两种实例化方法都可以用ioc的入门案例中第四步中的测试代码进行测试,一遍验证带创建类是否成功被创建;

1.2 Bean标签常用属性

         (1)id属性:

        -id属性值不能包含特殊符号

        -id属性可以任意命名

        -根据id值可以得到配置对象

      (2)class属性

        -创建对象所在类的全路径

      (3)name属性

        -功能和id属性值一样,但是name属性值可以包含特殊符号

      (4)scope属性

         -singleton :默认值,单例

        参考ioc入门案例,xml中没设置scope,即默认是singleton,如果在第四步测试代码中创建两个对象的话,前台输出可以看到是两个对象是同一个对象

        Spring概念和Bean管理(配置文件)

         -prototype:多例

         如果xml设置scope=prototype的话,那么上图的前台输出结果将会是两个不同的值,即创建了两个不同的实例对象

1.3 属性注入

    1. 属性注入的定义:创建对象的时候,向类里面的属性设置值得过程;

    2. 属性注入的方式介绍(三种)

    Spring概念和Bean管理(配置文件)

    3. 在spring框架里面,支持前两种方式

      3.1 如何使用有参数构造注入属性?

         第一步,先按照ioc入门案例,先创建类PropertyDemo1,并定义有参构造,

         第二步,在xml配置文件中进行如下设置:其中username为属性的名称,value为本次要赋的具体值

         第三步,可以使用ioc入门案例第四步的test对以上两步进行测试

    Spring概念和Bean管理(配置文件)

      3.2  如何使用set方法注入属性(重点)?

         第一步:创建如下类

      Spring概念和Bean管理(配置文件)

         第二步:设置xml文件配置:其中bookname为属性的名称,value为本次要赋的具体值

      Spring概念和Bean管理(配置文件)

1.4 注入对象类型属性(重点)

1.场景:以创建UserService类和Dao类为例,其中在UserService中得到UserDao对象

2.具体实现过程

2.1  在UserService里面把UserDao作为类型属性

2.2 生成dao类型属性的set方法

Spring概念和Bean管理(配置文件)

2.3 xml配置文件中的属性注入,ref值和dao类的id值保持一致

Spring概念和Bean管理(配置文件)

1.5 注入复杂类型属性

1.数组

2.List

3.Map

案例:

第一步创建person类,里面包含以上复杂类型的属性,并已定义set方法:

Spring概念和Bean管理(配置文件)

第二步:在xml文件中进行配置

Spring概念和Bean管理(配置文件)

  IOC和DI区别

(1)IOC:控制反转,把对象创建交给spring进行配置

(2)DI:依赖注入,向类里面的属性设置值(即以上Bean管理section中的1.3-1.5的属性注入)

(3)关系:依赖注入不能单独存在,需要在ioc基础上才能完成操作,比如以上的xml中的property标签包含在bean标签之中,也即先要创建类的实例对象,才能对其进行属性注入

 Spring整合web项目底层原理

    1.加载spring的核心xml配置文件

    Spring概念和Bean管理(配置文件)

      (1)以上直接加载,功能可以实现,但是每次都会new对象,效率很低

    2.解决的实现思想:把加载配置文件和创建对象过程,在服务器启动的时候完成

    3.实现原理的底层技术

      (1)ServletContext对象

      (2)监听器

      (3)具体使用:【在实际项目中以下步骤是spring已经封装好的,只需要配置就可以】

      --在服务器启动的时候,为每个项目创建一个ServletContext对象

      --在ServletContext对象创建时候,使用监听器可以具体监听到ServletContext对象在什么时候创建  

      --使用监听器监听到ServletContext对象创建的时候,加载spring配置文件,把配置文件中配置的对象(多个bean标签)进行创建

      --把创建出来的对象放到ServletContext域对象里面(setAttribut方法)

      --获取对象的时候,到ServletContext域得到(getAttribute方法)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k