一、Spring是什么?有什么用?

  Spring的适用环境是这样的,假设现在有一个类port,它将提供一个返回消息的功能,代码如下:

  1. public class port {
  2. private weiboMessage weiboMessage;
  3.  
  4. public port(weiboMessage weiboMessage){
  5. this.weiboMessage = weiboMessage;
  6. }
  7. public String getMessage(){
  8. return weiboMessage.getMessage();
  9. }
  10. }

  从getMessage方法中我们可以看到,返回的消息是通过weiboMessage这个对象的完成的,所以这个port类功能的实现,是需要在其内部创建这样一个对象,在这样的场景中port称作被注入对象,weiboMessage称作被依赖对象。

  在开发的时候一个类的实现通常需要依赖其他对象,有时候还会出现这样的实现方法(其实大多数时候是这样实现的):

  1. public String getMessage(){
  2. weiboMessage weiboMessage = new weiboMessage();
  3. return weiboMessage.getMessage();
  4. }

  在使用的时候再来创建这个对象,这样的主动的去获取对象其实是没有必要的,如果依赖的对象过多的话我们应该考虑转变依赖对象的方式。

  在Spring中Ioc容器实现的就是改变我们使用依赖对象的方式,像上面那样被注入对象会直接依赖于被依赖对象,在Ioc中,Ioc将承担提供依赖对象的服务,所有的被注入对象和被依赖对象都将被Ioc所管理,被注入的对象需要什么就跟Ioc要。

二、注入方式

  依赖注入的方式有三种,构造方法注入、setter方法注入和接口注入,这里就说一下前两种吧,因为接口注入我觉得好麻烦==

  • 构造方法注入
  1. public class port {
  2. private weiboMessage weiboMessage;
  3.  
  4. public port(weiboMessage weiboMessage){
  5. this.weiboMessage = weiboMessage;
  6. }
  7. ......
  8. }

  这中场景下Ioc将会扫描被注入对象的构造方法,从而获取它的依赖对象列表,从而进行对象注入。

  这种方法注入方式比较直观,对象构造完成就处于就绪状态,随时都可以使用。

  • setter方法注入
  1. public class port {
  2.  
  3. private weiboMessage weiboMessage;
  4.  
  5. public void setWeiboMessage(weiboMessage weiboMessage) {
  6. this.weiboMessage = weiboMessage;
  7. }
  8. ......
  9. }

  这样外界可以通过调用setter方法为被注入对象注入所依赖的对象了。这样可以在对象构造完成后再注入对象。

三、使用配置文件的方式实现依赖注入(xml方式)

  首先创建一个表示功能的接口:

  1. public interface port {
  2. String getMessage();
  3. }

  然后是实现该接口的两个类(注入方式不同):

  1. public class portAImpl implements port {
  2.  
  3. private weiboMessage weiboMessage;
  4.  
  5. public portAImpl(weiboMessage weiboMessage) {
  6. this.weiboMessage = weiboMessage;
  7. }
  8.  
  9. @Override
  10. public String getMessage() {
  11. return "A: " + weiboMessage.toString();
  12. }
  13. }
  1. public class portBImpl implements port {
  2.  
  3. private weiboMessage weiboMessage;
  4.  
  5. public void setWeiboMessage(weiboMessage weiboMessage) {
  6. this.weiboMessage = weiboMessage;
  7. }
  8.  
  9. @Override
  10. public String getMessage() {
  11. return "B: " + weiboMessage.toString();
  12. }
  13. }

  然后是weiboMessage这个类的实现,

  1. public class weiboMessage {
  2. private int id;
  3. private String date;
  4. private String message;
  5.  
  6. public weiboMessage(int id,String date,String message){
  7. this.id = id;
  8. this.date = date;
  9. this.message = message;
  10. }
  11. public long getId() {
  12. return id;
  13. }
  14.  
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18.  
  19. public String getDate() {
  20. return date;
  21. }
  22.  
  23. public void setDate(String date) {
  24. this.date = date;
  25. }
  26.  
  27. public String getMessage() {
  28. return message;
  29. }
  30.  
  31. public void setMessage(String message) {
  32. this.message = message;
  33. }
  34.  
  35. @Override
  36. public String toString() {
  37. return "id: " + id +
  38. "date: " + date +
  39. "message " + message;
  40. }
  41. }

  这样就实现了一个被依赖类weiboMessage,两个被注入类portAImpl和portBImpl。再然后是配置文件applicationContext.xml的编写:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-4.1.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
  11.  
  12. <bean id="portA" class="com.ssh.respository.impl.portAImpl">
  13. <constructor-arg>
  14. <ref bean="weibomessage"/>
  15. </constructor-arg>
  16. </bean>
  17.  
  18. <bean id="portB" class="com.ssh.respository.impl.portBImpl">
  19. <property name="weiboMessage">
  20. <ref bean="weibomessage"/>
  21. </property>
  22. </bean>
  23.  
  24. <bean id="weibomessage" class="com.ssh.respository.weiboMessage">
  25. <constructor-arg value="233"/>
  26. <constructor-arg value="2018.3.26"/>
  27. <constructor-arg value="a message"/>
  28. </bean>
  29.  
  30. </beans>

  <bean>....</bean>这样的标签就定义了一个类,Ioc中将会记录这个对象的信息,信息包括class类型、是否为抽象对象、构造方法参数及其他属性等。然后就可以根据id向Ioc发出请求就能得到相应的对象。

  先看id为weibomessage的中的<constructor-arg>标签表示将使用构造方法进行注入,这里根据构造方法中输入参数的顺序依次进行赋值,id=233,date=2018.3.26,message=a message。

  id为portA也同样类似,不过它注入的对象是已经在Ioc容器中已经被注册的类,所以<constructor-arg>标签中的<ref>标签中的bean属性值将是已被注册类的id

  前两个都是使用构造方法进行注入的,id为portB的就是使用setter方法进行注册的,使用的是<property>标签,name的值与setter方法的名字有关,bean就是id。

  这样就算配置完成了,然后是测试类:

  1. public class test {
  2. public static void main(String[] args){
  3. ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/applicationContext.xml");
  4. port A = (port)context.getBean("portA");
  5. port B = (port)context.getBean("portB");
  6.  
  7. System.out.println(A.getMessage());
  8. System.out.println(B.getMessage());
  9. }
  10. }

  运行结果是:

  1. A: id: 233date: 2018.3.26message a message
  2. B: id: 233date: 2018.3.26message a message

  最后的使用分为以下两步:

  第一步是我们使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。这个 API 加载 beans 的配置文件并最终基于所提供的 API,它处理创建并初始化所有的对象,即在配置文件中提到的 beans。

  第二步是使用已创建的上下文的 getBean() 方法来获得所需的 bean。这个方法使用 bean 的 ID 返回一个最终可以转换为实际对象的通用对象。一旦有了对象,你就可以使用这个对象调用任何类的方法。

  

  最后给一张这次的demo的项目结构吧,部署这种框架的时候也是经常在项目结构上出错,不过并不就是说我这个项目结构就是正确的,只是能运行而已:

  蓝色标注的是我这次用到的,其他的是多余的没必要在意。

 

  

  

Spring1的更多相关文章

  1. 简单的Spring1.0小配置

    开始Spring AOP的小理解 拿一个小例子来说吧!    老师上课   这样的例子!    老师上课--就是一个核心的业务!     那么上课之前需要点名,天气太热,需要开空调! 这个时候,一个老 ...

  2. Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse

    框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...

  3. spring1冲刺感想与总结

    感想与体会: 通过团队合作的第一个sprint,我们知道如何在团队合作中做好自己,还有与队友不合时,如何和平处理问题.产品负责人是一个重要的的角色,他负责任务的安排,处理合作中意见不统一的问题.通过这 ...

  4. Spring-----1、Spring一个简短的引论

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. Spring-----1、Spring简介和Spring3.0的变化

    转载自:http://blog.csdn.net/hekewangzi/article/details/41324441

  6. spring1——IOC之原理

    spring框架的核心是IOC和AOP. 控制反转--IOC是一种编程思想,在spring中指的是对象的装配和管理交给了spring容器.这样做的好处是降低了系统之间的偶合度,既调用者不用再去创建被调 ...

  7. 从头认识Spring-1.14 SpEl表达式(1)-简单介绍与嵌入值

    这一章节我们来讨论一下SpEl表达式的简单介绍与嵌入值. 1.SpEl表达式简单介绍 Spring Excpression Language (SpEL)语言支持在执行时操作和查询对象 事实上就是在执 ...

  8. 《Spring1之第十次站立会议》

    <第十次站立会议> 昨天:试着把用C#写的代码转换为java语言. 今天:已基本转换为java语言了,也能够实现视频聊天这个功能了. 遇到的问题:在进行视频通话时没有考虑到声音优化功能,实 ...

  9. 《Spring1之第九次站立会议》

    <第九次站立会议> 昨天:对用C#写的视频功能进行了相关的了解. 今天:试着把用C#写的代码转换为java语言. 遇到的问题:说实话,真心不好转换,转换过程中遇到了很多问题.

  10. 《Spring1之第八次站立会议》

    <第八次站立会议> 昨天:我查找了关于实现视频功能的相关代码. 今天:对用C#写的视频功能进行了相关的了解. 遇到的问题:由于对C#不是很了解,所以其中的有些代码还是看不懂.

随机推荐

  1. 【搜索引擎】 PostgreSQL 10 实时全文检索和分词、相似搜索、模糊匹配实现类似Google搜索自动提示

    需求分析 要通过PostgreSQL实现类似Google搜索自动提示的功能,例如要实现一个查询海量数据中的商品名字,每次输入就提示用户各种相关搜索选项,例如淘宝.京东等电商查询 思路 这个功能可以用 ...

  2. S7-1200与S7-200 通信西门子链接

    只要这两从站的通讯格式时一样的,而且都为modbus rtu格式的话,是可以走modbus通讯.你在用主站在编程时直接调用modbus rtu通讯库.同时200做为从站,在程序里面将从站的程序写好. ...

  3. c++学习书籍推荐《C++ GUI Qt 4编程(第2版)》下载

    下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 <C++ GUI Qt 4编程(第2版)>讲授的大量Qt4编程原理和实践,都可以轻易将其应用于Qt4.4.Qt4.5及后续版本的Q ...

  4. 剑指offer第二版-9.用两个栈实现队列

    描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...

  5. 学习 Vue ,从入门到放弃

    最近项目刚完成,手上工作稍微轻松些,准备储备下技术,为未来挑战做好准备. 之前项目用的较多的是angulajs,不过版本较老,还停留在1.5x系,虽然结合了webpack,es2015等前沿技术,但理 ...

  6. 5.Ray-Handler之ToReadHandler编写

    如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派 ...

  7. TLS示例开发-golang版本

    目录 前言 制作自签名证书 CA 服务器证书相关 客户端证书相关 证书如何验证 在浏览器中导入证书 导入证书 修改域名 golang服务端 目录 main.go 测试 参考 前言 在进行项目总结的时候 ...

  8. TCP传输协议中如何解决丢包问题

    TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...

  9. Java零基础个人学习路线总结

    之前学习Java的时候走过一些弯路,一直想写一篇文章来总结下自己对自学Java的认识.趁着这次开通专栏的机会整理一篇文章,既可以巩固所学,也可以为后来境遇相同的人做个参考. 首先提出几个问题 Java ...

  10. C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作

    连载目录    [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...