IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring学习(一) -> 正文阅读

[Java知识库]Spring学习(一)

一.基本概念

1.1 Spring

 1.Spring是为简化企业级开发而生,它实际上是为我们封装了许多的组件,如common相关包,数据连接相关包(ORM:mybatis等),web(jsp)等。是一个框架,是一个整体的解决方案。
 2.spring最重要的就是依赖注入(DI)和控制反转(IOC)。实际上,依赖注入是控制反转的具体实现,控制反转是一种思想。传统意义上,我们想调用一个方法,需要先创建目标对象,再根据对象调用对象方法。而控制反转的思想是,我们不需要关注目标对象是如何被创建的,而只需要交给sping框架的IOC容器,我们只需要根据这个容器对象获取到目标对象,再使用目标对象调用对象方法。至于容器是如何创建出目标对象的,不需要关心。(实际上,可以简单理解为容器就是一个抽象工厂,负责创建需要的对象)

1.2 Spring的几种方式

1.2.1. 基于xml的配置方式,使用的全类名的方式
如在xml文件中:

    <bean id="person" class="com.atguigu.spring.helloworld.Person">
         <property name="name" value="zhangsan"></property>
    </bean>

其中:
<-bean>:受Spring管理的一个javaBean对象;
id:<-bean>的唯一标识,在整个配置文件或IOC容器中唯一不重复。
class:指定javaBean的全类名,目的是通过反射创建对象。实质上,其IOC容器对象创建出目标对象大致可描述为如下:

  Class cls = Class.forName("全类名");
  Object obj = cls.newInstance();//必须提供好无参构造函数

这样便可得到目标对象,经过外部强制类型转换可得到目标对象类型。

  <property> :给对象赋值
        name:指定属性名,指定set风格的属性名
        value:指定属性值

这里实际上是相当于调用set方法进行赋值。
如在Main方法中:

//1.创建Spring的IOC容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//xml文件名
//2.获取Person对象
Person person = (Person)ctx.getBean("person");//id
或者Person person = (Person)ctx.getBean(Person.Class);//class全类名,但不支持xml中同一类的多个对象获取
或者Person person = (Person)ctx.getBean(“person”,Person.Class);//id+class全类名,精确定位某类的某个对象,推荐
//3.调用方法
person.sayHello();

1.2.2 p名称空间
????为了简化xml文件的配置,越来越多的xml文件采用属性而非子元素配置信息,spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置bean的属性。
如在xml中:

   <bean id="person3" class="com.atguigu.spring.helloworld.Person"
      p:name="zhangsan" p:sex="male">
   </bean>

????采用这种方式后,在Person类中便不需要书写set方法。

1.3 深度解析

1.实质上,在Spring中有两种IOC容器
??(1)BeanFactory:IOC的基本实现,是spring内部的基础设施,是面向spring本身的,不是提供给开发人员的;
?? (2)ApplicationContext:BeanFactory的子接口,提供了更多高级的特性,面向spring的使用者,几乎所有场合使用ApplicationContext,而不是底层的BeanFactory。

2.依赖注入的方式
??(1)通过bean的setXXX()方式进行注入;
???? 如在xml文件中:

    <bean id="person" class="com.atguigu.spring.helloworld.Person">
         <property name="name" value="zhangsan"></property>
          <property name="sex" value="male"></property>
    </bean>

????这种方式是通过person类中的set方法进行注入,所以缺少set方法时会出错,除此之外,spring框架中采用此方法时也会用到该类的无参构造方法,所以如果写了多个构造函数,则必须显示的编写无参构造函数才不会出错。
(2)通过bean的构造器赋值
?? 1)Spring自动匹配合适的构造器
????顾名思义,就是采用参数构造函数匹配方式来进行注入,需要在Person类中编写无参构造函数以及有参构造函数。
如在xml文件中:

    <bean id="person" class="com.atguigu.spring.helloworld.Person">
         <constructor-arg  value="zhangsan"></constructor-arg>
          <constructor-arg  value="male"></constructor-arg>
    </bean>   

????这种方式就是使用构造器进行对象赋值,对象属性值与构造方法参数列表依次对应,对应出错会导致报错。此外,需要注意的是,bean的作用域问题,默认情况下,spring 容器被创建的时候,bean对象就被创建了,因此只要创建spring IOC容器,那么就默认会调用set方式的注入。还有重要的一点是,spring会根据构造器的参数类型去匹配对应构造器,如果类中除了构造方法外,还包括其他方法,那么采用构造器方式进行赋值时,spring优先匹配最先找到的合适的参数类型的构造器进行赋值(从下向上依次扫描构造器方法),而当类中只有构造方法时,则会匹配合适的参数类型较大的构造器方法。
????除了按照参数类型匹配构造器之外,还有index:指定参数位置(value="xxx" index="0")、type:指定参数类型的构造器赋值方式(value="xxx" index="0" type=“java.lang.Double”)。

1.4 注意点

1.字面量
??(1)可以使用字符串表示的值,可以通过value属性或者value子节点的方式指定。
??(2)基本数据类型及其封装类、String等类型都可以采取字面值注入方式;
??(3)若字面量中包含特殊字符,可以使用实体把字面值包裹起来。如:
????1)在w3school手册中进行查询,如:

    .      &nbsp;
    &     &amp;
    <     &lt;
    >     &gt;
    "     &quot;

如:

  <bean id="person"    class="com.atguigu.spring.helloworld.Person">
       <property name="name" >
          <value>&lt;&lt;Java编程思想&gt;&gt;</value>
       </property>
   </bean>
 或者:
  <bean id="person"    class="com.atguigu.spring.helloworld.Person">
       <property name="name"  value="&lt;&lt;Java编程思想&gt;&gt;">
          <value>&lt;&lt;Java编程思想&gt;&gt;</value>
       </property>
   </bean>

????2)<![CDATA[任意字符]]> 的方式,如:

  <bean id="person"    class="com.atguigu.spring.helloworld.Person">
       <property name="name">
          <value><![CDATA[《Java编程思想》]]></value>
       </property>
   </bean>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-08-10 23:04:10  更:2021-08-10 23:05:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:50:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码