Spring1
一、Spring是什么?有什么用?
Spring的适用环境是这样的,假设现在有一个类port,它将提供一个返回消息的功能,代码如下:
public class port {
private weiboMessage weiboMessage;
public port(weiboMessage weiboMessage){
this.weiboMessage = weiboMessage;
}
public String getMessage(){
return weiboMessage.getMessage();
}
}
从getMessage方法中我们可以看到,返回的消息是通过weiboMessage这个对象的完成的,所以这个port类功能的实现,是需要在其内部创建这样一个对象,在这样的场景中port称作被注入对象,weiboMessage称作被依赖对象。
在开发的时候一个类的实现通常需要依赖其他对象,有时候还会出现这样的实现方法(其实大多数时候是这样实现的):
public String getMessage(){
weiboMessage weiboMessage = new weiboMessage();
return weiboMessage.getMessage();
}
在使用的时候再来创建这个对象,这样的主动的去获取对象其实是没有必要的,如果依赖的对象过多的话我们应该考虑转变依赖对象的方式。
在Spring中Ioc容器实现的就是改变我们使用依赖对象的方式,像上面那样被注入对象会直接依赖于被依赖对象,在Ioc中,Ioc将承担提供依赖对象的服务,所有的被注入对象和被依赖对象都将被Ioc所管理,被注入的对象需要什么就跟Ioc要。

二、注入方式
依赖注入的方式有三种,构造方法注入、setter方法注入和接口注入,这里就说一下前两种吧,因为接口注入我觉得好麻烦==
- 构造方法注入
public class port {
private weiboMessage weiboMessage;
public port(weiboMessage weiboMessage){
this.weiboMessage = weiboMessage;
}
......
}
这中场景下Ioc将会扫描被注入对象的构造方法,从而获取它的依赖对象列表,从而进行对象注入。
这种方法注入方式比较直观,对象构造完成就处于就绪状态,随时都可以使用。
- setter方法注入
public class port {
private weiboMessage weiboMessage;
public void setWeiboMessage(weiboMessage weiboMessage) {
this.weiboMessage = weiboMessage;
}
......
}
这样外界可以通过调用setter方法为被注入对象注入所依赖的对象了。这样可以在对象构造完成后再注入对象。
三、使用配置文件的方式实现依赖注入(xml方式)
首先创建一个表示功能的接口:
public interface port {
String getMessage();
}
然后是实现该接口的两个类(注入方式不同):
public class portAImpl implements port {
private weiboMessage weiboMessage;
public portAImpl(weiboMessage weiboMessage) {
this.weiboMessage = weiboMessage;
}
@Override
public String getMessage() {
return "A: " + weiboMessage.toString();
}
}
public class portBImpl implements port {
private weiboMessage weiboMessage;
public void setWeiboMessage(weiboMessage weiboMessage) {
this.weiboMessage = weiboMessage;
}
@Override
public String getMessage() {
return "B: " + weiboMessage.toString();
}
}
然后是weiboMessage这个类的实现,
public class weiboMessage {
private int id;
private String date;
private String message;
public weiboMessage(int id,String date,String message){
this.id = id;
this.date = date;
this.message = message;
}
public long getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "id: " + id +
"date: " + date +
"message " + message;
}
}
这样就实现了一个被依赖类weiboMessage,两个被注入类portAImpl和portBImpl。再然后是配置文件applicationContext.xml的编写:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <bean id="portA" class="com.ssh.respository.impl.portAImpl">
<constructor-arg>
<ref bean="weibomessage"/>
</constructor-arg>
</bean> <bean id="portB" class="com.ssh.respository.impl.portBImpl">
<property name="weiboMessage">
<ref bean="weibomessage"/>
</property>
</bean> <bean id="weibomessage" class="com.ssh.respository.weiboMessage">
<constructor-arg value="233"/>
<constructor-arg value="2018.3.26"/>
<constructor-arg value="a message"/>
</bean> </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。
这样就算配置完成了,然后是测试类:
public class test {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/applicationContext.xml");
port A = (port)context.getBean("portA");
port B = (port)context.getBean("portB");
System.out.println(A.getMessage());
System.out.println(B.getMessage());
}
}
运行结果是:
A: id: 233date: 2018.3.26message a message
B: id: 233date: 2018.3.26message a message
最后的使用分为以下两步:
第一步是我们使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。这个 API 加载 beans 的配置文件并最终基于所提供的 API,它处理创建并初始化所有的对象,即在配置文件中提到的 beans。
第二步是使用已创建的上下文的 getBean() 方法来获得所需的 bean。这个方法使用 bean 的 ID 返回一个最终可以转换为实际对象的通用对象。一旦有了对象,你就可以使用这个对象调用任何类的方法。
最后给一张这次的demo的项目结构吧,部署这种框架的时候也是经常在项目结构上出错,不过并不就是说我这个项目结构就是正确的,只是能运行而已:
蓝色标注的是我这次用到的,其他的是多余的没必要在意。

Spring1的更多相关文章
- 简单的Spring1.0小配置
开始Spring AOP的小理解 拿一个小例子来说吧! 老师上课 这样的例子! 老师上课--就是一个核心的业务! 那么上课之前需要点名,天气太热,需要开空调! 这个时候,一个老 ...
- Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse
框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...
- spring1冲刺感想与总结
感想与体会: 通过团队合作的第一个sprint,我们知道如何在团队合作中做好自己,还有与队友不合时,如何和平处理问题.产品负责人是一个重要的的角色,他负责任务的安排,处理合作中意见不统一的问题.通过这 ...
- Spring-----1、Spring一个简短的引论
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Spring-----1、Spring简介和Spring3.0的变化
转载自:http://blog.csdn.net/hekewangzi/article/details/41324441
- spring1——IOC之原理
spring框架的核心是IOC和AOP. 控制反转--IOC是一种编程思想,在spring中指的是对象的装配和管理交给了spring容器.这样做的好处是降低了系统之间的偶合度,既调用者不用再去创建被调 ...
- 从头认识Spring-1.14 SpEl表达式(1)-简单介绍与嵌入值
这一章节我们来讨论一下SpEl表达式的简单介绍与嵌入值. 1.SpEl表达式简单介绍 Spring Excpression Language (SpEL)语言支持在执行时操作和查询对象 事实上就是在执 ...
- 《Spring1之第十次站立会议》
<第十次站立会议> 昨天:试着把用C#写的代码转换为java语言. 今天:已基本转换为java语言了,也能够实现视频聊天这个功能了. 遇到的问题:在进行视频通话时没有考虑到声音优化功能,实 ...
- 《Spring1之第九次站立会议》
<第九次站立会议> 昨天:对用C#写的视频功能进行了相关的了解. 今天:试着把用C#写的代码转换为java语言. 遇到的问题:说实话,真心不好转换,转换过程中遇到了很多问题.
- 《Spring1之第八次站立会议》
<第八次站立会议> 昨天:我查找了关于实现视频功能的相关代码. 今天:对用C#写的视频功能进行了相关的了解. 遇到的问题:由于对C#不是很了解,所以其中的有些代码还是看不懂.
随机推荐
- 侦听器watch 监听单个属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MyBatis where、set、trim标签的用法
<!-- 4.3.1 where用法 <where>标签的作用:如果该便签包含的元素中有返回值,就插入一个where:如果 where后面的字符串是一and或or开头的,就将它们剔除 ...
- 动态规划(1)——最长子序列(LCS)问题
最长子序列问题:从中找出最长的字符序列,比如: cnblogs和belong.这两个字符串的最长子序列就是blog. 动态规划:通过分解大问题,不断的将大问题变成小问题,最终整合所有解,得出最优解(和 ...
- 从似然函数到EM算法(附代码实现)
1. 什么是EM算法 最大期望算法(Expectation-maximization algorithm,又译为期望最大化算法),是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型 ...
- cve-2018-2893 WebLogic
最近爆出来了新的漏洞cve-2018-2893 一.背景介绍 WebLogic是美国Oracle公司出品的一个Application Server,确切的说是一个基于JAVAEE架构的中间件,WebL ...
- 个人永久性免费-Excel催化剂功能第79波-自动及手动备份功能,比Onedrive还好用
在OFFICE365里,有个自动保存功能,可惜保存的地址是在Onedrive里,在中国国情下,备份十分卡顿,近乎难以忍受的慢.虽然现在收费性的网盘部分是可以有文件版本的备份功能,但也是繁琐且最要命的是 ...
- 回顾二分与bfs(或者说是递推)和简单模拟
今天,阳光正好,适合敲代码,诸事皆宜. 先来两道简单的模拟题. 第一道 机器翻译 输出为5. 代码思路:很明显需要用到队列来存单词,在建立一个bool数组来存储队列中有没有这个单词,需不需要向外界查询 ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- PHP正则匹配到2个字符串之间的内容,匹配HTML便签内容
PHP正则匹配到2个字符串之间的内容 $preg= '/xue[\s\S]*?om/i'; preg_match_all($preg,"学并思网址xuebingsi.com",$r ...
- UTF—8与UTF—8(无bom)格式
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...