Spring学习笔记(9.29)

来源:互联网 发布:c语言 base64 encode 编辑:程序博客网 时间:2024/06/14 13:41

Spring学习笔记(9.29

容器:所有的组件都被创建和装配,并且提供了所需的中间件服务(组件+中间件服务

POJO编程模型:

简单的Java对象,代表一种编程趋势,旨在简化Java应用程序(企业级java应用程序)的编码测试以及部署

 

EJB:提供了一种组件模式,让开发人员更关注系统业务方面开发忽略中间件需求(组件,线程,事务管理......),开发人员可以在任何时候将中间件的需求添加到系统中

 

组件:容器及其管理的组件提供的最重要的是可插拔的体系结构。组件需要实现一定的接口并且可以通过接口访问其他组件所提供的服务,不需要知道服务的具体实现类,容易使用不同的实现替换系统中的不同的组件

 

IOC

IOC(控制反转):依赖项的控制组件转到容器

IOC被认为是任何容器都需要提供的基本功能之一

IOC两种形式: 依赖查找

依赖注入

依赖查找:

 

   

(上述总结自Spring入门经典)



依赖注入简介:

J2EE中,查找上下文被成文JNDI上下文,通过JNDI上下文可以访问EJB组件以及其他资源,随着Spring Application Framework以及其他轻量级Ioc框架的实现依赖注入逐步流行,J2EEJava EE的转化中JNDI显示依赖查找转变为隐式依赖注入方法IOC通常被理解为依赖注入


IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉springA中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc

 

1.Spring框架,由Rod Johnson开发,是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系。

spring松耦合:

实现必须依赖抽象,而不是抽象依赖于实现


2.面向对象的概念,是一个很好的设计来打破系统进入一个组可重用的对象。然而,当系统变大,尤其是在Java项目,

庞大的对象依赖关系将一直紧密耦合引起对象难以管理或修改。在这种情况下,可以使用Spring框架作为一个核心模块轻松高效地管理所有的对象依赖。

pring 依赖注入(DI)是一个不错的选择。Spring可以让输出生成松散的耦合到输出发生器。

 

紧耦合:对象依赖关系将一直紧密耦合引起对象难以管理或修改即若不使用框架的示例若在本工程中调用不同的接口可能需要修改多处代码

Say接口代码:

 

ChineseSay接口代码:

 


若希望调用OperateCollection的子类中的say方法为中文只需修改配置文件即可

利用IOC实现OperateCollection类的重用不管调用何种语言的say OperateCollection类都不需要改的只需要实现Say接口即可


依赖注入的三种方式:

(1)接口注入

public interfaceSay {
    public voidsay();
}

 

public classChineseSay implementsSay {
    public voidsay() {
        System.out.println("Chinese say");
    }
}

public classEnglishSay implementsSay{
    public voidsay() {
        System.out.println("English");
    }
}

 

public classOperateCollection {
    privateSay say;
    public void operateTest(){
        say.say();
    }
    

public voidoperateTest(Say sayInterface){
        sayInterface.say();
    }

    public voidsetSay(Say say) {
        this.say= say;
    }
}

 

Public class Test{

Private OperateCollection op;

Public void say(){

Op.say(new ChineseSay());
}

}

2Set注入

Set注入指的是接受注入的类中定义一个Set方法,并在参数中定义需要注意的元素

public classOperateCollection {
    privateSay say;
    public void operateTest(){
        say.say();
    }

    public voidsetSay(Say say) {
        this.say= say;
    }
}

(2)构造注入

在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素

public classOperateCollection {
    privateSay say;
    public void operateTest(){
        say.say();
    }

    publicOperateCollection(Say say) {
        this.say= say;
    }
}

构造方式注入以及set注入applicationContext.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="Hello"class="com.spring.demo.Hello">
    <property name="name"value="ruanjianlin"/>
    <property name="id"value="12"/>
</bean>
    <bean id="operate"class="com.spring.demo.OperateCollection">
        <property name="say"ref="chinese"/><!--set注入 -->
      <constructor-argindex="0">
          <value>chinese</value>
      </constructor-arg>
    </bean>
    <bean id="chinese"class="com.spring.demo.ChineseSay"></bean>
    <bean id="english"class="com.spring.demo.EnglishSay"></bean>
</beans>

注入方式的选择:

构造注入在建造构造对象的同事一并完成依赖关系的建立,但如果要建立的对象关系很多会在构建函数上留下一长串参数,并且参数位置不方便确认

Set注入有明确的名称,但不能保证相关的数据或资源在执行时不被更改或设定

Spring核心容器

两个最基本最重要的包:org.springframework.beans org.springframework.context代码中大量引用了java中的反射机制,为Spring的反向控制特性提供了基础,两个包中最重要的类BeanFactory ApplicationContext Bean的配置文档中 beanid为通过BeanFactoryApplicationContext中获取实例时的唯一标识

如果一个bean有多个id那么其余的id可以认为是这个bean的别名class要保证路径的完整性

Singleton单例模式:默认为true每次向BeanFactory请求时仅返回一个实例 若要实现每次请求都返回新的实例则应该使得singleton=false

Bean的属性:

setter依赖注入:在调用无参的构造函数或者无参的静态工厂方法实例化配置文档中定义的Bean后通过调用Bean上的setter方法实现

 基于构造函数的依赖注入:在调用带参的构造函数或者无参的静态工厂方法实例化配置文档中定义Bean

<bean id="operate"class="com.spring.demo.OperateCollection">
    <property name="say"ref="chinese"/><!--set注入 -->
  <constructor-argindex="1">
      <value>chinese</value>
  </constructor-arg>
    <constructor-arg index="0">
        <ref bean="chinese"></ref>
    </constructor-arg>
</bean>

 

 

null值的处理:

 

<bean id="operate"class="com.spring.demo.OperateCollection">
    <property name="say"ref="chinese"/><!--set注入 -->
  <constructor-argindex="1">
    <!--  <value>chinese</value> -->

<!--方式一 -->
      <value>null</value>
  </constructor-arg>

<!--方式二 -->
    <constructor-arg index="0">
       <!-- <ref bean="chinese"></ref> -->
        <null/>
    </constructor-arg>
</bean>

使用依赖depends-on  在初始化operate之前强制初始化chinese

<bean id="operate"class="com.spring.demo.OperateCollection"depends-on="chinese">
    <property name="say"ref="chinese"/><!--set注入 -->
   <constructor-argindex="1">
    <!--  <value>chinese</value> -->
      <value>null</value>
  </constructor-arg>
    <constructor-arg index="0">
       <!-- <ref bean="chinese"></ref> -->
        <null/>
    </constructor-arg>
</bean>
<bean id="chinese"class="com.spring.demo.ChineseSay"></bean>
<bean id="english"class="com.spring.demo.EnglishSay"></bean>

 

Bean的初始化:

方法一:

InitDemo.java

方法一:public voidinit() {
    this.id1;
    this.name"initDemo1";
}

配置文档的书写:

<bean id="initTest"class="com.spring.demo.InitDemo"init-method="init">
</bean>

 

方式二:

InitDemo实现org.springframework.beans.factory.InitializingBean接口增加一个方法afterPropertiesSet()完成初始化工作

第一种方式没有添加接口即没有把代码耦合于Spring所以推荐第一种

Bean销毁

方法一:

方法一:<beanid="initTest"class="com.spring.demo.InitDemo"init-method="init"destroy-method="destoryObject">
</bean>

方法二:

实现org.springframework.beans.factory.DisposableBean接口,InitDemo实现DisposableBean接口增加一个销毁方法,然后config.xml中配置