初识Spring

什么是Spring

Spring是一个轻量级的,非注入式的框架。其目标是使应用程序对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行。

Spring的特点

①轻量级(Lightweight)
Spring 核心包容量不到1MBde 大小,可以在很多小型设备中使用Spring

②非侵入性(No intrusive)
增强应用程序组件的可重用性,减少对框架的依赖

③容器(Container)
根据配置文件自动生成对象及属性等,不用编写任何代码来产生对象

④Inversion of Control(IOC控制反转)与Dependency Injection(DI依赖注入)
IOC目的就是依赖于抽象;对象之间的关系由容器根据配置文件将依赖
注入指定的对象中

⑤AOP(Aspect-oriented programming)
基于代理及拦截器的机制,与Spring IOC 结合,采用运行时Weaving方式在
Spring框架的应用程序中使用各种声明式系统级服务。

⑥持久层(Persistent)
Spring提供DAO、编程事务与声明式事务,对于ORM工具(Hibernate、iBATIS)的整合及使用上简化。


Spring中两个重要的思想便是Inversion of Control(IOC控制反转)与Dependency Injection(DI依赖注入),下面谈谈对这两个思想的理解。


IOC控制反转的理解

如果一个类的合作对象的引用或依赖关系的管理由具体的对象来完成,会导致代码的耦合度和可测试性降低,这对面向对象系统的设计是非常不利的。控制反转就是,这些依赖关系通过把对象的依赖注入交给框架或者IOC来完成。

如有一个类FloppyWriter(底层模块)代表向软盘写入东西和一个类 Business(高层应用)要使用FloppyWriter的方法向软盘写入东西,那么

class FloppyWriter
{
    void saveToFloppy()
    {
        ……
    }

}
public class Business{
   private FloppyWriter writer=new FloppyWriter();
   public void save()
  {
      writer.saveToFloppy();//依赖于底层模块
  }
} 

直接在高层的应用程序中调用底层模块的API,导致应用程序对底层模块产生的依赖…

那么有一个问题:如果使用USB作为存储介质,该应用程序无法直接重用,需要修改。导致由于
底层模块的变化,造成高层的应用程序跟着变化。

为了解决上面的问题。可以对类进行如下改造,

public interface IDeviceWriter //接口,向设备写入
{
  public void saveToDevice();
} 

public class FloppyWriter implement IDeviceWriter
{
     public void saveToDevice()
     {
        //实际存储在软盘
     }
} 

public class Business{
   private IDeviceWriter writer;

    public void setDeviceWriter (IDeviceWriter writer)
     {
       this.writer=writer;
    } 
    public void save()
    {
        writer.saveToDevice();
    }
}

主程序:
Business bus=new Business();
bus.setDeviceWriter(new FloppyWriter());
bus.save();



//思考此时如果要向U盘写入文件怎么办,很简单建一个类USBWriter并实现save方法,并将主程序改为bus.setDeviceWriter(new FloppyWriter());

public class USBWriter implement IDeviceWriter{
     public void saveToDevice(){
     //实际存储在U盘
  }
} 

依赖关系的转移,高层模块不依赖于底层模块,必须依赖于抽象,实现必须依赖于抽象,而不是抽象依赖于实现。可以看到,无论底层的存储实现如何变动,对于Business类来说无须做任何修改。

DI依赖注入的理解

保留抽象接口,让组件依赖于抽象接口。当组件要与其他实际的对象发生依赖关系时,由抽象接口来注入依赖的实际对象。

有三种实现方式。
①Type 1 IoC:Interface injection(接口注入)
②Type 2 IoC: Setter injection(推荐使用)(setter方法注入)
③Type 3 IoC: Constructor injection(构造方法注入)

Type 1 IoC

public interface IDependency
{
  //在接口中声明注入方法
  public void saveToDevice(Map device);
} 
public class Business implement IDependency
{
    private Map device;
    public void saveToDevice(Map device)
    {
     this.device=device;//实现Business关系依赖
   }
}

使用该方式会要求实现接口,对象所在的容器也会使用这个接口,容器知道接口上的所有方法,所以可调用实现接口的对象完成依赖关系的注入!

依赖的接口越多,程序的侵入性越强,组件的重用性降低

Type 3 IoC

public class Business{
  public IDeviceWriter writer;
  public Business(IDeviceWriter writer)
  {
   this.writer=writer;
   }
  public void save()
  {
    writer.saveToDevice();
  }

//主程序
Business bus=new Business(new FloppyWriter());
bus.save();

使用该方式注入,可以在构造对象的同时,一并建立依赖关系,但如果依赖关系很多需要构造的参数很多,使用Type 2 IoC较为方便。

Type 2 IoC(重点,Spring的IOC容器)

//先实现接口
public interface IDeviceWriter //接口,向设备写入
{
  public void saveToDevice();
} 

//实现各个存储设备的写入

public class FloppyWriter implement IDeviceWriter
{
     public void saveToDevice()
     {
        //实际存储在软盘
     }
} 

public class USBWriter implement IDeviceWriter
{
     public void saveToDevice(){
     //实际存储在U盘
  }
} 

//实现business类
public class Business{
   private IDeviceWriter writer;

    public void setDeviceWriter (IDeviceWriter writer)
     {
       this.writer=writer;
    } 
    public void save()
    {
        writer.saveToDevice();
    }
}

//实现businessFactory工厂类获得business单例

public class businessFactory
{
    private static businessFactory factory;
    private Properties props;//通过属性文件读取包名
    private Business bus;
    private IDeviceWriter writer;

    businessFatory()
    {
        //在此实现通过属性文件获得包名并实现依赖注入
        bus=(Business)(Class.forName...);
        writer=(IDecviceWriter)(Class.forName...);
        bus.setWriter(writer);//完成注入
    }
}

//实现主程序
public class BusinessExample
{
    //主函数
    main
    {
        BusinessFactort bus=new BusinessFactory();
    }
}

如果使用了Type 2 IoC,需要改变写入的存储方式,如FloppyWriter 改为USBWriter,只需改变属性文件。但是Spring的为xml文件,原理是一样的。

如果有什么不懂欢迎评论。

<think>好的,我现在需要帮助用户了解Java EE环境下Spring的基本概念和入门知识。首先,用户明确提到了“Java EE Spring 入门教程 基本概念”,所以我的回答需要涵盖Spring的核心概念,并结合Java EE的环境。根据用户提供的引用内容,我需要整合这些信息,确保引用的正确使用。 首先,用户提供的引用中有关于Spring框架的优点、入门程序、配置文件以及控制反转的内容。我需要将这些内容组织成一个结构清晰的回答,分点解释基本概念,并可能包含一个简单的入门示例。同时,根据系统级指令,必须使用中文,正确使用LaTeX格式的数学公式(虽然这里可能不涉及数学公式,但要注意其他格式要求),并在引用处添加标识。 接下来,我需要确定回答的结构。通常,入门教程的结构可能包括框架简介、核心概念、优点、入门步骤、示例代码以及常见问题。用户的问题集中在基本概念和入门知识,所以应该重点放在Spring的核心概念,比如IoC控制反转)、DI(依赖注入)、Spring容器、配置文件等。同时,结合用户提供的引用中的代码示例,比如TestHelloSpring类和applicationContext.xml配置,可以展示一个简单的Spring应用创建过程。 另外,需要确保引用的正确引用。例如,引用[2]提到了Spring的优点,引用[3]和[5]提供了入门程序的代码示例,引用[4]涉及配置文件的结构。在回答中,当提到这些内容时,需要自然地添加引用标识,比如在解释控制反转时引用[5],在示例代码处引用[3]和[4]。 需要注意用户可能对Spring在Java EE中的作用不太清楚,需要简要说明Spring如何融入Java EE环境,比如简化企业级应用开发,整合其他Java EE技术等。同时,要避免过于深入的技术细节,保持入门级别的解释。 最后,生成的相关问题需要围绕Spring的基本概念和进一步学习的方向,比如IoC与DI的区别、Bean的作用域、Spring与其他框架的整合等。这些问题应帮助用户深化理解或进行下一步的学习。 现在,需要检查是否符合所有系统指令:使用中文、正确引用、LaTeX格式(虽然可能不涉及数学内容,但代码块需正确)、结构清晰、生成相关问题。同时确保引用标识正确,比如[^2]、[^3]等放置在对应的解释部分末尾。</think>### Java EE环境下Spring框架基本概念与入门指南 #### 一、Spring框架的核心概念 1. **控制反转IoC)** Spring通过IoC容器管理对象的生命周期和依赖关系。开发者不再手动创建对象,而是由容器完成对象的创建和依赖注入。例如,通过XML配置文件定义Bean后,可直接从容器中获取实例[^5]。 数学示例:若对象依赖关系可表示为$A \rightarrow B \rightarrow C$,IoC容器会自动完成依赖链的构建。 2. **依赖注入(DI)** 是IoC的具体实现方式,通过构造函数、Setter方法或注解将依赖对象注入目标对象。例如: ```xml <bean id="userDao" class="com.example.UserDaoImpl"/> <bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> <!-- 注入依赖 --> </bean> ``` 此处`userService`的`userDao`属性由容器自动注入[^4]。 3. **Spring容器** 核心接口为`ApplicationContext`,负责加载配置文件并管理Bean。常用实现类包括: - `ClassPathXmlApplicationContext`:从类路径加载XML配置 - `FileSystemXmlApplicationContext`:从文件系统加载配置 #### 二、Spring框架的优势 1. **解耦与模块化** 通过DI降低组件间耦合度,提升代码复用性。 2. **整合企业级服务** 支持事务管理、安全框架等Java EE服务集成。 3. **声明式编程** 通过AOP实现日志、事务等横切关注点的声明式管理。 #### 三、入门实践:HelloSpring示例 1. **配置XML文件** ```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.xsd"> <bean id="helloSpring" class="com.example.HelloSpring"/> </beans> ``` 此配置定义了一个名为`helloSpring`的Bean。 2. **Java测试类** ```java public class TestHelloSpring { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloSpring hello = (HelloSpring) context.getBean("helloSpring"); hello.show(); // 输出: "Hello Spring!" } } ``` 此处通过容器获取Bean实例并调用方法[^3]。 #### 四、Spring在Java EE中的角色 Spring通过整合JDBC、JPA、消息队列等模块,简化企业级应用开发。例如: - 使用`Spring MVC`构建Web层 - 通过`Spring Data`简化数据库操作 - 利用`Spring Security`实现权限控制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值