spring学习笔记2——bean的应用

来源:互联网 发布:淘宝ppc是什么意思 编辑:程序博客网 时间:2024/05/17 19:58

一、   Bean的实例化

1、创建spring配置

      xml文件中声明Bean时,spring配置文件的根元素是来源于spring beans命名空间所定义的<bean>元素。下面是一个典型的spring XML配置文件:

          

     另外,java自带多种xml命名空间,通过这些命名空间就可以配置spring容器

     aop:为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素

     beans:支持声明bean和装配bean,是spring最核心也是最原始的命名空间

     context:为配置spring应用上下文提供了配置元素,包括自动检测盒自动装配bean、注入飞spring直接管理的对象

     jee:提供了与javaEE API的集成,例如JNDIEJB

     jms:为声明消息驱动的POJO提供配置元素

     lang:支持配置有GroovyJRubyBeanShell等脚本实现的bean

     mvc:启动spring MVC的能力,例如面向注解的控制器。试图控制器和拦截器

     oxm:支持spring的对象到XML映射配置

     tx:提供声明式事务配置

     util:提供各种各样的工具类元素,包括把集合配置为Bean、支持属性占位符元素

 

2bean的实例化­——类构造器实例化(这里以一个歌唱者为例)

      1)新建一名为springjava项目,并在src建一applicationContext.xml文件

            

      2)在applicationContext.xml中添加信息    

            

      3)在src目录下建名为service的包,并在包下建一接口Person,代码如下

            

      4)在service的包下建名为singer类,代码如下

          

      5)在Spring项目下添加jar包(这里是用spring3.1.1

           

                 在添加完jar包,必须把所有包Add to Build Path(点击右键-> Build Path)

      6)applicationContext.xml创建bean

           

      7)测试:

           src下建名为test的包,并在包下见Test类。Test

             

          运行Test类,此时控制台如果输出“I Like Singing”则声明成功

3bean的实例化­——静态工厂方法实例化

      1)src目录下建名为util的包,并在包下建一PersonFactory类,代码如下

          

      2)在applicationContext.xml创建bean

           

      3)测试:在Test类中将getBean()中的名字改为“singer1”此时控制台如果输出“I Like Singing”则声明成功

 

 4bean的实例化­——实例工厂方法实例化

        1)util包下建一PersonFactory2类(比静态工厂实例化少static),代码如下

            

        2)applicationContext.xml创建bean  

            

            注意:这里需要实例化工厂

       3)测试:在Test类中将getBean()中的名字改为“singer2”此时控制台如果输出“I Like Singing”则声明成功

 

二、bean的作用域

1、验证默认情况下获取的bean是不是同一个bean

      验证很简单,只要修改Test类的代码:

      

      此时运行Test,控制台会输出true,证明验证默认情况下获取的bean是同一个

 

2、 bean有哪些作用域

       1)singleton:单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。

       2)prototype:原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototype Bean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。

       3)request:针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP request内有效,因此可以根据需要放心地更改所建实例的内部状态,而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于webSpring ApplicationContext情形下有效。

      4)session:针对某个HTTP SessionSpring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP Session内有效。与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTP Session中根据Bean定义创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于WebSpring ApplicationContext情形下有效。

      5)global session:该作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portletWeb应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet Web应用的各种不同的portlet所共享。在global session作用域中定义的Bean被限定于全局portlet Session的生命周期范围内。如果我们是在编写一个标准的基于ServletWeb应用,并且定义了一个或多个具有global session作用域的Bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。该作用域仅在基于WebSpring ApplicationContext情形下有效

 

三、 bean的生命周期

1、bean什么时候实例化?

        默认情况下(单例)容器实例化时就被实例化,而scope=prototype”时,只有调用getBean()方法是实例化。可以改变

 lazy-inti属性改变实例化时间(即将在单例情况是lazy-inti属性设置为true是,它也是在调用getBean()方法是实例化)。下面做个例子,来验证下:

       在singer类中添加构造函数:

       

       修改Test类中的代码:

        

       在application.xml中只留下

        

      此时运行test类,控制台会输出“我是歌手”。

      如果<bean>修改为prototype,多实例

      

     此时运行test类,控制台没有输出。但如果我们修改Test的代码:

      

     此时运行test类,控制台又输出了“我是歌手”。验证成功

 

2、Init-method=””Destroy-method=””的运用

     这两个属性分别是用于bean实例化后执行的方法和bean销毁前执行的方法。下面举个例子,如何让一个歌手进场后唱歌,在离场前说“白白”。

     修改singer

      

     修改application.xml

      

     修改Test代码:

      

     运行Test代码,控制台输出:

     

 3、在Spring装载配置文件后,Spring工厂实例化完成,开始处理

       1)使用默认构造方法或指定构造参数进行Bean实例化。

       2)根据property标签的配置调用Bean实例中的相关set方法完成属性的赋值。

       3)如果Bean实现了BeanNameAware接口,则调用setBeanName()方法传入当前BeanID

       4)如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用。

       5)如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用。

       6)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- BeforeInitialzation()方法将被调用。

       7)如果在配置文件中配置Bean时设置了init-method属性,则调用该属性指定的初始化方法。

       8)如果有BeanPostProcessor与当前Bean关联,则与之关联的对象的postProcess- AfterInitialzation()方法将被调用。

       9Bean实例化完成,处于待用状态,可以被正常使用了。

       10)当Spring容器关闭时,如果Bean实现了DisposableBean接口,则destroy()方法将被调用。

       11)如果在配置文件中配置Bean时设置了destroy-method属性,则调用该属性指定的方法进行销毁前的一些处理。

       12)Bean实例被正常销毁。
0 0
原创粉丝点击