我对轻量级(struts+spring+hibernate)j2ee的理解(二)

 

五、开发DAO

dao层的开发中我们将进入到spring框架,spring主要是以依赖注入、AOP为核心,下面是spring的框架图:

(1)    理解依赖注入(Dependency Injection

依赖注入是spring的核心机制,是spring实现组件松耦合的利器。在实际应用中,java对象不是孤立存在的,为了完成某项任务,java对象需要依靠其它对象来协助或分工完成任务。那么在一个对象里怎样引用其它对象呢?最直接的方法是new 一个其它对象,这种紧耦合的方式不符合软件设计的理念,组件的可重用性大大降低,使得每次开发都要重复发明轮子。第二种方法是利用工厂模式,间接获取对象引用。这种方法在依赖注入出现前是主要使用的方法,它虽然实现了对象间的松耦合,但又将工厂类耦合到了对象中,对象还是通过主动的方式显式的获取其它对象的引用,也降低了组件的重用性。第三种方法就现在大放光彩的依赖注入。它是建立在工厂模式的基础之上,但减去了对象和工厂类的耦合,把这个过程放在了“后台”,它核心机制是利用xml配置文件解耦,通过容器(container)读取xml配置文件来实例化各个java对象,以及将它们的引用注入给需要它们的对象中(在xml中配置)。其中良好的面向接口编程理念和合理的注入方式是依赖注入成功的关键所在。下面我们通过一个”hello world”小应用来体会一下spring的魅力(先将springjar添加到ClassPath)

1)首先我们编写一个对象接口:

package com.sample.spring;

 

public interface GreetingService{

    void sayHello();

}

(2)  实现该接口

package com.sample.spring;

 

public class GreetingServiceImpl implements GreetingService{

   private String greeting;

   public GreetingServiceImpl(){}

  

   //构造器注入

   public GreetingServiceImpl(String greeting){

       this.greeting=greeting;

   }

  

   public String getGreeting() {

       return greeting;

   }

   

   //设值注入

   public void setGreeting(String greeting) {

       this.greeting = greeting;

   }

 

   public void sayHello(){

       System.out.println(greeting+" say hello world!");

   }

}

在这个实现类中我定义了一个属性greeting,大家发现我们没有设置它的值,那么应用是怎样获得这个属性的值呢?换句话说怎样将这个属性值注入到它属性中呢?这就是依赖注入的魅力-----不必主动获取,你只要指明依赖关系,容器会自动给你,你不必关心或了解它的实现,它从哪来,只要拥有它的接口,你就可以利用它的接口方法来完成你任务。当然对象间的关系和依赖注入是要通过spring的配置文件来指定和完成的。下面我们来看看这个应用的spring配置文件:greeting.xml位于应用的根目录下

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >

<beans>

   <bean id="greetingService" class="com.sample.spring.GreetingServiceImpl">

      <property name="greeting" value="tom"></property>

   </bean>

</beans>

很简单,beans根元素下可以配置多个bean,每个bean代表一个需要配置的java对象,id为该对象接口的别名,在同一个配置文件里,id值不允许相同。class为该对象接口的实现类,通过配置文件可以随时改变它的接口实现类,因此很好的实现了松耦合。property属性表示需要依赖注入对象的属性为greetingvalue对应注入的值,spring自动调用对象的setGreeting(“tom”)方法完成依赖注入。我们可以改变value的值来改变注入给greeting的值。

   最后,我们写一个简单的java应用程序来调用这个组件。

package com.sample.spring;

 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

 

public class GreetingApp{

    public static void main(String[] args){

       ApplicationContext ctx=new FileSystemXmlApplicationContext("greeting.xml");

       GreetingService service=(GreetingService)ctx.getBean("greetingService");

       service.sayHello();

    }

}

此时控制台打印出:tom say hello world!

 

在上面的程序中用到了spring的两个类:

org.springframework.context.ApplicationContext

org.springframework.context.support.FileSystemXmlApplicationContext

ApplicationContextspring解析配置文件的应用上下文接口类

FileSystemXmlApplicationContext是它的一个实现类,将greeting.xml作为参数传递给它,应用会自动完成java对象的实例化和依赖注入。

ctx.getBean(“greetingService”)返回该对象的引用,参数为在配置文件中定义的id的值。由于是面向接口编程,可以把它upcast成接口类,最后调用接口方法sayHello(),实际执行的是它的实现类的sayHello()方法,这是利用java的多态和动态绑定机制实现接口和实现类的松耦合。总之使用spring就是使用接口编程和依赖注入来实现松耦合,这是spring的核心理念。接下来我们来看看AOP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值