`
run_wang
  • 浏览: 163476 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

阐释Spirng(入门)

阅读更多
Spring是一个开源的控制反转(Inversion of Control ,Ioc) 和面向切面编程(AOP)的容器框架,它的主要目的是简化企业开发,
【IoC全名】:Inversion of Control ,翻译过来就是控制反转的意思,如果真正的想了解IoC控制反转到底什么,需要先了解DI(dependency Injection),也就是依赖注入。
依赖注入的优点:
Spring能有效地组织J2EE应用各层的对象,不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机的协调、运行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无需关心Service对象的具体实现,Service对象也无需关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写量将大大减少。
注:依赖注入让bean于bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
为什么要使用Spring也是就说Spring框架优点:
在项目中引入Spring立即可以带来一下好处:
1:降低组件之间的耦合度,实现软件各层之间的解耦。
    COntroller(控制层)----->Services(服务层)----->DAO(持久层)
通常我们在开发应用的时候,我们经常可以看到有这么一种结构:在控制层调用服务层,在服务层有可能再调用DAO层,如果使用Spring开发这样就可使各个层 互相独立,他们之间就不会发生代码之间的关联
如果我们要实现软件各层之间的解藕是通过面向接口实现的。
2:可以使用容器提供众多服务,如:事物管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务。也不需要处理复杂的事务传播
3:容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4:容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5:容器 提供的众多辅佐类,使用这些类能够加快应用的开发。如:JdbcTemplate、Hibernate Template。
6:Spring对于主流应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等 这样更便于应用的开发



Spring【 叙述】

Spirng集成IoC 、AOP

实际上对Spring的发展而言,它更多的情况下是使用Spring管理Hibernate及事务各种方面的管理
在了解Spring之前,必须要了解 【关于对象的产生问题】
因为在整个Spring里主要的一个就是对象产生的问题 这样就可以引申到接口这个重要概念上。在整个Spring中最大的重点就在这个接口上。
在接口中只要出现接口我们就应该联想到工厂设计


(针对接口操作)

对于产生一个对象 java中那几种常见的做法:
方法一:一直用new的方式 开辟对象
接口类型  对象名称=new  接口子类();
这种方法确实可以为街口实例化 ,但是在客户端调用时必须要明确知道有哪几个子类,直接造成了一个重要的缺点:两个程序之间紧密耦合

代码如下:

package com.xinyang.Inter;

public interface Fruit {
//吃水果
public void eat();
}



package com.xinyang.Imp;

import com.xinyang.Inter.Fruit;

public class Apple implements Fruit {
public void eat(){
  System.out.println("吃苹果....");
}
}



package com.xinyang.Imp;

import com.xinyang.Inter.Fruit;

public class Orange implements Fruit {

public void eat() {
  // TODO Auto-generated method stub
  System.out.println("吃橘子....");
}

}

下面来看下测试类:
package com.xinyang.services;

import com.xinyang.Imp.Apple;
import com.xinyang.Inter.Fruit;
import com.xinyang.factory.FruitFactory;

public class TestDemo01 {
public static void main(String[] args){
// Fruit f=FruitFactory.getfruitInstance(3);
  Fruit f=new Apple();
  f.eat();
}
}

这个客户端假设我们不要苹果换成橘子 ,这样需要修改客户端 ,这就是设计上的缺陷 ,整一个垃圾成品,所以我们采用下面的工厂设计
package com.xinyang.factory;

import com.xinyang.Imp.Apple;
import com.xinyang.Imp.Orange;
import com.xinyang.Inter.Fruit;

public class FruitFactory {
public static Fruit getfruitInstance(int i){
  Fruit f=null;
  if(i==1){
   //当i=1时认为是苹果
   f=new Apple();
  }
  if(i==2){
   //当1=2时认为是橘子
   f=new Orange();
  }
  return f;
}

}

客户端应改成
package com.xinyang.services;

import com.xinyang.Imp.Apple;
import com.xinyang.Inter.Fruit;
import com.xinyang.factory.FruitFactory;

public class TestDemo01 {
public static void main(String[] args){
int i=1;
  Fruit f=FruitFactory.getfruitInstance(i);
 
  f.eat();
}
}



这样我们可以根据i值进行选择 。

方法二:使用工厂设计模式:引进工厂类;通过上述代码可以解决客户端的与具体子类之间的耦合,确实可以解决耦合问题,但是在整个程序中,只要有一个接口就需要一个接口,如果接口过多则会造成工程过多
方法三:使用泛着机制Class.forName
联合IO操作,联合工厂设计,联合Properties类(代码量大,且不容易管理)
方法四:使用对象克隆:Object类中的clone方法(需要具体一个类的对象所以不予考虑)

Spring提供的是一个容器,是一个开发框架,所以通过Spring我们可以完成以上叙述前三种方法实现的功能 而这个功能我们就可以叫做IOC
通过上述我们可以知道一点 :Spring最重要是完全面向接口的设计,这也是开发应用过程中用到最多了 ,当然还有一些高级的管理。

Spring开发包分为两种:
核心Spring包:包含了Spring核心的开发文件
依赖Spring包:包含了大量的其他开源组件(文件比较大)

可以从www.springframeword.org下载最新的开发包

Spring环境搭建:
一:建立web工程 或者java项目都可以
二:我们可以从spring官方下载最新的jar导进去 或者 利用IDE工具集成的框架进行引入

在这里引入所需的核心jar即可

所有的容器框架都需要进行配置的,Spring配置文件配置的名称我们可以随意取,文件可以存放到任何目录下,我们可以从Spring参考手册或者Spring例子中就就可以得到Spirng配置模板

下面实例化spring容器
实例化Spring容器常用的两种方式
方法一:
在类路径下寻找配置文件来实例化容器
ApplicationContext ctx=new ClassPathXMLApplicationContext(new String[]{"applicationContext.xml"});

方法二:
在文件系统路径下寻找配置文件来实例化容器
ApplicationContext ctx=new FileSystemXMLApplicationContext(new String[]{"x://xxx.xml"});

注:Spring的配置文件可以指定多个,可以通过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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
</beans>

下面进行单元测试
在src目录  -

->右键 -->other-->java--->JUnit --->JUnit Test Case在这里我们选JUnit版本是4
代码如下:

package com.xinyang.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class SpringTest {
@Test
public void instanceSpring(){
  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
 
}
}

根据执行instanceSpring方法测试Spring环境搭建是否成功

Spring环境搭建完成后业务Bean就可以交给Spring进行管理,下面实现将外部的容器交给Spring进行管理也就是也就是所谓的依赖注入

<bean id="" name=""></bean>
id是为这个bean取的一个名称,这个Spring容器中是唯一的,如果我们需要获取这个bean我们是通过这个名称也即是id属相指定的名称来获取的,name属性同样是为bean取名的,id属性本身就属于xml的一个属性,这个属性受到xml解析器进行验证,id的值是不能包含特殊字符的 像/ 有的时候我们为bean取的名称需要这样特殊字符这时候我们就需要指定name属性,所以没有特殊字符我们指定id属性就可以了 这也就是为什么有了id有时还需要指定name属性!
spring开发团队建议我们bean的取名首字母小写

<bean id="fru" class="com.xinyang.Imp.Apple"></bean>
这样这个bean就创建好了 需要强调的是:这时候这个bean就可以由spring容器帮我们创建和维护 ,我们用到这个bean只需要获取就可以而不是创建

三:更该单元测试类 进行测试
package com.xinyang.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.xinyang.Inter.Fruit;
import com.xinyang.Inter.PersonService;


public class SpringTest {
@Test
public void instanceSpring(){
  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  Fruit f=(Fruit)ctx.getBean("fru");
  f.eat();
}
}
如果把<bean id="fru" class="com.xinyang.Imp.Apple"></bean>改成

<bean id="fru"    class="com.xinyang.Imp.Orange"></bean>       

这样我们就可以得到我们想要的结婚,而不去更改业务bean

使用Spring之后可以看出工厂类被取消了 而由spring代替工厂,证明spring中主要有两个操作,一个是替代工厂,第二个是所有的工厂在资源文件(.xml)进行管理
客户端代码之中 ,所有的代码的设计重要性变为接口

轻量级和重量级概念划分:
划分一个应用时候属于轻量级还是重量级,主要看它使用了多少服务,使用的服务越多,容器要为普通java对象做的工作就越多,必然会影响到应用的发布时间或者运行性能
对于Spirng容易,它提供了很多服务,但是这些服务并不是默认为应用打开的,应用需要某种服务,还需要指明使用该服务,如果应用使用的服务很少,如:只使用spring核心服务,那么就可以认为此事应用属于轻量级的,如果应用使用了Spring提供的大部分服务,只是应就属于重量级的。









对已有的方法抽取接口:(通过Eclipse向导实现) 业务类-->Refactor-->Extract Interface(抽取接口)
当然接口和实现类最好不要同一目录下 通过 名称-->Refactor-->Move 到具体的某个包中
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics