Spring

框架——重复代码的集合。提高开发效率,缩短开发周期。

Spring——整合现阶段所有的主流框架,即:负责所有框架的调度和整合。

Spring是轻量级的框架(资源占用小、容器依赖性小),是开源的。

Spring IOC——控制反转,将对象创建的权利交给Spring容器来完成,开发者无需关注对象的创建过程。即:不用自己new对象,从Spring容器里getXXX。

IOC步骤:

1.导入Spring相关jar包

Spring_第1张图片
一起学习,wx:kev168

2.创建实体类

Spring_第2张图片

3.编写Spring的配置文件(配置文件的头,编写类的对应关系)

默认配置文件名称:applicationContext.xml

Spring_第3张图片

4.创建Spring容器

Spring_第4张图片

Spring中如何创建对象?

可以通过class属性的值通过反射调用创建对象。Spring容器存储对象的方式就是一个Map(key, value),key就是bean的id,value就是对象。

5.从容器中获取对象,对象调用方法,完成功能。

容器中对象的获取方式:bean id(推荐) / 类型(类型重复会报错)

别名标签——bean id如果不同,可以使用alias标签。


对象的创建方式

1.构造方法创建对象——使用频率最高

如果构造方法重载,那么一定要加无参构造,如果没有无参构造(default constructor),那么默认的对象创建方式必然出错。

2.静态工厂创建对象——static

Spring的执行过程:

在Spring容器启动时,先会加载applicationContext.xml这个配置文件,根据每一个bean创建对象,解析到factory-method属性时,先会到class中找到该方法,之后直接调用执行。执行之后创建出来Calender对象。

3.实例工厂

实例工厂创建对象——先创建工厂对象,然后调用工厂对象的getCalendar方法创建Calendar对象,交给Spring。

4.Spring工厂

public class SpringFactory implements FactoryBean{}

当实现接口后,Spring容器在启动时就会自动调用getObject()创建对象。

Spring对象创建过程

当Spring容器启动的时候,先会加载applicationContext.xml,按行解析,遇到每一个bean都会为这个bean创建对象,然会存入map中,直到整个xml配置文件解析完成,Spring容器启动成功。在容器启动完成以后,才能为用户提供服务。

Spring创建对象的单例和多例

默认条件下,Spring创建对象默认都是单例的,scope="singleton"时也是单例的。

当scope属性为prototype时,对象是多例的。

对象的懒加载问题

关于Spring Bean创建的优化——在用户需要调用对象的时候,对象才会被创建出来。

懒加载的实现:

lazy-init="default"和默认不写时,懒加载不生效

lazy-init="false" 懒加载不生效

lazy-init="true" 懒加载生效

当对象的创建形式为多例时,所有对象的创建都是懒加载的。

Spring容器对于多例对象,只管创建,其他都不管。


DI依赖注入

1.set注入——属性的注入,必须添加set方法

执行过程:Spring会找到所有的set方法,找到setName---(变形)--->name值与进行匹配,如果匹配成功,则进行赋值。

set复杂类型的赋值

通过set注入方式可以为复杂类型赋值list、set、map、properties

xxx

2.构造器注入

如果对象创建时,使用构造方法进行注入,则可以不写无参构造。

Spring_第5张图片

使用构造方法进行注入时需要注意:

尽量使用index进行赋值;参数的个数一定保证参数匹配。

parent属性:

在Spring容器中创建时,如果有子父级关系,需要通过parent属性指明,这样Spring容器在创建对象时,帮助维护子父级关系。

初始化——销毁方法

init-method="init" destory-method="destory"

Spring容器可以直接调用初始化和销毁方法,需要用户指明方法名称即可。

autowire属性:

autowire可以简化xml配置,能够做到自动的装配,有两种装配模式:

1. byName

首先回查找所有的set方法setCat(Cat cat)--->去掉set并把首字母变小写--->cat--->与bean中的id进行比较,如果能够匹配,则能正确注入。如果匹配不到,则注入失败容器也不会报错。

2. byType

setCat(Cat cat)--->去掉set把首字符小写--->cat--->找到对应的类型(包名.类名)--->然后与bean中的class进行匹配,如果匹配成功则注入。

全局autowire

Spring_第6张图片

如果当前bean中配置了autowire则按照bean中配置的为准。

注解形式简化配置

引入头文件

1.属性注解

@Autowired

有两种注入方式,通过匹配属性的名称与bean中的id匹配,如果匹配成功则注入。如果匹配不成功则报错。

按照指定的ID匹配

@Autowired

@Qualifier(value="catA")

如果想实现按照ID匹配 则必须借助@Qualifier(value="catA")注解才能完成。

@Resource

@Resource注解的作用,其实就是@Autowired和@Qualifier(value="catA")的一个

增强版。使用一个注解就能够完成 按属性名称匹配,按属性类型匹配,按照

执行的ID匹配。

类的注解:

1.开启包扫描

Spring_第7张图片

2.使用@component

为需要创建对象的类 添加@Component注解,那么在spring容器启动时,先按

照包扫描给定的包进行扫描,当扫描到@Component注解的类时就会为当前的

这个类创建对象。在创建对象的过程中如果需要属性注入,则一并注入,将

生成的对象存放到了MAP中。Map中的Key就是当前类名首字母小写。

:ID的自动生成规则

当第二个字母大写 则 生成的ID就是类名Person,如果第二个字母小写 则首字

母小写。

:可以实现BeanNameAware接口

查看当前bean的id

:@Component(value="China") 指定bean的ID

:同类型的注解

@Scope(value="prototype") //对象的多例

@Lazy(value=false) //懒加载 失效

@PostConstruct //初始化方法

@PreDestroy //销毁方法

Spring为程序分层做了不同的注解:

1web @Controller

2service @Service

3dao @Repository

以上三个注解的作用和@Component一样,只是为了软件分层而设计的,方便程

序员阅读。

引入外部配置文件

1.导入外部配置文件

2.通过${配置文件的key} 能够得到value值

当Spring容器加载外部文件时会将key和value保存到Spring容器中

之后通过${XXX}可以动态的获取值。

使用场景:

配置数据库的数据源时使用

Driver url username passwrod

通过注解为基本类型赋值:

@Value(XXXX)

如果给复杂类型赋值 需要引入util头文件

Spring_第8张图片

xml中为list赋值:

林丹

特朗普

值注入:

Spring_第9张图片

面向接口编程:

通过实现类实现接口的方式形成了接口与实现类的组合。在编程中通常属性的类

型都是接口类型。这样做的好处是能够实现松耦合。这种编程方式叫做面向接口

编程。

面向接口编程的好处是能够随意切换具体的实现类,而不用修改任何代码。

Spring IOC和DI和面向接口编程的意义

使用Spring的IOC、DI和面向接口编程,这样的代码结构可以做到最大程度的松耦合。


单元测试:必须是public / 方法的返回值必须是void / 必须添加@Test注解


Spring的头文件的生成方式

1.copy

2.通过约束文件自动生成——schema/DTD(有next点next)

右键New-Wizards:xml-XML (Basic Templates)-Create XML file from an XML schema file-Select XML Catalog entry-Select Root Element(Root Element/Prefix)-New Template(Name/Patterns)-OK

3.导入约束文件

步骤:

Window-Preferences-XML-XML Catalog-Add-Catalog Entry-Location(.xsd文件)-Key(.xsd)

导入约束的效果,能够实现在没有网的条件下,所有的标签能够自动提示。

你可能感兴趣的:(Spring)