重温Spring之旅1——控制反转IOC与依赖注入DI

来源:互联网 发布:公共网络摄像头 编辑:程序博客网 时间:2024/06/15 02:24

Spring介绍:

  • Spring是一个非常活跃的开源框架;它是一个基于IOC和AOP来构架多层JavaEE系统的框架,它的主要目地是简化企业开发。
  • Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring 。

Spring的模块介绍:

Spring 框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,
如下图所示: 

什么是控制反转(IOC)?

IOC就是 Inversion of Control 

public class Girl {
    private Boy boy = new Boy();
    public void kiss(){
       System.out.println(boy.getBoyObject());
    }
}

boy是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性。

到http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下。
* org.springframework.asm-3.0.2.RELEASE.jar
Spring独立的asm程序, Spring2.5.6的时候需要asmJar包,3.0开始提供他自己独立的asmJar。 
* org.springframework.beans-3.0.2.RELEASE.jar
所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。    
* org.springframework.context-3.0.2.RELEASE.jar
Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等。
* org.springframework.core-3.0.2.RELEASE.jar
包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。
* org.springframework.expression-3.0.2.RELEASE.jar
Spring表达式语言。
* org.apache.commons.logging-1.1.1.jar(spring-framework-3.0.2.RELEASE-dependencies)
第三方的主要用于处理日志。


例子:
Boy.java
package com.csii.a.ioc;public class Boy {public Boy() {super();System.out.println("这是boy的构造方法");}public void display(){System.out.println("我就是我。不一样的男孩");}}
beans.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"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!--    由spring容器创建Boy,此时IOC    id:为Boy对象命名    class:初始化的类(全路径)        spring底层:    Map<String,Object> map = new HashMap<String,Object>();    map.put("boy",Class.forName("com.csii.a.ioc.Boy").newInstance());    --><bean id="boy" class="com.csii.a.ioc.Boy"></bean></beans>
测试类App.java
package com.csii.a.ioc;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/csii/a/ioc/beans.xml");Boy boy = (Boy) ctx.getBean("boy");boy.display();}}

什么是依赖注入(DI)?

DI就是Dependency Injection

当我们把依赖对象交给外部容器负责创建,那么Girl类可以改成如下:
public class Girl{
    private Boy boy;
    public void kiss(){
        System.out.println(boy.getBoyObject());
    }
}
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

例子:
Boy.java
package com.csii.b.di;public class Boy {public Boy() {super();System.out.println("这是boy的构造方法");}public void display(){System.out.println("我就是我。不一样的男孩");}}
Girl.java
package com.csii.b.di;public class Gril {private Boy boy;public Boy getBoy() {return boy;}public void setBoy(Boy boy) {System.out.println("这是setBoy的方法:"+boy);this.boy = boy;}public Gril() {super();System.out.println("这是Gril的构造方法");}public void kiss(){boy.display();}}
beans.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"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!--    由spring容器创建Boy,此时IOC    id:为Boy对象命名    class:初始化的类(全路径)        spring底层:Map<String,Object> map      map.put("boy",Class.forName("com.csii.b.di.Boy").newInstance())    --><bean id="boy" class="com.csii.b.di.Boy"></bean><!--传递boy对象给gril,这个过程由spring容器处理,此时DI* property name="":Gril对象的属性* ref:注入对象,可将Boy对象注入给Gril对象中的属性--><bean id="gril" class="com.csii.b.di.Gril"><property name="boy" ref="boy"></property></bean></beans>
App.java
package com.csii.b.di;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class App {public static void main(String[] args) {/** * 当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命周期, * 所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。 *///通过路径的形式加载,使用类路径的形式加载,将bean.xml放置到src目录下ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");Gril gril = (Gril) ctx.getBean("gril");gril.kiss();}}

实例化Spring容器的方式:

实例化Spring容器常用的两种方式:

方法一:

在类路径下寻找配置文件来实例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
可以在整个类路径中寻找xml文件:
  • 通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下。
  • classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。

方法二:

在文件系统路径下寻找配置文件来实例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d:\\beans.xml“});
Spring的配置文件可以指定多个,可以通过String数组传入。

为何要使用Spring?

至少在我看来,在项目中引入spring立即可以带来下面的好处:
  • 降低组件之间的耦合度,实现软件各层之间的解耦。

  • 可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
  • 容器提供单例模式支持,开发人员不再需要自己编写实现代码。
  • 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
  • 容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
  • Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

使用Spring的好处:

当使用spring时,我们可以使用容器提供的众多服务:


0 0
原创粉丝点击