Spring框架-11.16


框架,即framework。实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。而且,框架一般是成熟的,不断升级的软件。

在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事务处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

第1章 Spring概述

1.1 搭建Spring运行时环境

1)加入JAR包

① Spring自身JAR包:spring-framework-4.0.0.RELEASE\libs目录下
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELE2ASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
② commons-logging-1.1.1.jar

2)创建Spring的配置文件

在Spring Tool Suite工具中通过如下步骤创建Spring的配置文件
① File->New->Spring Bean Configuration File
② 为文件取名字 例如:applicationContext.xml

1.2 HelloWorld

1)目标:使用Spring创建对象,为属性赋值
2)创建Student类
在这里插入图片描述
3)创建Spring配置文件

<!-- 使用bean元素定义一个由IOC容器创建的对象 -->
<!-- class属性指定用于创建bean的全类名 -->
<!-- id属性指定用于引用bean实例的标识 -->
<bean id="student" class="com.atguigu.helloworld.bean.Student">
	<!-- 使用property子元素为bean的属性赋值 -->
	<property name="studentId" value="1001"/>
	<property name="stuName" value="Tom2015"/>
	<property name="age" value="20"/>
</bean>

4)测试:通过Spring的IOC容器创建Student类实例

//1.创建IOC容器对象
ApplicationContext iocContainer = 
		new ClassPathXmlApplicationContext("helloworld.xml");
//2.根据id值获取bean实例对象
Student student = (Student) iocContainer.getBean("student");
//3.打印bean
System.out.println(student);

第2章 IOC容器和Bean的配置

2.1 IOC和DI

2.1.1 IOC(Inversion of Control):反转控制

2.1.2 DI(Dependency Injection):依赖注入

2.1.3 IOC容器在Spring中的实现

前提:Spring中有IOC思想,IOC思想必须基于IOC容器来完成,而IOC容器在最底层实质上就是一个对象工厂
1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。
2)Spring提供了IOC容器的两种实现方式
① BeanFactory:IOC容器的基本实现,不是提供给开发人员使用的。
ApplicationContext:BeanFactory的子接口,提供了更多高级特性。几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

2.1.4 ApplicationContext的主要实现类

1)ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件
2)FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件

2.1.5 ConfigurableApplicationContext

1)是ApplicationContext的子接口,包含一些扩展方法
2)refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。

2.1.6 WebApplicationContext

1)专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作。

2.1.7 容器的结构图

在这里插入图片描述

2.2 通过类型获取bean

1)从IOC容器中获取bean时,除了通过id值获取,还可以通过bean的类型获取。但如果同一个类型的bean在XML文件中配置了多个,则获取时会抛出异常,所以同一个类型的bean在容器中必须是唯一的。

HelloWorld helloWorld = cxt.getBean(HelloWorld. class);

2)或者可以使用另外一个重载的方法,同时指定bean的id值和类型

HelloWorld helloWorld = cxt.getBean(“helloWorld”,HelloWorld. class);

2.3 给bean的属性赋值

2.3.1 依赖注入的方式

1.通过bean的setXxx()方法赋值

Hello World中使用的就是这种方式
在这里插入图片描述

2. 通过bean的构造器赋值

1)Spring自动匹配合适的构造器

<bean id="book" class="com.atguigu.spring.bean.Book" >
	<constructor-arg value= "10010"/>
	<constructor-arg value= "Book01"/>
	<constructor-arg value= "Author01"/>
	<constructor-arg value= "20.2"/>
</bean >

2)通过索引值指定参数位置

<bean id="book" class="com.atguigu.spring.bean.Book" >
	<constructor-arg value= "10010" index ="0"/>
	<constructor-arg value= "Book01" index ="1"/>
	<constructor-arg value= "Author01" index ="2"/>
	<constructor-arg value= "20.2" index ="3"/>
</bean >

3)通过类型区分重载的构造器

<bean id="book" class="com.atguigu.spring.bean.Book" >
      <constructor-arg value= "10010" index ="0" type="java.lang.Integer" />
      <constructor-arg value= "Book01" index ="1" type="java.lang.String" />
      <constructor-arg value= "Author01" index ="2" type="java.lang.String" />
      <constructor-arg value= "20.2" index ="3" type="java.lang.Double" />
</bean >

2.3.2 p名称空间

为了简化XML文件的配置,XML文件采用属性而非子元素配置信息。可以通过<bean>元素属性的方式配置Bean的属性。

<bean 
	id="studentSuper" 
	class="com.atguigu.helloworld.bean.Student"
	p:studentId="2002" p:stuName="Jerry2016" p:age="18" />

2.3.3 可以使用的值

1.字面量--------基本数据类型以及对应的包装类、string写在""中还能表示原来的意思
1)可以使用字符串表示的值,可以通过value属性或value子节点的方式指定
2)基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
3)若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来
2.null值

<bean class="com.atguigu.spring.bean.Book" id="bookNull" >
      <property name= "bookId" value ="2000"/>
      <property name= "bookName">
          <null/>
      </property>
      <property name= "author" value ="nullAuthor"/>
      <property name= "price" value ="50"/>
</bean >

3.给bean的级联属性赋值

<bean id="action" class="com.atguigu.spring.ref.Action">
     <property name="service" ref="service"/>
     <!-- 设置级联属性(了解) -->
     <property name="service.dao.dataSource" value="DBCP"/>
</bean>

4.外部已声明的bean、引用其他的bean

<bean id="shop" class="com.atguigu.spring.bean.Shop" >
      <property name= "book" ref ="book"/>
</bean >

5.内部bean
当bean实例仅仅给一个特定的属性使用时,可以将其声明为内部bean。内部bean声明直接包含在或元素里,不需要设置任何id或name属性
内部bean只能在当前bean中使用

<bean id="shop2" class="com.atguigu.spring.bean.Shop" >
    <property name= "book">
        <bean class= "com.atguigu.spring.bean.Book" >
           <property name= "bookId" value ="1000"/>
           <property name= "bookName" value="innerBook" />
           <property name= "author" value="innerAuthor" />
           <property name= "price" value ="50"/>
        </bean>
    </property>
</bean >

2.4 集合属性

2.4.1 List、数组、set

配置java.util.List类型的属性,需要指定<list>标签,在标签里包含一些元素。这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其他Bean的引用。通过<bean>指定内置bean定义。通过<null/>指定空元素。甚至可以内嵌其他集合。
数组的定义和List一样,都使用<list>元素。
配置java.util.Set需要使用<set>标签,定义的方法与List一样。

<bean id="shop" class="com.atguigu.spring.bean.Shop" >
      <property name= "categoryList">
          <!-- 以字面量为值的List集合 -->
          <list>
               <value> 历史</value >
               <value> 军事</value >
          </list>
      </property>
      <property name= "bookList">
          <!-- 以bean的引用为值的List集合 -->
          <list>
               <ref bean= "book01"/>
               <ref bean= "book02"/>
          </list>
      </property>
</bean >

2.4.2 Map

Java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签。每个条目包含一个键和一个值。
必须在<key>标签里定义键。
因为键和值的类型没有限制,所以可以自由地为它们指定<value><ref><bean><null/>元素。
可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义;bean引用通过key-ref和value-ref属性定义。

<bean id="cup" class="com.atguigu.spring.bean.Cup">
	<property name="bookMap">
		<map>
			<entry>
				<key>
					<value>bookKey01</value>
				</key>
				<ref bean="book01"/>
			</entry>
			<entry>
				<key>
					<value>bookKey02</value>
				</key>
				<ref bean="book02"/>
			</entry>
		</map>
	</property>
</bean>

2.4.3 集合类型的bean

如果只能将集合对象配置在某个bean内部,则这个集合的配置将不能重用。我们需要 将集合bean的配置拿到外面,供其他bean引用。
配置集合类型的bean需要引入util名称空间

<util:list id="bookList">
	<ref bean="book01"/>
	<ref bean="book02"/>
	<ref bean="book03"/>
	<ref bean="book04"/>
	<ref bean="book05"/>
</util:list>

<util:list id="categoryList">
	<value>编程</value>
	<value>极客</value>
	<value>相声</value>
	<value>评书</value>
</util:list>

2.5 FactoryBean

2.5.1 FactoryBean

Spring中有两种类型的bean,一种是普通bean,另一种是工厂bean,即FactoryBean。
工厂bean跟普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。
工厂bean必须实现org.springframework.beans.factory.FactoryBean接口。
在这里插入图片描述

<bean id="product" class="com.atguigu.spring.bean.ProductFactory">
	<property name="productName" value="Mp3" />
</bean>

2.6 bean的作用域

在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。
默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域。
在这里插入图片描述
当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例。而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值