Spring初识

从上学期开始决心开始学习Spring,自己总是利用不好时间,到处瞎忙,结果浪费了好多时间。想着利用暑假的时间,专心看会儿书。最初我在Spring官网下载jar包的时候,忙会儿了半天愣是没找到下载的链接,瞬间觉得学Spring好难,莫名的抵触心理开始泛滥,无奈只好强抱度娘。这是我找到的链接。

教您怎么从spring 官网下载参考文档

附上小图:image_thumb1image_thumb18image8_thumb1

image_thumb20

image_thumb21

Spring官网下载

嘿嘿,其实好简单哦,可是人家当时就是没找到嘛,也不想那么快地拥抱度娘23333……

Spring下载解压后可以看到lib目录下jar包确实有点多哦,每个jar包都有三个不同类型的,一种是含.class文件的jar包(….jar),这也是我们项目中需要的,还有两种是帮助文档(…-javadoc.jar)和源码(…-sources.jar)。以下内容纯粹是我的看书笔记哦,我是看的李刚的那本轻量级javaee。自己总是太快忘记一些事,还有一些人,所以记录下罗。

我看书写第一个Demo(setter、getter都删掉罗):

src/cn/edu/cqupt/MySpring/bean/Person.java
package cn.edu.cqupt.MySpring.bean.impl;
public class Person {
    private String name;private int age;public String toString(){return "Name:"+this.name+",age:"+this.age;}
}
src/beans.xml
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><property name="name" value="xiaofeig"/><property name="age" value="20"/>
</bean>
</beans>
src/cn/edu/cqupt/MyString/test/TestMain.java
package cn.edu.cqupt.MySpring.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.cqupt.MySpring.bean.impl.Person;
public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);System.out.println(person);}
打印结果:Name:xiaofeig,age:20
 

Spring的核心机制:依赖注入(Dependency Injection)

我们在xml文件中配置了一个编号为person的实例之后,Spring容器就负责帮助我们来创建这个实例,这个实例包含两个属性,分别为name和age,通过property标签来设置它的值value。配置完成之后,Spring容器就通过反射机制调用Person类的无参构造方法创建一个实例,然后再调用属性name,age的setter方法,为这两个属性设值。这应该就是最简单的依赖注入啦。我们只需要在容器ApplicationContext中通过实例编号person去取就可以啦。书上还有一些关于依赖关系的一些介绍,加入A组件调用了B组件的方法,我们可称A组件依赖于B组件。

依赖注入还有个特别高大上的名字,控制反转(Inversion of Control,IoC),有木有,是不是很难懂。

Spring推荐面向接口编程,更好地让规范和实现分离,写代码会更愉快……击掌欢呼好有道理的样子,好吧,我会试试的!!!

下面的示例是注入一个复杂属性,就是将一个配置好的bean作为另一个bean的属性:

src/cn/edu/cqupt/MySpring/bean/Axe.java
package cn.edu.cqupt.MySpring.bean;
/**斧子,六级没过,原谅我不认识这个单词*/
public interface Axe {public String chop();
}
src/cn/edu/cqupt/MySpring/bean/impl/StoneAxe.java
package cn.edu.cqupt.MySpring.bean.impl;
import cn.edu.cqupt.MySpring.bean.Axe;
public class StoneAxe implements Axe {@Overridepublic String chop() {return "石斧...";}
}
src/cn/edu/cqupt/MySpring/bean/impl/Person.java(setter、getter都删掉罗)
package cn.edu.cqupt.MySpring.bean.impl;
import cn.edu.cqupt.MySpring.bean.Axe;
public class Person {private String name;private int age;private Axe axe;public String toString(){return "Name:"+this.name+",age:"+this.age;}    
}
src/beans.xml(部分代码)
<?xml version="1.0" encoding="utf-8"?><bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><property name="name" value="xiaofeig"/><property name="age" value="20"/><property name="axe" ref="stoneAxe"/>
</bean>
<bean id="stoneAxe" class="cn.edu.cqupt.MySpring.bean.impl.StoneAxe"/>
src/cn/edu/cqupt/MyString/test/TestMain.java
package cn.edu.cqupt.MySpring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.cqupt.MySpring.bean.Axe;
import cn.edu.cqupt.MySpring.bean.impl.Person;
public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);Axe axe=person.getAxe();System.out.println(axe.chop());}
}
打印结果:石斧...
看这句<property name="axe" ref="stoneAxe"/>,axe表示Person的属性,stoneAxe是我们配置的是一个实例的编号,通过ref这个标签属性,我们就可以轻松地将stoneAxe实例注入到Person的属性中,看起来是不是也很easy。

我看书到537页的时候,觉得最重要的一点就是依赖注入通过配置的方式将Bean实例之间代码层次的耦合分离了出来,我们可以清晰地透过xml文件观察到Bean实例之间的依赖关系。

书上原话总结了Spring IoC容器的3个基本要点:

  • 面向接口编程可以将各组件之间的耦合提升到接口层次,从而有利项目后期的扩展
  • 应用程度的各组件不再有程序主动产生,而是有Spring容器来负责产生、并初始化
  • Spring采用配置文件、或Annotation(注解,书后面会有提到,不过我总是用不来,新事物的自然抵触)来管理Bean的实现类、依赖关系,Spring容器通过配置文件利用反射来创建实例(所谓的依赖注入)

可以看出,上面写的Demo都是Spring容器利用setter方法来为实例注入属性值的,其实,我们也可以让容器利用有参构造方法来直接创建一个实例,这就是书上提到的构造注入。

src/cn/edu/cqupt/MySpring/bean/impl/Person.java(setter、getter都删掉罗)
package cn.edu.cqupt.MySpring.bean.impl;
import cn.edu.cqupt.MySpring.bean.Axe;
public class Person {private String name;private int age;private Axe axe;public Person(){}public Person(String name,int age,Axe axe){this.name=name;this.age=age;this.axe=axe;}public String toString(){return "Name:"+this.name+",age:"+this.age;} 
}
src/beans.xml
<?xml version="1.0" encoding="utf-8"?>
<bean id="person" class="cn.edu.cqupt.MySpring.bean.impl.Person"><constructor-arg value="xiaofeig"/><constructor-arg value="20"/><constructor-arg ref="stoneAxe"/>
</bean>
<bean id="stoneAxe" class="cn.edu.cqupt.MySpring.bean.impl.StoneAxe"/>
src/cn/edu/cqupt/MySpring/test/TestMain.java
package cn.edu.cqupt.MySpring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.cqupt.MySpring.bean.impl.Person;
public class TestMain {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");Person person=context.getBean("person",Person.class);System.out.println(person);System.out.println(person.getAxe().chop());}
}
打印结果: Name:xiaofeig,age:20 石斧...

标签<constructor-arg/>就是用来构造注入的哦,标签的顺序就是构造参数的顺序,上面的实例比较简单,Person类只有一个有参构造方法,第二个属性在注入的时候直接将”20”转换成了整型,现在来假想一种情况,如果Person类还有一个构造方法,如:

打印结果: 
Name:xiaofeig,age:0 
石斧...

是不是秒懂啊,Spring容器会优先考虑上面的那个构造方法,如果我们想让Spring容器先调用含int age的构造方法,可以设置标签property的属性type值为’int’。

<constructor-arg value="20" type="int"/>
 
hint: specify index/type/name arguments for simple parameters to avoid type ambiguities
 

好了,简单地了解了这两种构造方法,设值注入和构造注入,个人还是比较喜欢设值注入啦相爱

转载于:https://www.cnblogs.com/fei-er-blog/p/4741892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

batchsize和数据量设置比例_Keras - GPU ID 和显存占用设定步骤

初步尝试 Keras (基于 Tensorflow 后端)深度框架时, 发现其对于 GPU 的使用比较神奇, 默认竟然是全部占满显存, 1080Ti 跑个小分类问题, 就一下子满了. 而且是服务器上的两张 1080Ti.服务器上的多张 GPU 都占满, 有点浪费性能.因此, 需要类似于 Caffe 等框架的可以设定 GPU ID …

Blazor University (17)使用 RenderFragments 模板化组件

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/使用 RenderFragments 模板化组件源代码[1]到目前为止&#xff0c;我们已经创建了基于参数生成 100% 渲染输出的组件&#xff0c;但组件并不总是那么简单。有时我们需要创建将…

OpenGL® ES 3.0 Programming Guide - Book Website

OpenGL ES 3.0 Programming Guide - Book Website http://opengles-book.com sample codes in GitHub: https://github.com/danginsburg/opengles3-book/

ArcGIS实验教程——实验六:空间数据格式转换

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】 空间数据从一个GIS平台跨到另一个GIS,必须经过格式转换,才能实现数据信息共享。本实验主要讲述空间数据矢栅互转、CAD(DWG)数据和Shapefile数据互转、栅格数据与ASCII文件之间的转换…

php基础教程 第五步 逻辑控制

逻辑判断 在开发项目时&#xff0c;竟然会出现逻辑控制。例如当用户输入“hello”时你需要自动回复“hello 欢迎”&#xff0c;当用户设置的定时时间到达时&#xff0c;你需要提醒用户时间已经结束&#xff1b;再举个例子&#xff0c;在玩网络游戏时&#xff0c;用户控制的角色…

在春意盎然的季节里初识GIT

Git 与 SVN 区别 GIT不仅仅是个版本控制系统&#xff0c;它也是个内容管理系统(CMS),工作管理系统等。 如果你是一个具有使用SVN背景的人&#xff0c;你需要做一定的思想转换&#xff0c;来适应GIT提供的一些概念和特征。 Git 与 SVN 区别点&#xff1a; 1、GIT是分布式的&…

WinForm混合Blazor(下)

有时&#xff0c;为了省事&#xff0c;我们也可以把窗体的控件注入到ServiceCollection中&#xff0c;在razor中订阅事件&#xff0c;这样就省了中间的桥梁&#xff0c;直接用控件当桥梁&#xff0c;下面以一个Button和Timer为例&#xff0c;来展示使用方式。本例是把Button和T…

ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】 本系列实验教程实验二讲述了栅格数据的数字化之前必须进行的操作--地理配准(地理配配准完整操作步骤),栅格地理配准和矢量空间校正都属于几何校正的内容,关于空间校正、地理配准、…

数据结构之冒泡排序

1 冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来 算法过程如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一…

博图程序需要手动同步_贴吧求助帖博图实例单按钮控制灯的程序

接上一期在贴吧看见的求助帖(上图看得见水印)&#xff0c;因为没人回复&#xff0c;发帖的楼主好像删除了帖子。结果我抽时间用博图15.1&#xff0c;S71200做了一个&#xff0c;希望给需要帮助的新人能够起到作用&#xff0c;感觉有用的话可以关注一下我的公众号低压电工&#…

操作系统,,,也考完了【流坑】

操作系统博大精深岂是区区2学分能容&#xff1f;学习了一些机制和理论模型之后课外还是要继续学习转载于:https://www.cnblogs.com/learn-to-rock/p/5447750.html

php基础教程 第六步 学习数组以及条件判断switch补充

条件语句 switch 在上一节的学习中&#xff0c;学习了php的条件语句if。在php编程中进行条件判断还可以使用switch语句。switch语句语法如下&#xff1a; <?php switch (值或表达式) { case 值等于值1:当值等于值1时要执行的代码break; case 值等于值2:当值等于值2时要执…

ArcGIS实验教程——实验八:矢量数据拼接

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】 数字化工作都是分工完成的,那么数字化完成之后,怎样将各部分数字化的成果拼接成一个完整的矢量数据呢?本实验针对线状和面状矢量数据,讲解矢量化数据拼接的常用方法:合并(merge)…

iOS 类库列表

1. LinqToObjectiveC #import "NSArrayLinqExtensions.h" 它为NSArray添加了许多方法&#xff0c;能让你用流式API来转换、排序、分组和过滤其中的数据。转载于:https://www.cnblogs.com/SimonGao/p/4747065.html

dotnet-exec 小工具

dotnet-exec 小工具Intro在之前的文章中很多会有一些示例代码&#xff0c;这些代码一般都是一些很小的示例&#xff0c;尤其是介绍一些新特性的示例&#xff0c;基本上不会引用其他包&#xff0c;只有 SDK 就可以执行&#xff0c;对于这些示例&#xff0c;一般会每个实例单独一…

安卓手机抓包charles乱码_charles-抓包Andriod 手机的设置

长按弹出修改后&#xff1a;charles如果不配置SSL通用证书&#xff1b;会导致HPPTS协议的域名抓取失败/乱码的现象&#xff1b;现在SSL越来越多&#xff0c;很多博客都上了SSL&#xff0c;支付相关的行业更是基础配置&#xff1b;charles配置SSL证书&#xff0c;算起来很简单&a…

分布式服务下的关键技术(转)

系统架构演化历程-初始阶段架构 初始阶段的小型系统 应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP&#xff08;linux、apache、mysql、php&#xff09;。 特征&#xff1a; 应用程序、数据库、文件等所有的资源都在一台服务器上。 描述&#xff1a; 通常服…

ArcGIS实验教程——实验九:矢量数据提取

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】本实验以矢量数据为实验数据,讲解矢量数据的提取方法及注意事项。 一、实验内容 1、直接选取,导出(所有要素) 2、导出视图范围中的所有要素 3、按指定的裁剪框裁剪数据 4、按指…

linux之sort命令

1 sort命令的参数 sort 参数(可以省略) file 具体参数如下 -b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的("-n"选项隐含该选项,测试发现都隐含) -c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序 -C:类似于&q…

php基础教程 第七步数组补充及循环基础

键值对 上一节中简单的了解了数组的定义、取值及存储&#xff0c;这一节补充一下上一节数组的内容。 在上一节中&#xff0c;我们知道索引是用来标记值的位置&#xff0c;通过索引可以取得当前位置的值。这种一个索引对应着一个值的关系是一个映射关系&#xff0c;称为键值对。…