`

Spring Framework创建对象时间、初始化与销毁、IOC与DI结合的真正意义……

 
阅读更多

恍恍惚惚大二一年又过去了,马上要进入大三了,第一篇博客是刚上大二时候写的,到现在怎么感觉博客质量倒不如从前了,一直忙碌,却感觉没有忙出什么成效来,更博也少了,也只是贴上些代码,文字的描述更少了,感觉自己变得敷衍了,看来是应该反思反思这一年都干了什么。好吧,废话也不多说了,先贴上这篇最近学习spring的一点总结吧

1.什么是SpringSpring是用来干嘛的?

Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.

Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring

 Spring就是一个容器

2.Spring的配置文件 

     默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的。

3.Spring创建对象的时间

a.(在默认的情况下,启动Spring容器的时候创建对象)

好处:因为是在Spring容器启动的时候就创建对象,所以只要配置文件书写错误,在一开始的时候(web容器启动)就能发现错误

    b.懒加载lazy-init=true (context.getBean时才要创建该对象)

   

<bean id=”” class=”” lazy-init=”true”></bean> 

 

 

 

4.怎么证明Spring容器是单例的还是多例的

 

  a.我们可以写一个小例子,看地址,在Spring容器中的对象默认是单例的,因为对象是单例的,所以只要在类上声明一个属性,该属性中含有数据,那么该属性是全局的(这么做是很危险的),如下图

   <bean id="helloWorld" class="com.zkx.spring.scope.HelloWorld"></bean>

测试:

@Test
public void testScope_Default(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");

HelloWorld helloWorld2 = (HelloWorld)context.getBean("helloWorld");

System.out.println(helloWorld);

System.out.println(helloWorld2);

}

 

 

结果 com.zkx.spring.scope.HelloWorld@43763e0b

  com.zkx.spring.scope.HelloWorld@43763e0b

 证明了Spring容器中的对象默认是单例的

 

 

  b.如果说scopeprototype的时候,spring容器产生的对象就是多实例,无论lazy-init为什么值,都是在context.getBean时才要创建对象

  <bean id="helloWorld2" class="com.zkx.spring.scope.HelloWorld"

   scope="prototype"></bean>

 

测试结果是2个不同的地址,这里就不上测试代码了

 

:web开发中,通常把Srvice层和Dao层放进Spring容器中,整成单例的,这样你在浏览器输入一个url,一千次访问,一万次访问,Action调用Service,Service调用Dao,那么也只会产生一个Srvice层的对象和一个Dao层的对象,那么JVM销毁这些对象的压力大大减轻

 

5.什么是IOC?

IOC:Inversion of Control 控制反转

IOCSpring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。

 

 

6.Spring的初始化和销毁

applicationContext.xml文件中,加上下面的代码

<bean id="helloWorld" class="com.zkx.spring.initdestroy.HelloWorld"

init-method="init"

destroy-method="destroy"></bean>

初始化方:init-method

销毁方法 :destroy-method

 

public class HelloWorld {

public HelloWorld(){

System.out.println("aaaa");

}

public void hello(){

System.out.println("hello world");

}

public void init(){

System.out.println("init");

}

public void destroy(){

System.out.println("destroy");

}

}

 

 

 

@Test

public void testInitDestroy(){

ApplicationContext context = 

new ClassPathXmlApplicationContext("applicationContext.xml");

HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");

helloWorld.hello();
ClassPathXmlApplicationContext applicationContext = (ClassPathXmlApplicationContext) context;
applicationContext.close();//spring容器关闭

}

 

 

测试结果:

aaa

Init

Helloworld

destory

Spring容器关闭时,调用销毁方法,如果spring容器没有执行close方法,则不执行销毁方法,如果spring容器执行了close方法,在执行该方法之前要执行销毁方法;在构造方法之后,立刻执行init方法(destroy用途不是很大,init方法用途很多)

7.Spring的执行流程

 

 

8.DI?

DI:Dependency Injection 依赖注入

 依赖注入简单的说就是给属性赋值,有2种注入的方法:

 a.使用构造器注入

使用xml的注入方式

   通过参数的顺序

<constructor-arg index="0">

      <value>张三</value>

</constructor-arg>

<constructor-arg index="1">

       <value>56</value>

 </constructor-arg> 

 

 

  通过参数的类型

<constructor-arg type="java.lang.Integer">

              <value>56</value>

       </constructor-arg>

       <constructor-arg type="java.lang.String">

              <value>张三</value>

</constructor-arg>

 

 

b.使用属性set方法进行注入

使用xml的注入方式:

   简单Bean的注入

简单Bean包括两种类型:包装类型和String

<bean id="personService"   class="com.zkx.bean.impl.PersonServiceImpl">
<!-- 基本类型,string类型 -->
<property name="age" value="20"></property>
            <property name="name" value="张无忌"></property>    
</bean>
        <!--  引用其他Bean -->
               <bean id="person" class="com.zkx.bean.Person" />
               <bean id="personService"  class="com.zkx.bean.impl.PersonServiceImpl">
            <property name="person" ref="person" />

</bean>

 

 

 

 

 

9.IOCDI结合的真正意义

 a.不完全的面向接口编程(客户端还得关心这个接口是由哪个类实现的)

如下图就是不完全的面向接口编程(WordDoment等类实现了Document接口,具体类的实现我就不列出来了),包括我以前那篇关于面向接口编程的博客,也是不完全的面向接口编程

@Test

public void testDocument_NOSpring(){

//为不完全的面向接口编程

Document document = new WordDocument();

DocumentManager documentManager = new DocumentManager();

documentManager.setDocument(document);

documentManager.readDocument();

documentManager.writeDocument();

}

 

 

   bdocumentManager,wordDocument,excelDocument,pdfDocument放入到spring容器中

  

   

<bean id="documentManager" class="com.zkx.spring.iocdi.document.DocumentManager">

   <property name="document">

   <ref bean="wordDocument"/>

   </property>

   </bean>

   <bean id="wordDocument" class="com.zkx.spring.iocdi.document.WordDocument"></bean>

   <bean id="excelDocument" class="com.zkx.spring.iocdi.document.ExcelDocument"></bean>

   <bean id="pdfDocument" class="com.zkx.spring.iocdi.document.PDFDocument"></bean>

 

 

 

Java代码端的测试

@Test

public void testDocument_Spring(){

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

DocumentManager documentManager = (DocumentManager)context.getBean("documentManager");

documentManager.writeDocument();

documentManager.readDocument();

}

 

 

没有出现一个WordDocment等,也就是说java代码这头,只需要完全面向接口编程就行了,只需要关心DocmentAPI实现什么样的功能,至于说这个Docment具体是谁,我不关心

这就是IOCDI结合的真正意义:

Java代码端完全的面向接口编程(现在很多容器都有这功能,都是模仿Spring)

 

 

分享到:
评论

相关推荐

    spring framework 源码下载

    - 了解Spring如何处理bean的生命周期,包括初始化、销毁和依赖查找。 - 研究Spring MVC的工作流程,如何处理HTTP请求,以及视图解析等。 - 深入理解Spring的事务管理,包括编程式和声明式事务。 - 探索Spring与各种...

    Spring 5.2.9的IOC核心jar包

    通过配置文件或者注解,开发者可以定义对象及其依赖关系,Spring容器会自动管理这些对象的生命周期,包括实例化、初始化、装配和销毁。 **Bean** 在Spring中,业务逻辑的组件被称为Bean。Bean是Spring容器管理的...

    Spring Framework4.1.5

    Bean的生命周期管理也得到了加强,包括初始化回调、销毁回调以及自定义生命周期策略。 二、AOP(面向切面编程) Spring的AOP模块允许开发者创建和应用横切关注点,如日志、事务管理等。4.1.5版本提供了更丰富的通知...

    spring_FrameWork3.0

    - **自定义 Bean 的状态:** 可以通过定义 Bean 的初始化方法和销毁方法来自定义 Bean 的生命周期。 - **Bean 定义依赖性:** 在 Bean 的定义中可以指定其依赖关系,以便容器在创建 Bean 实例时自动注入这些依赖。 -...

    spring framework源码

    Spring IoC容器是Spring的核心,它负责管理Bean的生命周期,包括初始化、装配和销毁Bean。 4. **AOP**:面向切面编程允许将关注点(如日志记录、事务管理)与业务逻辑分离,通过切面和通知实现代码的横向切割,提高...

    spring-framework-4-reference

    Spring Framework总览部分,主要介绍了Spring框架的核心概念,比如依赖注入(DI)和控制反转(IoC)模块。依赖注入是一种设计模式,用于实现控制反转,从而达到降低组件之间的耦合度的目的。依赖注入主要有三种方式...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2源代码

    其次,Spring 2.5 RC2加强了对JSR-250规范的支持,引入了诸如`@PostConstruct`和`@PreDestroy`这样的注解,使得初始化和销毁方法的标记更加直观。此外,它还改进了对Java Persistence API (JPA) 和Hibernate等ORM...

    spring IOC容器依赖注入XML配置

    容器通过读取XML配置文件来创建、初始化对象,并根据配置自动装配对象之间的依赖。这样,开发者无需在代码中手动创建和管理对象,而是由Spring容器负责,从而降低了耦合度。 XML配置是Spring早期的主要配置方式,...

    Spring-Framework 类图

    2. **IoC 容器(Inversion of Control, IoC)**:IoC 容器是 Spring 提供的一种服务,负责创建对象、管理对象的生命周期以及对象间的依赖关系。ApplicationContext 和 BeanFactory 都是 IoC 容器的实现,它们通过...

    spring-framework-3.2.7.RELEASE 源码

    2. **Bean容器**:在3.2.7.RELEASE中,Bean容器是Spring的核心组件,它通过XML、注解或Java配置来管理Bean的创建、初始化、装配和销毁。容器使用`BeanDefinition`来存储Bean的相关元数据,并使用`ApplicationContext...

    spring-framework-2.5.6

    5. **支持JSR-250**:2.5.6版本引入了对JSR-250规范的支持,如`@PostConstruct`和`@PreDestroy`注解,用于标记初始化和销毁方法。 二、源码分析 源码阅读是理解Spring框架工作原理的最佳途径。Spring 2.5.6的源码...

    springframework

    Spring容器管理Bean的生命周期,包括初始化、实例化、配置以及销毁。Bean可以通过XML、Java配置或者基于注解的方式进行定义。 5. **IoC配置方式**:Spring提供了多种配置方式,包括XML配置、基于注解的配置以及Java...

    spring-framework教程

    配置元数据用于指定Bean的属性、依赖关系以及初始化和销毁方法。此外,文档还讲解了如何实例化容器,以及如何从容器中获取和使用Bean。 Bean的概念包括了命名规则、作用域、生命周期管理和自动装配等方面。不同作用...

    Spring Framework 开发参考手册

    4. **Spring beans**:讲解Spring Bean的定义、配置和生命周期管理,包括XML、注解和Java配置方式,以及Bean的作用域和初始化、销毁方法。 5. **数据访问集成**:涵盖JDBC、ORM(Object-Relational Mapping,对象...

    Spring3.1.3 Ioc在Web容器中的建立

    4. **生命周期管理**:Spring提供预初始化、初始化、后初始化回调方法,以及销毁方法,允许我们自定义bean的生命周期。 **Spring Ioc的优势** 1. **松耦合**:bean之间的依赖关系由Spring容器管理,降低了bean之间...

    SpringFramework3源码

    3. **Bean生命周期管理**:在Spring Framework 3中,Bean的生命周期包括初始化、正常运行和销毁三个阶段。开发者可以通过实现InitializingBean和DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解来控制...

    spring-framework-3.2.10.RELEASE 源码

    在Spring中,Bean的生命周期包括实例化、初始化、配置、作用域、销毁等阶段。开发者可以通过实现InitializingBean接口、定义init-method属性、使用@PostConstruct注解来控制初始化,通过 DisposableBean接口、...

    spring创建bean简单示例

    Spring允许我们定义Bean的生命周期,如初始化方法和销毁方法。使用`@PostConstruct`和`@PreDestroy`注解来指定这些方法。 ```java @Service public class MyService { @PostConstruct public void init() { // ...

    spring-framework.pdf

    - **生命周期管理**:管理对象的创建、初始化、销毁等生命周期事件。 - **作用域管理**:支持多种作用域,如单例(Singleton)、原型(Prototype)等。 - **配置管理**:支持 XML 和 Java 配置两种方式。 以上是 ...

    Spring注解IOC所用的jar包

    8. `@PostConstruct` 和 `@PreDestroy`:这两个注解分别用于标记在Bean初始化后和销毁前执行的方法。 在Spring注解IOC中,需要引入的jar包主要包括Spring核心模块的jar,例如`spring-context.jar`、`spring-beans....

Global site tag (gtag.js) - Google Analytics