精华内容
下载资源
问答
  • Spring IOC容器

    2017-08-18 20:22:00
    1.Spring框架简介 什么Spring? Spring开源的轻量...Spring为系统提供了一整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第方框架和技术整合应用,可以自由选择采用种技术进行开发 2....

    1.Spring框架简介

    什么是Spring?

    Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入

    Spring提供的IOC和AOP应用,可以将组件的耦合度降至最低,即解耦,便于系统日后的维护和升级

    Spring为系统提供了一个整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发

    2.容器和Bean管理

    Spring容器简介

    在Spring中,任何java类和javaBean都被当成Bean处理,这些Bean通过容器管理和应用

    Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象创建和Bean对象之间的解耦

    Spring容器有BeanFactory和ApplicationContext两种类型

    (什么是javaBean:一种简单规范的java对象;何时使用Spring:当需要管理javaBean对象时候就可以使用,Spring是最简洁的对象管理方案之一)

    Spring容器的实例化

    ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法,推荐使用该类型,实例化方法如下:

    //加载文件系统中的配置文件实例化

    String conf = “C:\applicationContext.xml”;

    ApplicationContext ac = new FileSystemXmlApplicationContext(conf);

    //加载工程classpath下的配置文件实例化

    String conf = “applicationContext.xml”;

    ApplicationContext ac = new ClassPathXmlApplicationContext(conf);

    Spring容器的使用

    从本质上讲,BeanFactory和ApplicationContext仅仅只是一个维护Bean定义以及相互依赖关系的高级工厂接口。通过BeanFactory和ApplicationContext我们可以访问bean定义

    首先在容器配置文件applicationContext.xml中添加Bean定义

    <bean id = "标识符" class = "Bean类型"/>

    然后在创建BeanFactory和ApplicationContext容器对象后,调用getBean()方法获取Bean的实例即可[getBean("标识符")]

    Bean的实例化

    Spring容器创建Bean对象的方法有以下三种:

    -用构造器来实例化

    <bean id = "calendarObj1"  class = "java.util.GregorianCalendar"/>

    <bean id = "calendarObj2"  class = "java.util.GregorianCalendar"/>

    (id或name属性用于指定Bean名称,用于从Spring中查找这个Bean对象;class用于指定Bean类型,会自动调用无参数构造器创建对象)

    -使用静态工厂方法实例化

    <bean id = "calendarObj2"  class = "java.util.Calendar"  factory-method = "getInstance"/>

    (id属性用于指定Bean名称,class属性用于指定工厂类型,factory-method属性用于指定工厂中创建Bean对象的方法,必须用static修饰的方法)

    -使用实例工厂方法实例化

    <bean id = "calendarObj3"  class = "java.util.GregorianCalendar"/>

    <bean id = "dateObj"  factory-bean = "calendarObj3"  factory-method = "getTime"/>

     (id用于指定Bean名称,factory-bean属性用于指定工厂Bean对象,factory-method属性用于指定工厂中创建Bean对象的方法)

    (将对象创建规则告诉Spring,Spring会帮你去创建对象;基于配置和默认规则,减少了代码的书写)

     Bean的命名

    Bean的名称:

    在Spring容器中,每个Bean都需要有名字(即标识符),该名字可以用<bean>元素的id或name属性指定;id属性比name严格,要求具有唯一性,不允许用"/"等特殊字符

    Bean的别名

    为已定义好的Bean,再增加另外一个名字引用,可以使用<alias>指定

    <alias  name = "fromName"  alias = "toName"/>

    Bean的作用域:

    Spring容器在实例化Bean时,可以创建以下作用域的Bean对象

    1、singleton作用域


    在每个Spring IOC容器中一个bean定义对应一个对象实例,默认项
    配置实例:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
    或者
    <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

    2、prototype


    一个bean定义对应多个对象实例
    配置实例:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
    或者
    <beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>

    3、request

    request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    request、session、global session使用的时候,首先要在初始化web的web.xml中做如下配置:


    如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:
    <web-app>...<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener>...</web-app>

    如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:
    <web-app>..<filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class></filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>...</web-app>
    接着既可以配置bean的作用域了:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>

    4、session

    session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效(在一个HTTPSession中,一个bean定义对应一个实例,仅限于Web环境)
    配置实例:
    和request配置实例的前提一样,配置好web启动文件就可以如下配置:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>

    5、global session

    在一个全局的HTTPSession中,一个bean定义对应一个实例,仅在基于portlet的Web应用中才有意义,Portlet规范定义了全局Session的概念
    配置实例:
    和request配置实例的前提一样,配置好web启动文件就可以如下配置:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>

    (上面的Bean作用域,可以通过<bean>定义的scope属性指定)

    Bean的生命周期回调

    指定初始化回调方法:

    <bean  id = "exampleBean"  class = "com.foo.ExampleBean"  init-method = "init">

    </bean>

    指定销毁回调方法,仅适用于singleton模式的bean:

    <bean  id = "exampleBean"  class = "com.foo.ExampleBean"  destroy-method = "destroy">

    </bean>

    在顶级的<beans/>元素中的default-init-method属性,可以为容器所有<bean>指定初始化回调方法

    <beans  default-init-method = "init">

      <bean id = "exampleBean"  class = "com.foo.ExampleBean"/>

    </beans>

    在顶级的<beans/>元素中的default-destroy-method属性,可以为容器所有<bean>指定销毁回调方法

    <beans  default-destroy-method = "destroy">

      <bean id = "exampleBean"  class = "com.foo.ExampleBean"/>

    </beans>

    Bean延迟实例化

    在ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化

    如果不想让一个singleton bean在ApplicationContext初始化时被提前实例化,可以使用<bean>元素的lazy-init = "true" 属性改变

    一个延迟初始化bean将在第一次被用到时实例化

    <bean id = "exampleBean"  lazy-init = "true"  class = "com.foo.ExampleBean"/>

    在顶级的<beans/>元素中的default-lazy-init属性,可以为容器所有<bean>指定延迟实例化特性

    指定bean依赖关系

    当一个bean对另一个bean存在依赖关系时,可以利用<bean>元素的depends-on属性指定

    <bean id = "beanOne"  class = "ExampleBean"  depends-on = "manager"/>

    <bean id = "manager"  class = "ManagerBean"/>

    当一个bean对多个bean存在依赖关系时,depends-on属性可以指定多个bean名,用逗号隔开

    <bean id = "beanOne"  class = "ExampleBean"  depends-on = "manager1,manager2"/>

    3.容器的IOC应用

    IOC概念

    IOC全称是Inversion of  Control,被译为控制反转;

    IOC是指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建,注入。第三方框架一般是通过配置方式指定注入哪一个具体实现,从而降低了对象之间的耦合度

    IOC按实现方法不同,可以分为依赖注入DI和依赖查找两种

    Spring容器是采用DI方式实现了IOC控制,IOC是Spring容器的基础和核心

    DI概念

    DI全称是Dependency  Injection,被译为依赖注入

    DI的基本原理就是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立联系,因此容器的工作就是创建bean时注入那些依赖关系

    IOC是一种思想,而DI是实现IOC的主要技术途径

    DI主要有两种注入方式,即Setter注入和构造器注入

    Setterr注入

    通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现setter方式的注入

    public class JDBCDataSource{

      private String driver;

      public void setDriver(String driver){

        try{

          Class.forName(driver);

          this.driver = driver;

          }catch(Exception e){

            throw new RuntimeException(e);

          }

         }

        //其他代码....

      }

    在容器xml配置中,配置注入参数

    <bean id = "dataSource"  class = "org.dao.JDBCDataSource">

      <property name = "driver"  value = "oracle.jdbc.OracleDriver"/>

      <property name = "url"  value = "jdbc.oracle:thin:@localhost:1521:XE"/>

      <property name = "user"  value = "openlab"/>

      <property name = "pwd"  value = "open123"/>

    </bean>

    构造器注入

    基于构造器的注入是通过调用带参数的构造器来实现的,容器在bean被实例化的时候,根据参数类型执行相应的构造器

    public class OracleUserDAO implements UserDAO{

      private JDBCDataSource dataSource;

      public OracleUserDAO(JDBCDataSource dataSource){

        this.dataSource = dataSource;

      }

      //其他代码.....

    }

    按构造器参数索引指定注入

    <bean id = "dataSource"  class = "org.dao.JDBCDataSource">

      <property name = "driver"  value = "oracle.jdbc.OracleDriver"/>

      <property name = "url"  value = "jdbc:oracle:thin:@localhost:1521:XE"/>

      <peoperty name = "user"  value = "openlab"/>

      <peoperty name = "pwd"  value = "open123"/>

    </bean>

    <bean id = "userDAO"  class = "org.dao.OracleUserDAO">

      <constructor-arg index = "0"  ref = "dataSource"/>

    </bean>

    自动装配

    Spring  IOC容器可以自动装配(autowire)相互协作bean之间的关联关系,autowire可以针对单个bean进行设置,autowire的方便之处在于减少xml的注入配置

    在xml配置文件中,可以在<bean/>元素中使用autowire属性指定自动装配规则,一共有五种类型值

    属性值为no:禁止自动装配,默认值;

    属性值为byName:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配;

    属性值为byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;

    属性值为constructor:与byType的方式类似,不同之处在于它应用于构造器参数;

    属性值为autodetect:通过bean类来决定是使用constructor还是byType方式进行自动装配,如果发现默认的构造器,那么将使用byType方式

    配置示例:

    <bean id = "userDAO"  class = "org.dao.OracleUserDAO">

      <constructor-arg index = "0"  ref = "dataSource"/>

    </bean>

    <bean id = "userService"  class = "org.service.UserService"  autowire = "byType"/>

    上述配置,在UserService中如果存在接收UserDao类型的方法Setter方法,Spring就可以自动将userDAO对象注入进去

    (自己总结,仅供参考。)

    转载于:https://www.cnblogs.com/ka-bu-qi-nuo/p/7392048.html

    展开全文
  • 调查发现 Antd 将所有组件都写入一项目中,这样方便组件统一管理,开发时不需要在多仓库之间切换,而且预览效果只需运行跟项目,而不是为每个组件开启一端口进行预览。其依赖的 ...
  • 三个接口 Spring 使其保持松散 运行应用程序 结束语 前言 Spring 一个开源框架,为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用一个组件,同时为 ...

             前言

    Spring 框架

    IOC 和 AOP

    面向方面的编程

    IOC 容器

    BeanFactory 接口

    IOC 示例

    三个接口

    Spring 使其保持松散

    运行应用程序

    结束语


    前言

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

    文章将主要介绍三个内容: 架构的功能,Spring 面向方面编程(AOP),控制反转 (IOC) 。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。

    Spring 框架

    Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。

    图 1. Spring 框架的 7 个模块

    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

    • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
    • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
    • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
    • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
    • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
    • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

    IOC 和 AOP

    控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

    在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

    类型 1 服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)
    类型 2 通过 JavaBean 的属性(例如 setter 方法)分配依赖性
    类型 3 依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开

    Spring 框架的 IOC 容器采用类型 2 和类型3 实现。

    面向方面的编程

    面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。

    AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。

    AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

    IOC 容器

    Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

    BeanFactory 支持两个对象模型。

    • 单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
    • 原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

    bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。

    BeanFactory 接口

    因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。

    清单 1. XmlBeanFactory

    BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

    在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。

    清单 2. getBean()

    MyBean mybean = (MyBean) factory.getBean("mybean");

    每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBeanFactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

    IOC 示例

    理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。

    我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

    • 信用级别评定服务,查询用户的信用历史信息。
    • 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。
    • 电子邮件服务,向用户发送有关信用卡状态的电子邮件。

    三个接口

    对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

    清单 3. CreditRatingInterface

    public interface CreditRatingInterface {
       public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
    }

    清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

    清单 4. CreditLinkingInterface

    public interface CreditLinkingInterface {
    public String getUrl();
            public void setUrl(String url);
            public void linkCreditBankAccount() throws Exception ;
    }

    信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

    清单 5. EmailInterface

    public interface EmailInterface {
          public void sendEmail(ICustomer iCustomer);
          public String getFromEmail();
          public void setFromEmail(String fromEmail) ;
          public String getPassword();
          public void setPassword(String password) ;
          public String getSmtpHost() ;
          public void setSmtpHost(String smtpHost);
          public String getUserId() ;
          public void setUserId(String userId);
       }

    EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

    Spring 使其保持松散

    这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单6 中可以看到信用卡帐户用例的实现。

    注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。

    清单 8. 装入 Spring 配置文件

    ClassPathXmlApplicationContext appContext = 
                        new ClassPathXmlApplicationContext(new String[] {
         "springexample-creditaccount.xml"
        });
    CreateCreditCardAccountInterface creditCardAccount = 
                        (CreateCreditCardAccountInterface)
        appContext.getBean("createCreditCard");

    结束语

    在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。

    由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式 (像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的信用卡帐户应用程序,要比从头开始构建它们容易得多。

    请继续关注这一系列的下一篇文章,我将在这里学习的知识基础上,介绍 Spring AOP 模块如何在企业应用程序中提供持久支持,并让您开始了解 Spring MVC 模块和相关插件。

    欢迎转载,转载请注明出处。
    欢迎加入 巨匠IT-Java/Scala/大数据/SpringCloud 技术讨论qq群:854150511

    本文转载至:https://www.t9vg.com/archives/556

    本文参考:https://www.ibm.com/developerworks/cn/java/wa-spring1/

    展开全文
  • 一.Spring框架简介  1.什么Spring ...同时它也为系统提供了一整体的解决方法,开发者除了可以应用它本身所提供的功能外,也可以与第方框架和技术整合应用,可以自由选择采用种技术进行开发。Spr...

     一.Spring框架简介

      1.什么是Spring

        Spring是一个开源的轻量级应用开发框架,目的在于简化企业应用程序的开发,减少侵入;它提供的IOC和AOP应用,可以将组件的耦合度降至最低,便于系统日后的维护和升级;同时它也为系统提供了一个整体的解决方法,开发者除了可以应用它本身所提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发。Spring的本质即是管理软件中的对象,如何创建对象和维护对象之间的关系。

    二.Spring容器和Bean管理

      1.Spring容器简介

        在Spring中,任何Java类和Javabean都被当成Bean处理,而这些Bean则通过容器进行管理和应用。Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象的创建和Bean对象之间的解耦。分为BeanFactory和ApplicationContext两种类型,其中ApplicationContext继承自BeanFactory接口,拥有更多的企业级方法,一般推荐使用该类型

      2.Spring容器的实例化

         介绍完Spring容器的基本概念之后,来对Spring容器进行实例化。

      ①创建java项目,导入相关jar包

        在Eclipse中新建一个Dynamic Web Project,就将它命名为SpringStudy,然后在lib文件夹下导入Spring相关的5个jar包

      ②新建Spring配置文件

        在src下新建ApplicationContext.xml文件,在配置文件中加入以下代码:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 
     3  <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
     5 xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
     6 xmlns:jpa="http://www.springframework.org/schema/data/jpa"
     7 xsi:schemaLocation="
     8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
    10 http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    11 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
    12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    13 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
    14 </beans>

      ③新建测试类

        导入JUnit4,进行单元测试,在TestCase类使用ApplicationContext进行容器的实例化,添加以下代码:

    package com.liu.Test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestCase {
        @Test
        public void test01(){
            String str = "ApplicationContext.xml";
            ApplicationContext ac = new ClassPathXmlApplicationContext(str);
            System.out.println(ac);
        }
    }

     

    运行test01方法,控制台输出如下结果即实例化成功:

    整个工程的结构如下图所示:

    至此我们已经成功的实例化了Spring容器

     

    转载于:https://www.cnblogs.com/LCH-7/p/8232806.html

    展开全文
  • 框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为 J2EE 应用程序开发提供集成的框架。在这篇由部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的...

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

    在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。

    请参阅 下载,下载 Spring 框架和 Apache Ant,运行本系列的示例应用程序需要它们。

    Spring 框架

    Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。

    图 1. Spring 框架的 7 个模块

    11b0f450f54d3d8bf32b5c890bba4f88.png

    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

    • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
    • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
    • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
    • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
    • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
    • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

    IOC 和 AOP

    控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

    在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

    类型 1服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)类型 2通过 JavaBean 的属性(例如 setter 方法)分配依赖性类型 3依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开

    Spring 框架的 IOC 容器采用类型 2 和类型3 实现。

    面向方面的编程

    面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。

    AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。

    AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

    IOC 容器

    Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

    BeanFactory 支持两个对象模型。

    • 单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
    • 原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

    bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。

    BeanFactory 接口

    因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。

    清单 1. XmlBeanFactory

    BeanFactory factory = new XMLBeanFactory(newFileInputSteam("mybean.xml"));

    在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。

    清单 2. getBean()

    MyBean mybean = (MyBean) factory.getBean("mybean");

    每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBeanFactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

    IOC 示例

    理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。

    我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

    • 信用级别评定服务,查询用户的信用历史信息。
    • 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。
    • 电子邮件服务,向用户发送有关信用卡状态的电子邮件。

    三个接口

    对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

    清单 3. CreditRatingInterface

    public interface CreditRatingInterface {
         public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
    }

    清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

    清单 4. CreditLinkingInterface

    public interface CreditLinkingInterface {
    public String getUrl();
            public void setUrl(String url);
            public void linkCreditBankAccount() throws Exception ;
    }

    信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

    清单 5. EmailInterface

    public interface EmailInterface {
          public void sendEmail(ICustomer iCustomer);
          public String getFromEmail();
          public void setFromEmail(String fromEmail) ;
          public String getPassword();
          public void setPassword(String password) ;
          public String getSmtpHost() ;
          public void setSmtpHost(String smtpHost);
          public String getUserId() ;
          public void setUserId(String userId);
       }

    EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

    Spring 使其保持松散

    这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到信用卡帐户用例的实现。

    注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单 7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。

    运行应用程序

    要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:,这会创建 C:spring-framework-1.2-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant。

    接下来,将源代码释放到文件夹,例如 c: 盘,然后创建 SpringProject。将 Spring 库(即 C:spring-framework-1.2-rc2dist 下的 spring.jarC:spring-framework-1.2-rc2libjakarta-commons 下的commons-logging.jar)复制到 SpringProjectlib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。

    打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令:build

    这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接信用卡帐户。CreateCreditAccountClient 还会通过ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。

    清单 8. 装入 Spring 配置文件

    ClassPathXmlApplicationContext appContext = 
                        new ClassPathXmlApplicationContext(new String[] {
         "springexample-creditaccount.xml"
        });
    CreateCreditCardAccountInterface creditCardAccount = 
                        (CreateCreditCardAccountInterface)
        appContext.getBean("createCreditCard");
    

    结束语

    在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。

    由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式 (像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的信用卡帐户应用程序,要比从头开始构建它们容易得多。

    请继续关注这一系列的下一篇文章,我将在这里学习的知识基础上,介绍 Spring AOP 模块如何在企业应用程序中提供持久支持,并让您开始了解 Spring MVC 模块和相关插件。

    展开全文
  • 框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为 J2EE 应用程序开发提供集成的框架。 在这篇由部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的...
  • Spring: Spring轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。...在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务 容器 (在 Spring 框架中 IOC 容器) 负...
  • 不去创建对象,但是描述创建它们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务。容器(IOC)将这些联系到一起。 Mybatis 支持普通sql查询,存储过程和高级映射的优秀持久...
  • 反向控制一种模式,决定着容器装配组件的方式,“实现必须依赖抽象,而不是抽象依赖实现”就是“反向控制的一种表现方式”,类似于面向接口编程。3.1.2 依赖注入(DI) Martin Fowler探究了“反向控制”的原理,...
  • JAVA监听器——Listener

    2020-08-15 06:06:16
    只有容器组件和元素组件可以成为事件源对象。 事件监听方法 用于捕获事件源对象上的动作 共有种事件监听方法:addActionListener(ActionListener l)、addMouseListener(MouseListener l)、addMouseMotionListener...
  • Java 构建微服务指南 1 要构建微服务 Java 是一非常好的选择如何在容器中使用 Java 构建微服务 本文为你讲述了种构建方案无论是哪种方案要实现微服务使用 Java 生态圈的 组件都是经过业界验证的 概览 在 Java ...
  • 详谈Java中的事件监听机制发布于 2020-3-21|复制链接下面小妖就为大家带来一篇详谈...在Java语言中所有的容器组件和元素组件都事件监听中的事件源对象。Java中根据事件的动作来区分不同的事件源对象,动作发生在...
  • Spring基本概念介绍

    2018-06-14 15:43:14
    框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用个组件,同时为J2EE应用程序开发提供集成的框架。为什么说Spring一站式的轻量级开源框架呢?EE开发可分成层架构,针对JavaEE的层结构,...
  • 在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务。容器负责将这些联系在一起。 IoC 设计模式重点关注组件的依赖性、配置以及生命周期。 Ioc 设计模式实现了 “ 面向接口编程,而...
  • spring 学习 AOP和IOC

    2016-09-23 17:16:00
    自11开始接触大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 ...在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务。容器 (在 Sprin...
  • Spring 框架简介

    2017-12-19 08:20:26
    框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为 J2EE 应用程序开发提供集成的框架。 在这篇由部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的...
  • Spring框架简介

    2017-09-24 20:11:11
    框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为 J2EE 应用程序开发提供集成的框架。 在这篇由部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层...
  • 框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为J2EE应用程序开发提供集成的框架。 在这篇由部分组成的Spring系列的第1部分中,我将介绍Spring框架。我先从框架底层模型的角度描述...
  • Spring 实例源码

    2017-12-26 19:34:37
    框架的主要优势之一就是其分层架构,分层架构允许您选择使用个组件,同时为 J2EE 应用程序开发提供集成的框架。 在这篇由部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的...
  • Spring 基础入门

    2010-03-26 11:15:00
    在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务。 容器 (在 Spring 框架中 IOC 容器) 负责将这些联系在一起。ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不...
  • 原创:体验spring(二)

    2011-04-21 20:29:00
    在代码中不直接与对象和服务连接,但在配置文件中描述个组件需要一项服务。容器负责将这些联系在一起。IoC设计模式重点关注组件的依赖性、配置以及生命周期。Ioc设计模式实现了“面向接口编程,而不是实现”的...
  • 谈谈你对Spring的理解?

    千次阅读 2018-09-11 22:09:48
    1.什么Spring? Spring开源的轻量级的应用开发框架,...Spring为系统提供了一整体的解决方案,开发者除了可以利用它本身具有的功能外,还可以与第方框架和技术进行整合应用,可以自由选择使用种技术...
  • S3_数据库基础知识

    2011-03-27 13:33:00
    2,数据库有哪三组件构成?数据库由表、列(称为字段)和行(称为记录和数据)组成。3,哪类数据库会在表中包含多维关系?数据库或关系型数据库管理系统包括多张通过关系相关联的表。4,数据库表中哪类键需要每项...
  • Spring面试题

    2015-05-06 07:19:39
    核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ☆ Spring 上下文:Spring 上下文是一配置文件,向 ...
  •  SessionBean: Stateless Session Bean 的生命周期容器决定的,当客户机发出请求要建立一Bean的实例时,EJB容器不一定要创建一新的Bean的实例供客户机调用,而是随便找一现有的实例提供给客户机。...
  • java 面试题 总结

    2009-09-16 08:45:34
    EJB容器是EJB组件的代理,EJB组件容器所创建和管理。客户通过容器来访问真正的EJB组件。 21、Static Nested Class 和 Inner Class的不同。 Static Nested Class被声明为静态(static)的内部类,它可以不依赖...
  • 6.13 实现第三个双向接口 6.14 创建C++双向接口客户机程序 6.15 创建Visual Basic客户机程序 6.15.1 后绑定 6.15.2 前绑定 6.16 小结 第七章 事件和连接点 7.1 接口的回调 7.2 引入和引出接口 7.2.1 Advise...
  • 关于系统性能的思考

    2009-04-24 14:24:42
    在评价一个系统的时候,性能指标很重要的,那么在当前J2EE的系统开发当中,如何来提高系统的性能呢?我觉得应该从对象管理...所以,下面就主要从三个方面入手来说一下我的想法。 第一:容器化系统功能性组件 ...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

容器组件是哪三个