Spring官方网站:https://spring.io/

  最早对象的创建是有new关键字,但是如果产生的类比较繁多或者复杂,就用工厂代替new关键字,但是工厂的控制能力有限,譬如对产生对象的生命周期,作用域都不能控制,后来就出现了Spring,Spring简单来说就是一个容器,核心就是:IOC和AOP

 1.1、控制反转(Inversion of Control)

  首先想说说IoC(Inversionof Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和 对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱 好、qq号、电话号、ip号 ………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比 如Connection等),对象始终会和其他的接口或类藕合起来。

  那么IOC是如何做的呢?有点像通过中介找房源,在我和卖家之间引入一个介质:房产中介。中介那里管理了非常多关于房子的资料,我可以向中介提出一个列表,告诉中介我的需求,比如说房子的大小、位置、价格、楼层、环境、等等......然后中介就会按照我的要求,提供给我一个房源,然后直接去和房主交涉就行了。简单明了,如果中介给我的房源不符合要求,我们就抛出异常。整个过程不再由我自己控制,而是由中介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生命周期的不再是引用他的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以叫做控制反转。

1.2、依赖注入(Inversionof Control)

  IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。 比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A 中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个 Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个 Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过 反射来实现注入的。

  1.2.1:使用属性的Setter方法注入

首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性。例如:为UserBiz类注入 UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置setter方法.,用 于进行依赖注入。

如何配置该bean呢?

 <bean id="userBiz" class="com.text.biz.impl.UserBizImpl">

 <property name="userDao">

 <ref>userDao</ref>

 </property>

 </bean>

以上就是一个使用属性的setter方法的方式进行依赖注入。

  1.2.2:使用构造器注入

第一,在PersonBiz类中注入PersonDAO和一个String类型的数据;在该类中,不用为PersonDAO属性和String数据类型的属性设置setter方法,但是需要生成该类的构造方法;如下

public class PersonBizImpl implements PersonBiz {

// 声明"依赖对象"PersonDAO

PersonDAO personDao = null;

// 声明"依赖的基本数据类型"

String str = null;

// 生成无参构造方法

public PersonBizImpl() {

super();

}

// 生成带参构造方法

public PersonBizImpl(PersonDAO personDao, String str) {

super();

this.personDao = personDao;

this.str = str;

}

public void addPerson() {

this.personDao.addPerson();

System.out.println(str);

}

}

第二,在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了<constructor-arg>节点,该节点有四个属性:

· index是索引,指定注入的属性,从0开始,如:0代表personDao,1代表str属性;

· type是指该属性所对应的类型,如Persondao对应的是com.aptech.dao.PersonDAO;

· ref 是指引用的依赖对象;

· value 当注入的不是依赖对象,而是基本数据类型时,就用value;

如下:

 <!-- 利用构造器配置依赖注入 -->

 <bean id="personDao" class="com.aptech.dao.impl.PersonDAOImpl"></bean>

 <bean id="personBiz" class="com.aptech.biz.impl.PersonBizImpl">

 <constructorargindex="0"type="com.aptech.dao.PersonDAO"ref="personDao"></constructor-arg>

 <constructor-arg index="1" value="Spring学习"></constructor-arg>

 </bean>

  1.2.2:使用字段(Filed)注入(用注解方式  @Autowired  @Resource)

  在Spring中,注入依赖对象可以采用手工装配或自动装配,在实际应用开发中建议使用手工装配,因为自动装配会产生许多未知情况,开发人员无法预见最终的装配结果。

手工装配依赖对象又分为两种方式:

  一种是在XML文件中,通过在bean节点下配置;如上面讲到的使用属性的setter方法注入依赖对象和使用构造器方法注入依赖对象都是这种方式。

  另一种就是在Java代码中使用注解的方式进行装配,在代码中加入@Resource或者@Autowired、

  怎样使用注解的方式来为某个bena注入依赖对象呢?

  首先,我们需要在Spring容器的配置文件applicationContext.Xml文件中配置以下信息,该信心是一个Spring配置文件的模板:

 <?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:tx="http://www.springframework.org/schema/tx"
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.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>

  

  注意:只有配置了红色部分的代码才可以引入注解的命名空间,否则报错。  以上的配置隐 式的注册了多个对注释进行解析的处理器:AutowiredAnnotationBeanPostProcessor、 CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 等。

  其次,在配置文件中打开<context:annotation-config>节点,告诉Spring容器可以用注解的方式注入依赖对象;其在配置文件中的代码如下:

 <beans>

 ……

 <context:annotation-config></context:annotation-config>

 ……

 </beans>

第三,在配置文件中配置bean对象,如下:

 <bean id="userDao" class="com.springtest.dao.impl.UserDAOImpl"></bean>

 <bean id="userBiz" class="com.springtest.biz.impl.UserBizImpl"></bean>

第四,在需要依赖注入的BIZ类中,声明一个依赖对象,不用生成该依赖对象的setter方法,并且为该对象添加注解:

 public class UserBizImpl implements UserBiz {

 @Resource(name="userDao")

 private UserDAO userDao = null;

 public void addUser() {

 this.userDao.addUser();

 }

 }

  

  其中,在Java代码中可以使用@Autowired或@Resource注解方式进行Spring的依赖注入。两者的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。

  比如:我们用@Autowired为上面的代码UserDAO接口的实例对象进行注解,它会到Spring容器中去寻找与UserDAO对象相匹配的类型,如果找到该类型则将该类型注入到userdao字段中;

  如果用@Resource进行依赖注入,它先会根据指定的name属性去Spring容器中寻找与该名称匹配的类型,例如:@Resource(name="userDao"),如果没有找到该名称,则会按照类型去寻找,找到之后,会对字段userDao进行注入。

  通常我们使用@Resource。

  使用注解注入依赖对象不用再在代码中写依赖对象的setter方法或者该类的构造方法,并且不用再配置文件中配置大量的依赖对象,使代码更加简洁,清晰,易于维护。

  在Spring IOC编程的实际开发中推荐使用注解的方式进行依赖注入。

  

最新文章

  1. jdk源码分析ArrayDeque
  2. Linux驱动程序学习【转】
  3. Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配
  4. [Python正则表达式] 字符串中xml标签的匹配
  5. 3D照片放大展示窗口
  6. 硬链接与软连接[转自vbird]
  7. 使用DS18B20设计温控系统
  8. 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货
  9. samba服务器概述
  10. SVN trunk、branch、tag的用法
  11. php常见面试问题
  12. DB Query Analyzer 6.01 is released, SQL Execute Schedule function can be used
  13. 【转载】java final 关键字的几种用法
  14. Unity端游无法下载资源问题
  15. Sqlserver直接附加数据库和设置sa密码
  16. VMware虚拟机环境配置--网络配置
  17. Asp.Net WebApi Get请求整理(一)
  18. 《Linux内核设计与实现》读书笔记三
  19. Linux 在文档中查找满足条件的行并输出到文件:
  20. struts框架总结

热门文章

  1. node系列2
  2. poj 2367 Genealogical tree (拓扑排序)
  3. ehcache简单使用
  4. iPad开发(相对于iPhone开发时专有的API)
  5. cookie机制
  6. OceanBase里面的rowkey是什么概念,是由哪些要素构成的?
  7. The TCP three-way handshake (connect)/four wave (closed)
  8. android颜色对应的xml配置值,颜色表
  9. JAVA Web 之 struts2文件上传下载演示(二)(转)
  10. javaweb之Filter详解(转)