Spring学习(三)——Spring中的依赖注入的方式
【前面的话】
Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring。不知道为什么对Spring有一种莫名的喜欢感,也许是因为他的名字,有一种希望的感觉。
Spring学习过程中的总结和心得,本文在学习了什么是依赖注入和AOP以后,继续学习依赖注入的方式,请选择性阅读。
本文由牲口TT在博客园首次发表,转载请保持文章的完整性并注明:
作者:牲口TT。
链接:http://www.cnblogs.com/xt0810/p/3628402.html
【相关文章】
【依赖注入方式】
在前面的两篇文章中,学习了什么是依赖注入,什么是AOP,当然,那两篇文章也只是仅仅介绍什么是的问题,我想再通过学习,理解怎么做的问题,这篇文章就是学习在Spring中依赖注入一般是怎么注入的,注入的方式都有哪些,如果你还不理解什么是依赖注入,最好先读读前面两篇文章。
1. 依赖注入的方式:
1) 设值注入:IOC容器使用属性的setter方法来注入被依赖的实例。
2) 构造注入:IOC容器使用构造器来注入被依赖的实例。
3) 静态工厂注入:IOC容器使用静态工厂方法来注入被依赖的实例。
4) 实例工厂注入方式:IOC容器使用实例工厂方法来注入被依赖的实例。
2. setter注入:
主要代码如下——完整代码见【四个demo】 。
- 在Setter这种形式的注入中,Person类并不知道他要实例化的Car类,也就是具体类AuDi类在哪里,他只知道他调用了接口Car,具体的实例化是由Spring来进行的。
- 在测试中,MainTest类分别写了传统方式,也就是不使用Spring的情形,通过比较可以发现其实下面的等价的:
<bean id="person" class="Person">
<property name="car" ref="auDi" />
</bean>
<bean id="auDi" class="AuDi" />
上下等价:
Person person=new Person();
AuDi audi=new AuDi();
person.setCar(audi);
1) Person.java
public class Person {
private Car car;
public void setCar(Car car){
this.car =car;
}
public void driver(){
car.GuaDang();
car.CaiYouMen();
car.DaFangXiang();
}
}
2) MainTest.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args){
//setter方式进行依赖注入
//使用Spring依赖注入的方式进行注入
ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
Person boy =(Person) context.getBean("person");
boy.driver(); //传统方式进行依赖注入
/*Person person=new Person();
AuDi audi=new AuDi();
person.setCar(audi);
person.driver();*/
}
}
3) cartest.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="person" class="Person">
<property name="car" ref="auDi" />
</bean>
<bean id="auDi" class="AuDi" />
</beans>
3. 构造注入:
主要代码如下——完整代码见【四个demo】 。
- 在构造注入中,Person类并不知道他要实例化的Car类,也就是具体类AuDi类在哪里,他只知道他调用了接口Car,具体的实例化是由Spring来进行的。
- 在测试中,MainTest类分别写了传统方式,也就是不使用Spring的情形,通过比较可以发现其实下面的等价的:
<bean id="person" class="Person">
<constructor-arg ref="Car" />
</bean>
<bean id="Car" class="AuDi" />
上下等价:
AuDi audi=new AuDi();
Person person=new Person(audi);
1) Person.java
public class Person {
private Car car;
public Person(Car car){//构造器注入,传入的是car,也就是一个所有车型都必须实现的接口
this.car =car;//这里可以响应奥迪,宝马等任何一种车的实现。
}//这里Person类没有与任何特定类型的车发生耦合,对于Person来说,任何一种特定的车,只需要实现Car接口即可。具体是哪一种车型,对Person来说无关紧要。
public void driver(){
car.GuaDang();
car.CaiYouMen();
car.DaFangXiang();
}
}
2) MainTest.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
Person boy =(Person) context.getBean("person");
boy.driver();
}
}
3) cartest.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="person" class="Person">
<constructor-arg ref="Car" />
</bean>
<bean id="Car" class="AuDi" />
</beans>
4. 静态工厂注入:
主要代码如下——完整代码见【四个demo】 。
在MainTest类中就可以看出使用Spring和不使用Spring的区别。
1) CarFactory.java
public class CarFactory {
public static Car getCarInstance(String type){//静态方法,这样做的缺点是如果CarFactory被继承,getCar不能被重写。
Car carInstance = null;
if(type.equals("audi")){
carInstance=new AuDi();
}else if(type.equals("baoma")){
carInstance=new BaoMa();
}
return carInstance;
}
}
2) MainTest.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.xml.XmlBeanFactory; public class MainTest {
public static void main(String[] args){
//这是不使用Spring的情况
//如果是静态方法,直接通过类调用方法即可.
/*Car audicar=CarFactory.getCarInstance("audi");
audicar.Prepare();
audicar.Install();
audicar.Color();
Car baomacar=CarFactory.getCarInstance("baoma");
baomacar.Prepare();
baomacar.Install();
baomacar.Color();*/ //这是使用Spring的情况
//如果是静态方法,直接通过类调用方法即可.
ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
Car caraudi =(Car) context.getBean("audi");
caraudi.Prepare();
caraudi.Install();
caraudi.Color();
Car carbaoma =(Car) context.getBean("baoma");
carbaoma.Prepare();
carbaoma.Install();
carbaoma.Color();
}
}
3) cartest.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="audi" class="CarFactory" factory-method="getCarInstance">
<constructor-arg>
<value>audi</value>
</constructor-arg>
</bean>
<bean id="baoma" class="CarFactory" factory-method="getCarInstance">
<constructor-arg>
<value>baoma</value>
</constructor-arg>
</bean>
</beans>
5. 实例工厂注入:
主要代码如下——完整代码见【四个demo】 。
在MainTest类中就可以看出使用Spring和不使用Spring的区别。
1) CarFactory.java
public class CarFactory {
public Car getCarInstance(String type){//非静态方法
Car carInstance = null;
if(type.equals("audi")){
carInstance=new AuDi();
}else if(type.equals("baoma")){
carInstance=new BaoMa();
}
return carInstance;
}
}
2) MainTest.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.xml.XmlBeanFactory; public class MainTest {
public static void main(String[] args){ //这是不使用Spring的情况
//不是静态方法需要先实例化对象,然后在调用方法。
/*CarFactory carfactory =new CarFactory();
Car audicar=carfactory.getCarInstance("audi");
audicar.Prepare();
audicar.Install();
audicar.Color();
Car baomacar=carfactory.getCarInstance("baoma");
baomacar.Prepare();
baomacar.Install();
baomacar.Color();*/ //这是使用Spring的情况
//不是静态方法需要先实例化对象,然后在调用方法。
ApplicationContext context = new ClassPathXmlApplicationContext("cartest.xml");
Car caraudi =(Car) context.getBean("audi");
caraudi.Prepare();
caraudi.Install();
caraudi.Color();
Car carbaoma =(Car) context.getBean("baoma");
carbaoma.Prepare();
carbaoma.Install();
carbaoma.Color();
}
}
3) cartest.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="carfactory" class="CarFactory"/>
<bean id="audi" factory-bean="carfactory" factory-method="getCarInstance">
<constructor-arg>
<value>audi</value>
</constructor-arg>
</bean>
<bean id="baoma" factory-bean="carfactory" factory-method="getCarInstance">
<constructor-arg>
<value>baoma</value>
</constructor-arg>
</bean>
</beans>
【四个demo】
【命名空间】
《Spring实战》中对于Spring自带了多种XML命名空间,主要如下:
|
命名空间 |
用途 |
|
aop |
为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素 |
|
beans |
支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间 |
|
context |
为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Springzhujie |
|
jee |
提供了与Java EE API的集成,例如JNDI和EJB |
|
jms |
为声明消息驱动的POJO提供了配置元素 |
|
lang |
支持配置由Groovy, JRuby,货BeanShell等脚本实现的Bean |
|
mvc |
启用Spring MVC的能力,例如面向注解的控制器,视图控制器和拦截器 |
|
oxm |
支持Spring的对象到XML映射配置 |
|
tx |
提供声明试事务配置 |
|
util |
提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素 |
【参考资料】
1. 《Spring in action》 Craig Walls著 耿渊 张卫滨译
2. 《轻量级Java EE 企业应用实战》 李刚著
【后面的话】
有时感觉自己学习挺快的,有时会发现自己学习的节奏好慢,希望可以通过好好努力学习更多的技能。
分享:
芭蕉不展丁香结,同向春风各自愁
——TT
Spring学习(三)——Spring中的依赖注入的方式的更多相关文章
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- Spring学习笔记(8)——依赖注入
spring依赖注入使用构造器注入使用属性setter方法注入使用Field注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发 ...
- spring 配置bean的方法及依赖注入发方式
Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean 这里依据全类名配置bean <bean id="helloWo ...
- Spring学习-理解IOC和依赖注入
最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...
- Spring总结三:DI(依赖注入)
简介: 所谓的依赖注入,其实是当一个bean实例引用到了另外一个bean实例时spring容器帮助我们创建依赖bean实例并注入(传递)到另一个bean中,比如你使用Spring容器创建的对象A里面需 ...
- Spring学习:简单实现一个依赖注入和循环依赖的解决
依赖注入 什么是依赖注入 使用一个会创建和查找依赖对象的容器,让它负责供给对象. 当a对象需要b对象时,不再是使用new创建,而是从容器中获取,对象与对象之间是松散耦合的关系,有利于功能复用. 依赖: ...
- spring学习(三) ———— spring事务操作
前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...
- Spring学习02——控制反转、依赖注入
有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...
- Spring学习(三)-----Spring自动装配Beans
在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义“autowire”属性. <bean id="custom ...
随机推荐
- Sublime Text3 C++及Java开发环境配置
一.C++开发环境配置 1. 下载MingW 2. 环境变量配置,系统属性->高级设置->环境变量,如果Mingw装在c盘更目录,其它自己思考 (1)PATH 变量值中加入 C:\Min ...
- Spring-framework下载
下载版本,修改版本号就行. http://repo.springsource.org/libs-release-local/org/springframework/spring/4.3.2.RELEA ...
- nyoj 139 我排第几个--康拓展开
我排第几个 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...
- jsp EL 表达式
EL表达式 EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有E ...
- html初始化
建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异. 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼 ...
- Reducejoin sample
示例文件同sample join analysis 之前的示例是使用map端的join.这次使用reduce端的join. 根据源的类别写不同的mapper,处理不同的文件,输出的key都是stude ...
- [转]ionic 通过PouchDB + SQLite来实现app的本地存储(Local Storage)
本文转自:http://www.cnblogs.com/ailen226/p/ionic.html 首先声明,本教程参考国外网站(http://gonehybrid.com/how-to-use-po ...
- 如何利用ZBrush中的DynaMesh创建身体(二)
之前的ZBrush教程我们在了解了人体比例和结构的前提下,使用ZBrush®软件中的Append功能和InsertSphere笔刷添加躯干.本讲将参照图片继续对“亡灵僵尸”的形体结构进行细致刻画和使用 ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- HDU 4267 A Simple Problem with Integers --树状数组
题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val 操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...