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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

dotnet-exec 小工具

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

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

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

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

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

jemter在linux上怎么安装_办公便签软件怎么下载?怎么在电脑桌面上下载安装一款办公便签软件...

走进一间办公室的话&#xff0c;你会看到很多人都在电脑前辛勤地忙碌。确实&#xff0c;随着互联网技术的应用和普及&#xff0c;现在很多上班族都离不开电脑&#xff0c;甚至需要终日在电脑前伏案办公。也正是因为这样&#xff0c;很多人都想在电脑上下载安装一款办公便签软件…

MySQL服务安装

2019独角兽企业重金招聘Python工程师标准>>> 这里是5.7版本以上解压版的安装攻略~~~~~ 1.下载MySQL server https://dev.mysql.com/downloads/mysql/ 根据自己需要下载 2.解压放到指定文件夹。例如: C:\Program Files\MySQL 3.配置环境变量&#xff0c;在path中放入…

ArcGIS实验教程——实验十:矢量数据投影变换

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 投影变换是指将一种地图投影转换为另一种地图投影,主要包括投影类型、投影参数和椭球体参数等的改变。 二、实验内容 (一)工具箱实现 ArcGIS中,矢量数据的投影变化工具位于:工…

php基础教程 第八步循环补充

其它循环 上一节内容中&#xff0c;讲解了php中的循环&#xff0c;并且了解了for循环。for循环是php循环中的一种&#xff0c;在本节中继续讲解php循环&#xff1a;While循环、do…while循环、foreach 循环。 While循环 While循环和for循环类似&#xff0c;但是在它的圆括号…

Microsoft Graph 的 .NET 6 之旅

这是一篇发布在dotnet 团队博客上由微软Graph首席软件工程师 Joao Paiva 写的文章&#xff0c;原文地址&#xff1a;https://devblogs.microsoft.com/dotnet/microsoft-graph-dotnet-6-journey/。Microsoft Graph 是一个 API 网关&#xff0c;它提供了对 Microsoft 365 生态系统…

小鱼便签_同样是写便签,这样更酷

每天那么多的工作&#xff0c;总喜欢写一些Tips提醒自己。但是如果全部都写在小纸条上&#xff0c;贴在电脑边上&#xff0c;每日身边飞扬着无数小纸条&#xff0c;实在是太讨厌啦&#xff01;这时候&#xff0c;不妨试试一款电脑桌面便签软件——小鱼便签&#xff0c;让你的办…

ArcGIS实验教程——实验十一:影像拼接与提取

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 【实验描述】本实验讲述在ArcGIS软件中进行日常影像(栅格)数据的拼接与提取(裁剪)的工具与方法。影像的拼接常用到的工具是Mosaic和Mosaic To New Raster;影像提取分为按属性提取、形状或位置提…

php基础教程 第九步 自定义函数

自定义函数 在之前的课程我们有使用到php的系统函数&#xff0c;这些函数由系统定义。在开发中&#xff0c;有时候系统自带的函数满足不了我们开发时&#xff08;或其它情况&#xff09;&#xff0c;我们可以自定义函数。顾名思义&#xff0c;自定义函数就是自己定义函数。 自…

如何使用 C# 隐藏 Console 窗口?

咨询区 Stefan Steiger我有一个 Console 程序&#xff0c;它主要用来重启 IIS 以及删除临时文件&#xff0c;我现在期望它启动后隐藏自身&#xff0c;我在网上找了下面这段代码做了隐藏。static void Main(string[] args) {var currentProcess System.Diagnostics.Process.Get…

编写登陆接口

用任意一种语言实现登陆接口 作者&#xff1a;尹正杰 版权声明&#xff1a; 本篇博客仅仅用于交流学习使用&#xff0c;对一些小功能的实现&#xff0c;来练习对代码的熟练度。同时&#xff0c;本篇博客允许转载&#xff0c;用于互相交流学习&#xff0c;转载必须在博客声明原链…

php基础教程 第十步 阶段性知识补充

简 在php教程中前九步已经了解了php的一些基础知识。大多数人在了解完以上知识后脑子还是迷茫的&#xff0c;最多懂的一些我所讲解过的知识如何实现&#xff08;对象为零基础读者&#xff09;&#xff0c;如何搭建一个网站还是不知晓。没关系&#xff0c;接下来我们即将进入ph…

ArcGIS实验教程——实验十三:栅格空间插值分析

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) >>> 实验前必读:《完美解决ArcGIS10.x栅格空间插值报错无法进行和导出插值栅格结果出错的问题》 一、实验描述 一般情况下采集到的数据都是以离散点的形式存在的,只有在这些采样点上才有…

ARM路线的投机性和欺骗性

过去十年里&#xff0c;在自主CPU取得了长足进步的同时&#xff0c;一批企业积极引进英特尔、AMD、VIA、IBM、ARM、高通等公司的技术&#xff0c;或是成立合资公司&#xff0c;相对于X86、Power等处理器很容易被识别为技术引进CPU&#xff0c;ARM的欺骗性则要强很多&#xff0c…