`
starbhhc
  • 浏览: 634681 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

spring学习,理解控制反转和spring在项目中可以带来的好处

    博客分类:
  • SSH
 
阅读更多

spring三种实例化Bean的方式和管理Bean的作用域和Bean的生命周期

 

Spring实例化Bean的三种方式分别是:

1,xml配置使用bean的类构造器

<bean id="personService" class="cn.service.impl.PersonServiceBean"></bean>

2,xml配置+factory类,使用静态工厂方法实例化

<bean id="personService2" class="cn.service.impl.PersonServiceBeanFactory"  factory-method="createPersonServiceBean"/>

3,xml配置+factory类,使用实例工厂方法实例化

<bean id="personServiceFactory" class="cn.service.impl.PersonServiceBeanFactory"/>

<bean id="personService3" factory-bean="personServiceFactory" factory-method="createPersonServiceBean2"/>

 

三种Spring实例化Bean方法的用处,

第一种方法,通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。

第二种方法,利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。

第三种方法,利用实例化factory方法创建,即将factory方法也作为了业务bean来控制。

Bean的作用域

1,默认:singleton(单例,每次getBean()都是相同的Bean)

<bean id="bean1" class="cn.transaction.Bean1"></bean>

2,prototype:(每次getBean()都会获得新的Bean)

<bean id="bean1" class="cn.transaction.Bean1" scope="prototype"></bean>

Bean的生命周期

1,默认:singleton 在容器实例化的时候就会实例化;

1.1,更该实例化时间:

<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true"></bean>

如果要为所有的Bean延迟初始化:

在beans中配置该属性

1.2,配置初始化方法:

<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true" init-method="init"></bean>

1.3,配置销毁方法

<bean id="bean1" class="cn.transaction.Bean1" lazy-init="true" init-method="init" destroy-method="destroy"></bean>

1.4,bean在什么时候被销毁

默认既然是在spring容器初始化时创建Bean,所以是Bean是在spring容器关闭的时候销毁。

2,prototype:在调用getBean()的时候进行实例化;

 

-----------------------------------------------------------------------------------------------------------------

spring学习,理解控制反转和spring在项目中可以带来的好处

 

天开始学习Spring容器,是黎活明老师讲的,黎老师对Spring的研究非常透彻,讲了Spring容器功能实现的原理,它的控制翻转和面向切面,Spring在项目中使用带来的好处,并对一般Spring轻量级 ,重量级的错误认识进行了更正。
    Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发.
1  首先要理解控制反转的概念,如下面的程序
    public class PersonServiceBean {
     private PersonDao personDao = new PersonDaoBean();
 
      public void save(Person person){
            personDao.save(person);
     }
}

 PersonDao 就是依赖对象的类,PersonDaoBean 是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转


  2把依赖对象交给外部容器负责创建,那么PersonServiceBean 类可以改成如下:
public class PersonServiceBean {
     private PersonDao personDao ;
    //通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。
     public PersonServiceBean(PersonDao personDao){
         this.personDao=personDao;
     } 
      public void save(Person person){
            personDao.save(person);
     }
}

所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。


3.黎老师对spring在项目中可以带来下面的好处进行了总结。
   1)降低组件之间的耦合度,实现软件各层之间的解耦。
      Controller——>Service——>DAO
  2)可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4)容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
6)Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

 7)  使用spring容器可以提供的服务:事务管理服务,JMS服务,Spring Core核心服务,持久化服务等。
8)如果使用Spring, 我们就不再需要手工控制事务,例如在Hibernate中控制事务的语句 session.beginTransaction(); session.getTransaction().commit();

9)使用Spring,不再需要我们处理复杂的事务传播行为。


     经常有人分不清spring属于轻量级框架,还是重量框架?有些人认为一个项目超过10M就是重量级的,这种划分很明显是错误的,因为有可能它包含了大部分的图片,而只含有很少的代码。其实划分一个应用是否属于轻量级还是重量级,主要看它使用了多少服务.使用的服务越多,容器要为普通java对象做的工作就越多,必然会影响到应用的发布时间或者运行性能.
对于spring容器,它提供了很多服务,但这些服务并不是默认为应用打开的,应用需要某种服务,还需要指明使用该服务,如果应用使用的服务很少,如:只使用了spring核心服务,那么我们可以认为此时应用属于轻量级的,如果应用使用了spring提供的大部分服务,这时应用就属于重量级。目前EJB容器就因为它默认为应用提供了EJB规范中所有的功能,所以它属于重量级。

 

---------------------------------------------------------------------------------------------------------------------

实例化bean的方式及Bean的作用域

 

 

继续学习Spring,黎老师对Spring研究比较透彻,讲课思路很清晰,认真听讲很容易理解。黎老师对Spring中比较重要的部分都进行了讲解,实例化Spring容器的方式,实例化bean的方式,Bean的作用域等。并进行了举例,通过对Spring和以前项目的学习,在项目中可以使用Sping,使项目功能的实现更简单,遵循MVC模式。

 

使用Spring需要的jar
   可以到
http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下

dist/spring.jar
lib/jakarta-commons/commons-logging.jar
如果使用了切面编程(AOP),还需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cglib-nodep-2.1_3.jar
如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,还需要下
列jar文件
lib/j2ee/common-annotations.jar

 

beans.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-2.5.xsd">
 .....
</beans>

    该配置模版可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下。

实例化Spring容器常用的两种方式:

方法一:
在类路径下寻找配置文件来实例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]
{"beans.xml"});

方法二:
在文件系统路径下寻找配置文件来实例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]
{“d://beans.xml“});

       一般使用第一种方式,Spring的配置文件可以指定多个,可以通过String数组

传入。
      当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命

周期,所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建

bean对象。从容器获取bean对象的代码如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);
OrderService service = (OrderService)ctx.getBean("personService");

     三种实例化bean的方式:
1.使用类构造器实例化
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用静态工厂方法实例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-
method="createOrder"/>
public class OrderFactory {
 public static OrderServiceBean createOrder(){
  return new OrderServiceBean();
 }
}
3.使用实例工厂方法实例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-
method="createOrder"/>
public class OrderFactory {
 public OrderServiceBean createOrder(){
  return new OrderServiceBean();
 }
}

Bean的作用域
  .singleton (单例)
   在每个Spring IoC容器中一个bean定义只有一个对象实例。默认情况下会在容器启
动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
 <bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=
“true“,如下:
<beans default-lazy-init="true“ ...>
实际应用中不把这个属性设置为true.
.prototype (原型)
 每次从容器获取bean都是新的对象。每次调用getBean方法,都获取新的实例。
 调用调用getBean方法时 bean才实例化
.request
.session
.global session
在配置文件中指定Bean的初始化方法和销毁方法
<bean id="xxx" class="cn.itcast.OrderServiceBean" init-method="init" destroy-
method="close"/>
Bean实例化后 ,就会执行init方法, Spring容器通过反射机制来调用。
AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
ctx.close();//正常关闭spring容器。

分享到:
评论

相关推荐

    spring 控制反转和依赖注入.docx

    spring 控制反转和依赖注入进行基础知识的生命周期、延迟初始化、装配方式等进行案例总结使用。从而对spring基础知识更加理解。

    spring控制反转的理解

    spring很好的例子,相当容易理解,保证几分钟理解spring

    javaSpring学习笔记

    在“Java Spring学习笔记”中,你将找到对Spring框架的全面介绍,包括IoC(控制反转)和DI(依赖注入)原理、AOP(面向切面编程)、Spring MVC、Spring Boot等核心内容。每个主题都结合了理论知识和实际示例,帮助你...

    理解Spring中的依赖注入和控制反转

    主要介绍了理解Spring中的依赖注入和控制反转,具有一定参考价值,需要的朋友可以了解下。

    Spring——IOC(控制反转)与DI(依赖注入).docx

    IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)

    Spring控制反转(IoC)的理解

    NULL 博文链接:https://hgxs-org.iteye.com/blog/1469237

    Spring框架文档 - 核心技术部分 中文版 - 第一部分.pdf

    其中最重要的是Spring框架的控制反转(Inversion of Control,IoC)容器(container)。在对Spring框架的IoC容器进行全面介绍之后,将全面介绍Spring的面向切面编程(AOP)技术。Spring框架(Spring Framework)有...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    此文档仅供初学者学习,包括Spring的依赖注入(控制反转)的详细实例。以三层贯穿实例(持久层、业务层、控制层),由MAIN方法直接调用测试用例。

    Spring攻略PDF版

     第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法   1.2 使用服务定位器降低查找组件的复杂性   1.2.1 问题描述   1.2.2 解决方案...

    Spring攻略中文版PDF

     第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法   1.2 使用服务定位器降低查找组件的复杂性   1.2.1 问题描述   1.2.2 解决方案...

    Spring框架文档 - 核心技术部分 中英双语版 第二部分.pdf

    其中最重要的是Spring框架的控制反转(Inversion of Control,IoC)容器(container)。在对Spring框架的IoC容器进行全面介绍之后,将全面介绍Spring的面向切面编程(AOP)技术。Spring框架(Spring Framework)有...

    Spring框架文档 - 核心技术部分 中英双语版 第一部分.pdf

    其中最重要的是Spring框架的控制反转(Inversion of Control,IoC)容器(container)。在对Spring框架的IoC容器进行全面介绍之后,将全面介绍Spring的面向切面编程(AOP)技术。Spring框架(Spring Framework)有...

    Spring框架文档 - 核心技术部分 中文版 - 第二部分.pdf

    其中最重要的是Spring框架的控制反转(Inversion of Control,IoC)容器(container)。在对Spring框架的IoC容器进行全面介绍之后,将全面介绍Spring的面向切面编程(AOP)技术。Spring框架(Spring Framework)有...

    Spring攻略英文版(附带源码)

     第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法   1.2 使用服务定位器降低查找组件的复杂性   1.2.1 问题描述   1.2.2 解决方案   ...

    Spring试题和答案.pdf

    )控制反转 )对象被动的接受依赖类 )对象主动的去找依赖类 )一定要用接口 )下面关于AOP的理解,正确的是(B C)(选择两项) )面向纵向的开发 )面向横向的开发 )AOP关注是面 )AOP关注的是点

    spring.net中文手册在线版

    3.1.控制反转 第一部分 核心技术 第四章 对象、对象工厂和应用程序上下文 4.1.简介 4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍 4.2.1.The IObjectFactory和IApplicationContext ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    2024 Java Spring框架入门心得与实战经验分享.zip

    作者以通俗易懂的语言,介绍了Spring框架的核心概念,如IoC(控制反转)、AOP(面向切面编程)等,并分享了自己在实际项目中使用Spring框架的经验和心得。 适用人群:这篇文章适用于所有对Java Spring框架感兴趣的人...

    IOC控制反转学习文档

    Spring框架学习中的核心,控制反转IOC,理解Spring框架主要注入所依赖的资源,解耦开发

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

Global site tag (gtag.js) - Google Analytics