Spring

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

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

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

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

IOC步骤:

1.导入Spring相关jar包

一起学习,wx:kev168

2.创建实体类

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

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

4.创建Spring容器

Spring中如何创建对象?

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

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

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

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


对象的创建方式

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

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

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

<bean id="calendar" class="factory.StaticFactory" factory-method="getCalendar"></bean>

Spring的执行过程:

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

3.实例工厂

<bean id="newInstance" class="factory.NewInstanceFactory"></bean>

<bean id="calendar2" factory-bean="newInstance" factory-method="getCalendar"></bean>

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

4.Spring工厂

<bean id="calendar3" class="factory.SpringFactory"></bean>

public class SpringFactory implements FactoryBean<Calendar>{}

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

Spring对象创建过程

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

Spring创建对象的单例和多例

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

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

<bean id="person" class="domain.Person" scope="prototype"></bean>

对象的懒加载问题

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

懒加载的实现:

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

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

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

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

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


DI依赖注入

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

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

set复杂类型的赋值

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

<bean id="person" class="domain.Person">

<property name="list">

<list>

<value>xxx<value>

<ref bean="x id">

</list>

</property>

2.构造器注入

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

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

尽量使用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

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

注解形式简化配置

引入头文件

1.属性注解

@Autowired

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

按照指定的ID匹配

@Autowired

@Qualifier(value="catA")

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

@Resource

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

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

执行的ID匹配。

类的注解:

1.开启包扫描

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.导入外部配置文件

<context:property-placeholder location="classpath:/China.properties"/>

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

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

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

使用场景:

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

Driver url username passwrod

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

@Value(XXXX)

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

xml中为list赋值:

<util:list id="list">

<value>林丹</value>

<value>特朗普</value>

</util:list>

值注入:

面向接口编程:

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

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

编程。

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

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)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,044评论 2 7
  • 文章作者:Tyan博客:noahsnail.com 3.4 依赖 标准企业应用不会由一个对象(或Spring用语中...
    SnailTyan阅读 1,118评论 0 1
  • 如果你不耕耘,在黄沙漫天里 双手起了厚厚的老茧 我就不会等你 如果你不像天使一样 向祈祷的人伸出抚慰之手 我就不会...
    止文阅读 254评论 0 3