一、

1.Spring

(1)Spring是什么?

是一个轻量级的、用来简化企业级应用开发的开发框架。

注:a.简化开发:Spring对常用的api做了简化,比如,使用Springjdbc来访问数据库,就不用再考虑如何获取连接、关闭连接、处理异常等等。b.解耦:Spring容器(Spring框架的一个模块)帮我们管理对象(包括对象的创建及对象之间的依赖关系),这样一来,对象之间的耦合度会大大降低,提供高了系统的维护性。c.集成其它框架:Spring可以将其它一些常用的框架集成进来,比如可以将Quartz,MyBatis等集成进来。

(2)Spring容器

1)Spring容器是什么?

Spring框架的一个核心模块,用于管理对象。

注:管理对象指的是,spring容器会用我们创建对象,
并且建立对象之间的依赖关系。

2)如何启动Spring容器?

step1.导包。

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.2.8.RELEASE</version>
</dependency>

step2.添加配置文件(applicationContext.xml)。

将配置文件添加到main/resources下。

step3.启动Spring容器。

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

3)创建对象

a.方式一  使用无参构造器

step1. 给类添加无参构造器(缺省构造器)。
step2.  在配置文件当中,使用bean元素来进行配置。<!-- 使用无参构造器来创建对象。id属性要求唯一。class属性指定类名(要写完整的类名)。注:在spring框架当中,将Spring容器所管理的对象称之为一个bean。   --><bean id="ap1" class="first.Apple"/>step3. 启动容器,调用容器提供的getBean方法。//通过容器获得对象Apple ap1 = ac.getBean("ap1",Apple.class);

b.方式二  使用静态工厂方法 (了解)

<!-- 使用静态工厂方法来创建对象。factory-method属性用于指定一个静态方法(static修饰的方法)。注:容器会调用指定类的静态方法来创建对象。-->
<bean id="cal1"
class="java.util.Calendar"
factory-method="getInstance"/>

c.方式三  使用实例工厂方法 (了解)

<!-- 使用实例工厂方法来创建对象。factory-bean属性指定bean的id,factory-method属性指定一个方法。注:容器会调用该bean的方法来创建一个对象。--><bean id="date2" factory-bean="cal1" factory-method="getTime"/>

4)作用域

a.默认情况下,对于某个bean,容器只会创建一个实例。

b.如果要让容器创建多个实例,需要设置bean的作用域。

<!-- scope属性用于指定作用域,缺省值是singleton,如果将值设置为prototype,则容器会创建多个实例。--><bean id="eb1" class="basic.ExampleBean" scope="prototype"/>

5)生命周期

spring容器在创建好对象之后,会调用初始化方法, 在销毁该对象之前,会调用销毁方法。

    <!-- init-method属性:  指定初始化方法destroy-method属性:指定销毁方法。注:销毁方法只有当作用域为singleton才有效。-->    <bean id="mb1" class="basic.MessageBean" init-method="init" destroy-method="destroy" scope="singleton"/>

6)延迟加载

a.默认情况下,容器启动之后,会将所有作用域为singleton的bean实例化。

b.延迟加载指的是,通过设置lazy-init="true"告诉容器, 启动之后不再创建其实例。

    <!-- lazy-init属性如果值为true,表示延迟加载。--><bean id="lb1" class="basic.LazyBean" lazy-init="true"/>

(3)IOC和DI

1)IOC是什么? (Inversion Of Controll 控制反转)

对象之间的依赖关系应该由容器来建立。

2)DI是什么? (Dependency Injection 依赖注入)

容器通过调用set方法或者构造器来建立对象之间的依赖关系。

注:IOC是目标,DI是手段。

3)set方法注入

step1. 为类添加set方法。

step2. 在配置文件当中,使用property元素来配置set 方法注入。

    <!-- property元素表示采用set方法注入。name属性用于指定set方法名(容器会将b大写,前面添加set来构造方法名)。ref属性用于指定被注入的bean的id。--><bean id="a1" class="ioc.A"><property name="b" ref="b1"/></bean>

step3. 启动容器,调用getBean方法。

练习

使用无参构造器创建一个Student对象。 添加初始化方法和销毁方法, 作用域为singleton, 不使用延迟加载。

练习

采用set方法将Cpu注入到Computer。

二、

3)set方法注入

4)构造器注入

step1. 添加相应的带参的构造器。

step2. 使用<constructor-arg>元素来配置构造器注入。

    <bean id="cpu" class="ioc.Cpu"/><!-- constructor-arg元素用来配置构造器注入。index属性用于指定参数的下标。ref属性用于指定被注入的bean的id。--><bean id="cp" class="ioc.Computer"><constructor-arg index="0" ref="cpu"/></bean>

step3. 启动容器,调用getBean方法。

4)自动装配 (了解)

a.什么是自动装配?

容器依据某些规则,自动查找符合要求的对象,
然后建立对象之间的依赖关系。
注: 容器仍然要调用set方法或者构造器。

b.如何自动装配?

使用autowire属性指定装配的规则:
<bean id="wt1" class="autowire.Waiter"/><!-- autowire属性表示让容器自动建立对象之间的依赖关系,有三个值:byName:以属性名作为bean的id,查找对应的bean,然后调用set方法。注:如果找不到对应的bean,不会调用set方法。byType:以属性类型作为bean的类型,查找对应的bean,然后调用set方法。注:如果找不到对应的bean,不会调用set方法。如果找到多个bean,会出错。constructor:类似于byType,只不过是调用构造器来完成  注入。  -->
<bean id="rest" class="autowire.Restaurant" autowire="byType"/> 

5)注入基本类型的值

<bean id="vb" class="value.ValueBean"><property name="name" value="小包总"/><property name="age" value="20"/>
</bean>

6)注入集合类型的值

a.支持四种集合类型的值的注入,分别是List,Set,Properties,Map。

b.注入方式如下:

    <property name="interest"><list><value>打猎</value><value>看书</value><value>编程</value><value>编程</value></list></property><property name="city"><set><value>洛阳</value><value>金陵</value><value>开封</value></set></property><property name="score"><map><entry key="english" value="59.5"/><entry key="math" value="17"/>    </map></property><property name="db"><props><prop key="username">tom</prop><prop key="pwd">1234</prop></props></property>

7)引用的方式注入集合类型的值

    <!-- 将集合类型的值配置成一个bean--><util:list id="interestBean"><value>打猎</value><value>看书</value><value>编程</value></util:list><util:set id="cityBean"><value>北京</value><value>南京</value><value>东京</value></util:set><util:map id="scoreBean"><entry key="english" value="80"/><entry key="math" value="90"/></util:map> <util:properties id="dbBean"><prop key="username">John</prop><prop key="pwd">1234</prop></util:properties><bean id="vb2" class="value.ValueBean"><property name="interest" ref="interestBean"/><property name="city"ref="cityBean"/><property name="score"ref="scoreBean"/><property name="db"ref="dbBean"/></bean>

8)读取properties文件的内容

    <!-- 读取properties文件的内容。location属性用于指定要读取的文件的位置。注:classpath:表示依据类路径去查找相应的文件。--><util:properties id="config" location="classpath:config.properties"/>

9)spring表达式

a.spring表达式的作用?

可以用来读取其它bean的属性

b.用法如下图:

练习1

 将Waiter注入到Restaurant,采用构造器注入。

练习2

将盔甲和无限手套注入到钢铁侠,采用自动装配 (使用byName)

IronMan类  钢铁侠
Armour类   盔甲 (String name )
Glove类  无限手套

练习3

 为ExampleBean注入四种集合类型的值。

练习4

使用Spring表达式读取jdbc.properties文件的 内容,并注入到DataSourceBean对象。

DataSourceBean类
private String driver;
private String username;
private String pwd;
private String url;

三、

Spring

1. 作用

创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的!

2. Spring注解

在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置!

尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件!

2.1. 常用注解

使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描:

<!-- 组件扫描 -->
<!-- 仅在组件扫描的包下的类,才会被Spring管理 -->
<!-- 某个类,如果在扫描范围中,且添加了注解,则会被Spring管理 -->
<!-- base-package:扫描的根包 -->
<!-- 根包:父级包,Spring扫描时,会扫描其各层级子包 -->
<!-- 当配置为cn.tedu.spring时 -->
<!-- cn.tedu.spring.dao或cn.tedu.spring.entity这些子包都会被扫描 -->
<context:component-scan base-package="cn.tedu.spring.entity" />

然后,确保需要被管理的类都在以上配置的包中(也可以在其子包中),并且,在类的声明之前添加注解:

@Component

在默认情况下,被管理的类的bean id是与类的名称相同,且首字母小写的!例如类名是User,则默认的bean id是user,或类名是UserDao,则默认的bean id是userDao

如果需要自定义bean id,可以在注解中添加bean id:

@Component("bean-id")

四、

Spring

1. 作用

创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的!

2. Spring注解

在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置!

尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件!

2.1. 常用注解

使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描:

<!-- 组件扫描 -->
<!-- 仅在组件扫描的包下的类,才会被Spring管理 -->
<!-- 某个类,如果在扫描范围中,且添加了注解,则会被Spring管理 -->
<!-- base-package:扫描的根包 -->
<!-- 根包:父级包,Spring扫描时,会扫描其各层级子包 -->
<!-- 当配置为cn.tedu.spring时 -->
<!-- cn.tedu.spring.dao或cn.tedu.spring.entity这些子包都会被扫描 -->
<context:component-scan base-package="cn.tedu.spring.entity" />

然后,确保需要被管理的类都在以上配置的包中(也可以在其子包中),并且,在类的声明之前添加注解:

@Component

在默认情况下,被管理的类的bean id是与类的名称相同,且首字母小写的!例如类名是User,则默认的bean id是user,或类名是UserDao,则默认的bean id是userDao

如果需要自定义bean id,可以在注解中添加bean id:

@Component("bean-id")

@Component作用相同的注解还有:

@Controller
@Service
@Repository

其中,@Component是通用注解,即对任意类都可以添加该注解,@Controller是对控件器类的注解,@Service是对业务类的注解,@Repository是对持久层类的注解。

不过,以上这4种的作用和使用方式完全相同!只是语义不同,即从语法上表达的意义不相同,应该根据类的定位来选取 其中的某个注解!

2.2. 管理对象的作用域与生命周期

由Spring所管理的对象,默认都是饿汉式单例的,通过@Scope注解可以配置某个类被Spring管理时,是否是单例的:

@Scope("prototype")
public class ...

常用的配置方式有@Scope("singleton")@Scope("prototype")

如果需要配置该类最终是否是懒加载的,可以使用@Lazy注解,当添加了该注解后,就是懒加载模式,即:只有第1次获取对象时,才会创建对象,而在加载Spring配置文件的过程中,并不会把对象创建出来!

关于@Lazy也可以配置值,例如@Lazy(true)@Lazy(false)

饿汉式:一开始就已准备好了,随时都有的吃!

懒汉式:不到逼不得已,不干活!

注意:是否懒加载,是建立在单例的基础之上的!如果不是单例的,则懒加载的配置是无效的!

作用域:在多大的范围内是有效的!对于变量/对象而言,作用域就是它存在的时长,即何时创建及何时销毁!由于单例的对象都是static实现的,也就涉及创建时间和销毁时间的问题!而非单例的,作用域与普通的局部变量相同!

简单的懒汉式单例代码(没有解决线程安全问题):

public class King {private static King king = null;private King() {}public static King getInstance() {if (king == null) {king = new King();}return king;}}

五、

Spring

1. 作用

创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的!

2. Spring注解

在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置!

尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件!

2.1. 常用注解

使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描:

<!-- 组件扫描 -->
<!-- 仅在组件扫描的包下的类,才会被Spring管理 -->
<!-- 某个类,如果在扫描范围中,且添加了注解,则会被Spring管理 -->
<!-- base-package:扫描的根包 -->
<!-- 根包:父级包,Spring扫描时,会扫描其各层级子包 -->
<!-- 当配置为cn.tedu.spring时 -->
<!-- cn.tedu.spring.dao或cn.tedu.spring.entity这些子包都会被扫描 -->
<context:component-scan base-package="cn.tedu.spring.entity" />

然后,确保需要被管理的类都在以上配置的包中(也可以在其子包中),并且,在类的声明之前添加注解:

@Component

在默认情况下,被管理的类的bean id是与类的名称相同,且首字母小写的!例如类名是User,则默认的bean id是user,或类名是UserDao,则默认的bean id是userDao

如果需要自定义bean id,可以在注解中添加bean id:

@Component("bean-id")

@Component作用相同的注解还有:

@Controller
@Service
@Repository

其中,@Component是通用注解,即对任意类都可以添加该注解,@Controller是对控件器类的注解,@Service是对业务类的注解,@Repository是对持久层类的注解。

不过,以上这4种的作用和使用方式完全相同!只是语义不同,即从语法上表达的意义不相同,应该根据类的定位来选取 其中的某个注解!

2.2. 【了解】管理对象的作用域与生命周期

由Spring所管理的对象,默认都是饿汉式单例的,通过@Scope注解可以配置某个类被Spring管理时,是否是单例的:

@Scope("prototype")
public class ...

常用的配置方式有@Scope("singleton")@Scope("prototype")

如果需要配置该类最终是否是懒加载的,可以使用@Lazy注解,当添加了该注解后,就是懒加载模式,即:只有第1次获取对象时,才会创建对象,而在加载Spring配置文件的过程中,并不会把对象创建出来!

关于@Lazy也可以配置值,例如@Lazy(true)@Lazy(false)

饿汉式:一开始就已准备好了,随时都有的吃!

懒汉式:不到逼不得已,不干活!

注意:是否懒加载,是建立在单例的基础之上的!如果不是单例的,则懒加载的配置是无效的!

作用域:在多大的范围内是有效的!对于变量/对象而言,作用域就是它存在的时长,即何时创建及何时销毁!由于单例的对象都是static实现的,也就涉及创建时间和销毁时间的问题!而非单例的,作用域与普通的局部变量相同!

简单的懒汉式单例代码(没有解决线程安全问题):

public class King {private static King king = null;private King() {}public static King getInstance() {if (king == null) {king = new King();}return king;}}

由Spring管理的对象,也存在生命周期问题,毕竟单例模式的类的对象何时创建、何时销毁,是我们无法确定的!为了确保初始化和销毁工作的正常执行,Spring允许在类中自定义初始化方法和销毁方法,使用了@PostConstruct注解的方法是生命周期初始化方法,会在构造方法之后被自动调用,使用了@PreDestroy注解的方法是生命周期销毁方法,会在Spring容器销毁并释放资源的前一刻被自动调用。

注意:以上2个方法是在javax包中定义的,使用之前,需要为项目添加Tomcat运行环境,否则无法识别!

注意:以上生命周期方法是建立在单例模式之下的,对于非单例模式而言,以上生命周期方法其实没有意义!

2.3. 自动装配

当使用了自动装配后,由Spring管理的对象时,会自动尝试为各属性注入值,值的来源可以是其它bean,例如:

public class UserService {public IUserDao userDao;
}public class UserDao1 implements IUserDao {
}

如果以上2个类都是由Spring管理的,则在创建UserService对象时,会尝试自动的将UserDao对象作为其属性值!

自动装配的常用模式有byNamebyType,前者表示根据名称来装配,即:要求bean id与属性名保持一致,后者表示根据类型来装配,即bean的类型与属性的类型保持一致(允许是接口与实现类的关系,也允许是父子级继承的关系),不过,根据类型装配,要求匹配该类型的对象必须是有且仅有1个,如果有2个,则会抛出异常,无法装配!

java从入门到精通----Spring相关推荐

  1. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

  2. 详细:JAVA从入门到精通视频教程,后台学习历程

    详细:JAVA从入门到精通视频教程,后台学习历程 ==基础部分 由于百度分享有时效性 想要免费资源的请加645969403 1.java基础:高琪java开发300集 链接:https://pan.b ...

  3. ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  4. Java从入门到精通08-二进制、位运算、移位运算

    Java从入门到精通08-二进制.位运算.移位运算 二进制(Binary)数用0和1两个数字及其组合来表示任何数.进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右到左 ...

  5. java从入门到精通_Java入门到精通、学习路线、就业方向、薪资及前景分析(上篇)...

    今天就大家最关心的Java热门问题进行简要分析,希望能对想要学习或是正在学习Java的小伙伴能够有所帮助~(大家多多关注呦~) 一.首先我们要了解Java是什么? 好学吗? Java是一种广泛使用的计 ...

  6. Java从入门到精通07-排序

    Java从入门到精通07-排序 排序(Sorting)是将一群数据,依指定的顺序进行排列的过程. 排序是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理工作25%的时间都在排序.简单地说 ...

  7. Java从入门到精通十一(javaIO流)

    Java从入门到精通十一(javaIO流) IO引入 字节流和字符流(一些说明) 字节流没有用到缓冲区并不是没有用到内存 为什么输入流是读数据,而输出流是写数据? 字节流说明 字节输入流读数据的方法 ...

  8. Java从入门到精通章节练习题——第六章

    Java从入门到精通章节练习题--第六章 Exercise 1 简易计算器 Exercise 2 购买电影票 Exercise 3 计算平均分 Exercise 4 厘米与英寸互转 Exercise ...

  9. 阿文的《Java从入门到精通(第二版)》学习日记DAY1

    目录 1️⃣前言: 2️⃣书籍:<Java从入门到精通(第二版)>张玉宏主编 3️⃣学习导图: 第0章 Java的学习指南 4️⃣学习笔记:

最新文章

  1. 程序员最讨厌的9句话,你可有补充?
  2. poj 3006 java
  3. “数据库审计”关键词,重回Google第一位置
  4. 图解Oracle 12c创建数据挖掘(Data Miner)用户dmuser
  5. 百度开发者中心全新升级 | 文末六一送福利
  6. 求n!,C(n,m)和A(n,m)最后的非零位。
  7. 【github相关】之h264bitstream
  8. iphone7计算机隐藏,Iphone7:3Dtouch5个隐藏小功能,你知道吗?
  9. Halcon——使用标定板标定像素当量
  10. c语言 intptr_t
  11. 07-图5 Saving James Bond - Hard Version
  12. Atitit 接受post raw数据目录1. 接受get参数 11.1. //req.query只能拿到get参数 //post请求使用 body-parser拿到 12. 原生expre
  13. AIDA64内存与缓存测试过了算稳定吗_买了B460主板的你,究竟需要怎样的内存
  14. 二手书交易系统功能结构图
  15. 抖音快手短视频去水印API,接口开发文档
  16. 前方高能!阿里云双11拼团百团大战已开启!
  17. 用Moment.js 计算两个时间直接的间隔
  18. 票总管代账版行业解决方案
  19. JS中onpropertychange事件和onchange事件区别
  20. PS怎么复制一只眼晴到另一只眼?

热门文章

  1. 丹麦或将使用区块链为贫困地区提供援助
  2. 把二进制数100110.101转换成相应的十进制数。
  3. 必看!决定蓝领薪酬高低的因素
  4. linux下vim编辑器插件,为你介绍Linux系统中vim编辑器的实用插件!
  5. C语言爱心代码以及c++爱心代码
  6. 微型计算机认证部件,节能产品认证-微型计算机用开关电源
  7. MathWorks官方MATLAB/Simulink基础入门视频教程 笔记(Simulink基础)
  8. 机器人开发--常用仿真软件工具
  9. (转)深度研究报告:108家基金公司都有独门武器,这是特色鲜明的十家公司
  10. Inno Setup实例教程之一:软件安装和demo使用