【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo
0 Spring的依赖注入大致是这样工作的:
将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里。在调用者需要调用某个类时,不自行构造该类的对象,而是从Spring容器里拿。Spring容器会根据XML文件构造好。这样,如果需要替换类或更改对象的属性值,只需修改XML而不需要重编译,实现组件级别的低耦合,而不是类级别的低耦合。
依赖注入是Spring的基础,DAI等许多上层模块都依赖于它。当接触到Spring JDBC的时候我们会深刻体会到它的Easy-to-use。

1 Spring关键字:
DI:Dependency Injection,依赖注入。依赖指的是调用关系。A调用B则A依赖于B。注入指的是A不再new B对象,而是由Spring容器来注入B对象。
IoC:控制反转,对象不再由调用者来new,而是把new对象的任务交给Spring容器,Spring从XML中读取对象的属性值。
AOP:面向切面变成(区别于面向对象编程OOP)。so,切面是什么?一些公共行为?
DAI:Spring整合了针对多种数据库的访问方式(含JDBC、OXM等)
框架融合:可以融合Hibernate和Struts框架
解藕:为什么用了依赖注入就解藕了?
“神说:要有光。于是就有了光”
2 Spring下载:
源文件:springframework-4.1.6.zip
虽然下载到的压缩包并未以src命名,但源文件确实不包含可以直接使用的jar包,而是包含各个Spring模块的java类源代码。也许是需要将那些源代码加入到用户的项目中?活着自己编译出JAR?。方便用户修改Spring框架本身。目录中提供了import-into-eclipse.sh来引导我们将那些源代码构建城eclipse的项目,完成这一步之后才能导入到eclipse中。
移步 https://github.com/spring-projects/spring-framework
JAR包(RELEASE发行版):springframework-4.1.6-RELEASE
Spring官网改版后,不再直接提供JAR的下载链接。因为Spring自此只建议用MAVEN等依赖管理工具,而不是手动地复制JAR包到用户的项目目录,然后手动地将JAR导入为LIBRARY。
移步 repo.spring.io/libs-release-local/org/springframework/spring/ (这个站点除了由spring地发行版,还各个模块单独的RELEASE,还有许多其他资源)
3 用Demo说明如何使用Spring
a 对于像我这样对MAVEN不甚了解的菜鸟,最简单的办法还是把相关的JAR复制到项目里,然后添加为lib。Spring还需要commons-logging的库,否则会报ClassNotFoundException。下载,解压缩,把里面的jar包复制到项目里。
b 该写的类写好。比如:
package com.bean;
public abstract class Person {
String name;
int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age)
{
if(age>=0) this.age = age;
}
public void setName(String name)
{
if(name!=null) this.name=name;
}
public void show()
{
}
}
package com.bean;
public class French extends Person{
public French()
{
}
public French(String name, int age)
{
setName(name);
setAge(age);
}
public void show()
{
System.out.println("French - " + name + " " + age);
}
}
package com.bean;
public class Chinese extends Person{
public Chinese()
{
}
public Chinese(String name, int age)
{
setName(name);
setAge(age);
}
public void show()
{
System.out.println("Chinese - " + name + " " + age);
}
}
要写无参数的构造函数;
要写set方法和get方法;
要写public的set和get方法;
当然也可以写一些其他方法,因为对象创建出来是拿来用的不是拿来保存属性值的。
c 在src目录下面新建一个XML文件,例如appContext.xml。这个文件用于指导Spring容器构建什么样的对象。对于要用Spring容器构建对象的类,需要提供无参数的构造函数,否则报org.springframework.beans.BeanCreationException和org.springframework.beans.BeanInstantiationException等异常。
d appContext.xml的写法:
1 要写上xmlns,也就是XML namespace(命名空间),命名空间有唯一的URI。Java和XML都不会检查该URI是否有效,但是Spring会检查。因此要写上正确的URL。如果xmlns的URI是什么奇怪的东西而不是http://www.springframework.org/schema/beans,将报错提示找不到<beans>.
2 也要写上xmlns:xsi属性,这个是XML的规范,同样不能写其他奇怪的东西,必须写真正的XML规范的URL。浏览器可以访问到这个URL。
3 xmlns:aop之类的,爱写什么写什么。。。(Spring只是选择性强迫症,不检查这个)
4 xsi:schemaLocation要写正确的路径(Spring至少会先检查这里面的URL个数是不是偶数个 = =)
5 剩下就是告诉spring如何new对象了。
<bean id="变量名" name="包.类"> //一定要加双引号
<property name="属性的变量名"> //要双引号
<value>XXX<value> //要写正确的属性值,否则报类型错误异常。
</property>
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<!-- ApplicationContext Objects Configuration -->
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="what the fuck...here...a =3=oooooops!"
xmlns:tx="so what the fuck...here..tx" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
> <bean id="chinese" class="com.bean.Chinese">
<property name="name">
<value>"小明"</value>
</property>
<property name="age">
<value>10</value>
</property>
</bean> <bean id="french" class="com.bean.French">
<property name="name">
<value>"Von"</value>
</property>
<property name="age">
<value>11</value>
</property>
</bean>
</beans> <!--
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
>
-->
6 写个main函数:
使用ApplicationContext类来创建对象。这个方法是阻塞的,会等Spring搞完了再继续运行。实际上,用这一方式来创建对象相对与直接new,需要比较长的时间。ApplicationContext是个抽象类,他有三个子类,用来分别从不同的地方读取XML文件:
ClassPathXmlApplicationContext在src目录下找
FileSystemXmlApplicationContext从文件系统里找
XmlWebApplicationContext去Web项目里找
可以通过get方法得到构建好的对象的引用。这些代码都是不需要try的,前提是用户确保XML是正确的(否则代码不是抛异常这么简单,而是完全不能用)。
package com.bean; import org.springframework.context.*;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args)
{
Person p = null;
try{
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");
p = (Person) context.getBean("chinese");
p.show();
p = (French) context.getBean("french");
p.show();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
第一个Spring Demo到此结束。
7 为什么这样就解藕了?
在传统的模式中,new什么对象是代码里说了算的。如果将类的构建挪出来,并允许在外部的XML中定义如何构建他,就可以通过修改外部的XML文件来更改程序的行为,而不需要重新编译。
在传统的模式下,“神说,要有光”,然后神要去发明光,才会有。下一次我们想要黑色的光呢(当然没有光是黑色的),需要在“创世纪”这个程序的代码里修改new语句,在初始化阶段修改对象的属性,或者把new Light()改称new DarkLight(),但这最好保证两个类是同一个父类的多态类或来自同一个接口,并且没有不一致的其他方法。
在Spring中,“神说要有光,于是就有了光”,光是根据XML的配置来注入给神的。下一次我们想要黑色的光了呢,改一下XML里光对象的属性值,或者,把bean的class属性由Light改成DarkLight,重新运行“创世纪”程序,光就变黑了!
其他链接:
【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo的更多相关文章
- 搭建Spring开发环境并编写第一个Spring小程序
搭建Spring开发环境并编写第一个Spring小程序 2015-05-27 0个评论 来源:茕夜 收藏 我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
一.spring依赖注入使用方式 @Autowired是spring框架提供的实现依赖注入的注解,主要支持在set方法,field,构造函数中完成bean注入,注入方式为通过类型查找bean,即byT ...
- java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪
前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...
- JAVA框架 Spring 依赖注入
一:介绍 情景:我们在给程序分层的时候:web层.业务层.持久层,各个层之间会有依赖.比如说:业务层和持久层,业务层的代码在调用持久层的时候,传统方式:new 持久层类. 进而进行调用,这种方式会导致 ...
- java线程中如何使用spring依赖注入
实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来. 实验了几种方式,分别说一下优缺点. 1:写了工 ...
- 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired
大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...
- 二十7天 春雨滋润着无形 —Spring依赖注入
6月11日,明确."夏条绿已密,朱萼缀明鲜.炎炎日正午,灼灼火俱燃." IT人习惯把详细的事物加工成的形状一致的类.正是这种一致,加上合适的规范.才干彰显对象筋道的牙感和bean清 ...
- (转)编码剖析Spring依赖注入的原理
http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...
随机推荐
- 在LINQ TO SQL 中使用MVC3中的DataAnnotations 【MetadataType】
原文发布时间为:2011-04-07 -- 来源于本人的百度文章 [由搬家工具导入] http://stackoverflow.com/questions/1535662/asp-net-mvc-li ...
- RowFilter 对于已获取到的dataset进行过滤
原文发布时间为:2009-11-12 -- 来源于本人的百度文章 [由搬家工具导入] DataView的属性RowFilter使用方法 p.s. 重点在于DataView是DateTable相关联的一 ...
- solr6.6安装
1. 确保系统已经安装jdk1.8,以及Tomcat8. 注:使用Tomcat7会出现很多问题,我遇到的是直接打不开solr的index页面,看网上有网友说还会遇到各种css.js资源404..还有l ...
- 二叉树遍历 Morris
二叉树的遍历,先根遍历,不适用递归,存储空间为 O(1) 转自:http://chuansongme.com/n/100461 MorrisInOrder(): while 没有结束 如果当前节点没有 ...
- Network | CIDR
无类别(现在) 无类别域间路由(Classless Inter-Domain Routing.CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由IP数据包的对IP地址进行归类的方法. CI ...
- loj #100. 矩阵乘法
题目描述 这是一道模板题. 分别给定 n×p n \times pn×p 和 p×m p \times mp×m 的两个矩阵 A AA 和 B BB,求 A×B A \times BA×B. 输入格式 ...
- NOIP2016模拟赛三 Problem B: 神奇的树
题面 Description 有一棵神奇的树.这棵树有N个节点,在每个节点上都有宝藏,每个宝藏价值V[i]金币:对于每条边,每经过一次都要花费C[i]金币. 值得注意的是,每个宝藏只能领取一次(也可以 ...
- 开始docker
安装 docker 目前只支持64位系统 1.下载并安装,简直太方便了 $ curl -fsSL https://get.docker.com/ | sh 用例 .docker run hel ...
- android wifi 调试
(一)root你的Android(相信绝大多数人现在的手机已经ROOT了.(二)下载app: adbWireless,并安装到手机上.(三)安装adb工具包,其实,要在windows下使用ADB工具, ...
- HTML小技巧将table边框改为细线
HTML制作新手在用TABLE表格时,会碰到如何改变边线粗线,因为默认的TABLE边线设置即使是1px 是很粗的.因此会使用其他一些方法来制作出细线边框,这里介绍一种利用CSS来实现细线的方法,很有效 ...