精华内容
下载资源
问答
  • Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在ApplicationContext和BeanFactory中Bean的生命周期。 1、在ApplicationContext中Bean的生命周期 ...
    
    Spring中Bean 的生命周期 , 在学习 spring 的过程中 bean 的生命周期理解对学习 spring 有很大的帮助,下面我就分别介绍在 ApplicationContext BeanFactory Bean 的生命周期。

    1、在ApplicationContextBean的生命周期

    生命周期执行的过程如下:

    1、需找所有的bean根据bean定义的信息来实例化bean

    2、使用依赖注入,spring按bean定义信息配置bean的所有属性

    3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。

    4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory() 方法传入工厂自身。

    5、若bean实现了ApplicationContextAware()接口,setApplicationContext()方法会被调用

    6、若BeanPostProcessor和bean关联,

    则它们的postProcessBeforeInitialization()方法被调用

    7若bean指定了init-method="init"方法、,它将被调用。

    8若有BeanPostProcessor和bean关联,

         则它们的postProcessAfterInitialization()方法被调用

        注意:通过已上操作,此时的Bean就可以被应用的系统使用,并讲保留在BeanFactory工厂中直到不再需要为止.但我们也可以通过9或者10进行销毁

    9、若bean实现了DisposableBean接口,distroy()方法被调用

    10、如果指定了destroy-method="close"定制的销毁方法,就调用这个方法

    案例分析:

       创建一个实体Bean代码如下:

    package www.csdn.spring.dao;
    
    
    import org.springframework.beans.BeansException;
    
    import org.springframework.beans.factory.BeanFactory;
    
    import org.springframework.beans.factory.BeanFactoryAware;
    
    import org.springframework.beans.factory.BeanNameAware;
    
    import org.springframework.beans.factory.DisposableBean;
    
    import org.springframework.beans.factory.InitializingBean;
    
    import org.springframework.context.ApplicationContext;
    
    import org.springframework.context.ApplicationContextAware;
    
    
    public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware,
    
    InitializingBean, ApplicationContextAware, DisposableBean {
    
    
    private String content;
    
    
    public HelloDaoImpl() {
    
    System.out.println("----------HelloDaoImpl实例化");
    
    }
    
    
    public void setContent(String content) {
    
    System.out.println("----------通过依赖注入的内容是:" + content);
    
    this.content = content;
    
    }
    
    
    @Override
    
    public void setBeanName(String beanId) {
    
    System.out.println("----------输出BeanId:" + beanId);
    
    }
    
    
    @Override
    
    public void setBeanFactory(BeanFactory factory) throws BeansException {
    
    System.out.println("----------factory:" + factory.getClass());
    
    
    }
    
    
    @Override
    
    public void setApplicationContext(ApplicationContext applicationContext)
    
    throws BeansException {
    
    System.out.println("----------" + applicationContext);
    
    
    }
    
    
    @Override
    
    public void afterPropertiesSet() throws Exception {
    
    System.out.println("----------afterPropertiesSet");
    
    }
    
    
    public void init() {
    
    System.out.println("----------初始化方法");
    
    }
    
    
    @Override
    
    public void destroy() throws Exception {
    
    System.out.println("----------bean被销毁");
    
    
    }
    
    
    public void close() {
    
    System.out.println("----------close");
    
    }
    
    
    }
    


    创建BeanPostProcessor实现类

    package www.csdn.spring.dao;
    
    
    import org.springframework.beans.BeansException;
    
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    
    public class BeanPostProcessorImpl implements BeanPostProcessor {
    
    @Override
    
    public Object postProcessBeforeInitialization(Object bean, String beanName)
    
    throws BeansException {
    
    System.out.println("我把:" + beanName + "实例化化之前的操作");
    
    return bean;
    
    }
    
    
    @Override
    
    public Object postProcessAfterInitialization(Object bean, String beanName)
    
    throws BeansException {
    
    System.out.println("我把:" + beanName + "实例化化之后的操作");
    
    return bean;
    
    }
    
    
    }
    

    在配置文件中配置实体BeanBeanPostProcessorImpl 特殊的Bean

    <?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">
    
    
    
    <!-- spring容器 就是负责创建、管理、维护Bean 并且能够依赖注入到相应组件上 -->
    
    <bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"
    
    scope="singleton" lazy-init="false" init-method="init" destroy-method="close">
    
    <!-- 通过set方法注入 -->
    
    <property name="content" value="陈老师早上好!" />
    
    </bean>
    
    
    <!-- BeanPostProcessor与当前的bean都进行关联 -->
    
    <bean class="www.csdn.spring.dao.BeanPostProcessorImpl" />
    
    
    </beans>
    


    创建测试类BeanTest 

    package www.csdn.spring.bean.cycle;
    
    
    import org.junit.Test;
    
    import org.springframework.context.ApplicationContext;
    
    import org.springframework.context.ConfigurableApplicationContext;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class BeanTest {
    
    
    @Test
    
    public void test() {
    
    ApplicationContext context = new ClassPathXmlApplicationContext(
    
    "classpath:spring-dao.xml");
    
    // 强制造型
    
    ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;
    
    // 执行关闭 可以考到 destory-method的方法的执行
    
    cont.close();
    
    
    }
    
    }
    


    执行结果如下:

    总结:在ApplicationContextBean的生命周期

    2、在 BeanFactoryBean的生命周期

         在BeanFactoryBean的生命周期与ApplicationContextbean的生命周期唯一不同的是:若bean实现了ApplicationContextAware()接口,在ApplicationContextbean的生命周期中setApplicationContext()方法会被调用,而在BeanFactoryBean的生命周期此方法不会被调用。

    案例采用上个案例:测试类中测试代码如下:

    // 创建资源对象
    
    ClassPathResource resource = new ClassPathResource("spring-dao.xml");
    
    // 采用BeanFactory初始化容器
    
    ConfigurableBeanFactory cbf = new XmlBeanFactory(resource);
    
    // bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加
    
    cbf.addBeanPostProcessor(new BeanPostProcessorImpl());
    
    //在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl" //cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl", BeanPostProcessorImpl.class));
    
    // 获取Bean对象
    
    cbf.getBean("helloDaoImpl", HelloDaoImpl.class);
    
    // 销毁
    
    cbf.destroySingletons();
    


    执行结果:同上


    总结:在BeanFactoryBean的生命周期

    另外说明:

         应用上下文与bean工厂的另一个重要区别是关于单例bean如何被加载。

    bean工厂延迟加载所有bean,直到getBean()方法被调用。

    应用上下文会在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。

    展开全文
  • page范围的JavaBean生命周期是最短的,当一个网页由JSP产生并传送到客户端后,属于page范围的JavaBean也被清除。当JSP程序执行完成,并把结果传给客户端后,属于page范围的JavaBean对象就会被清楚 建立一个计算访客...

    **

    1、page范围

    **
    page范围的JavaBean生命周期是最短的,当一个网页由JSP产生并传送到客户端后,属于page范围的JavaBean也被清除。当JSP程序执行完成,并把结果传给客户端后,属于page范围的JavaBean对象就会被清楚

    建立一个计算访客人数的JavaBean类Count

    public class Count {
    	public Count(){
    	}
    	private int C = 0;
    	public void setCount(int c){
    		C = c;
    	}
    	public int getCount(){
    		return ++C;
    	}
    
    }
    

    接下来建立一个JSP网页usingCount.jsp

    <%@page contentType="text/html" pageEncoding="gbk"%>
    
    <title>page的生命周期</title>
      </head>
      <body>
       <jsp:useBean id="count" scope="page" class="jsp.test.Counter"/>
       <font color="red">page界面</font><br>
       <h1>	你是request.jsp界面的第
       	<font color="yellow">
       		<jsp:getProperty name="count" property="counter"/>
       		</font>个访客</h1>
       		
      </body>
    </html>
    

    你会发现不管你刷新多少次,计数器的值都是为1,因为你点击刷新后JavaBean对象就消失,重新建立一个JavaBean对象

    2、request范围

    request类型的生命周期除了自身网页,还包括使用<jsp:include><jsp:forward>的有关网页,request有两个存取其他对象的方法,setAttribute()和getArribute(),JSP引擎会把<jsp:useBean>标签中的id值当作索引值,通过setAttribute()方法产生新的JavaBean对象放置在request对象中,当下一个JSP程序通过forward程序取得传来的request对象时,通过getArribute()和索引值获取这个对象

    还是相同的例子,建立setRequest.jsp

    <%@page contentType="text/html" pageEncoding="gbk"%>
    
    <title>requset的生命周期</title>
      </head>
      <body>
       <jsp:useBean id="count" scope="request" class="jsp.test.Counter"/>
       <font color="red">setRequest.jsp界面</font><br>
       <h1>	你是本站第
       	<font color="yellow">
       		<jsp:getProperty name="count" property="counter"/>
       		</font>个访客</h1>
       		<jsp:include page="request.jsp"/>
      </body>
    </html>
    

    当网页request.jsp页面运行时,首先建立一个生命周期为request的count对象,此时count对象值为1,接着重新导向到reques.jsp

    <%@page contentType="text/html" pageEncoding="gbk"%>
    
    <title>request的生命周期</title>
      </head>
      <body>
       <jsp:useBean id="count" scope="request" class="jsp.test.Counter"/>
       <font color="red">request.jdp界面</font><br>
       <h1>	你是request.jsp界面的第
       	<font color="yellow">
       		<jsp:getProperty name="count" property="counter"/>
       		</font>个访客</h1>
       		
       		<% out.println("你现在在request.jsp界面"); %>
      </body>
    </html>
    

    因为request的周期未结束,所以setRequest.jsp会延续到reques.jsp界面,count的属性值为2

    3、session范围

    由于HTTP协议是无状态的通信协议,在web服务器没有直接的方法可以维护客户端的状态,session范围的JavaBean生命周期可以在一个使用者的会话期间使用

    <%@page contentType="text/html" pageEncoding="gbk"%>
    
    <title>page的生命周期</title>
      </head>
      <body>
       <jsp:useBean id="count" scope="session" class="jsp.test.Counter"/>
       <font color="red">演示界面</font><br>
       <h1>	你是本站第
       	<font color="yellow">
       		<jsp:getProperty name="count" property="counter"/>
       		</font>个访客</h1>
      </body>
    </html>
    

    每次在另一个新的浏览器窗口运行同样的程序,计数值是重新开始的,每一次都会产生一个独立的JavaBean对象

    4、application范围

    application范围是最长的一个,只要有一个JSP程序设置为application范围时,在相同的引擎下的web程序都可以通过这个JavaBean交换信息

    <%@page contentType=“text/html” pageEncoding=“gbk”%>

    page的生命周期 演示界面

    你是本站第 个访客

    每一次同一个用户浏览更新时,计数器会不断增加,如果打开新的窗口会发现计数值并不会从头开始计算

    展开全文
  • javaBean Request生命周期

    2015-01-09 09:41:00
    request: 在request范围内,JavaBean对象的有效范围为: ① 客户请求访问的当前JSP页面② 和...③ 当所有共享同一个客户请求的JSP页面执行完毕并向客户端发回响应时,JavaBean对象结束生命周期JavaBean对象作...

    request:

    在request范围内,JavaBean对象的有效范围为:

    ① 客户请求访问的当前JSP页面
    ② 和当前JSP页面共享同一个请求的页面,包括<%@ include%>指令以及<jsp:forward>标记包含的其他JSP文件。
    ③ 当所有共享同一个客户请求的JSP页面执行完毕并向客户端发回响应时,JavaBean对象结束生命周期。

    JavaBean对象作为属性保存在了HttpServletRequest对象中,属性名为JavaBean的id,属性值为JavaBean对象,所以在同一个request范围内也可以按照如下方法获取JavaBean对象:

    <jsp:useBean id="user" class="com.itzhai.bean.User" scope="request" />
    User user=(User)request.getAttribute("user");

    转载于:https://www.cnblogs.com/caiyao/p/4212523.html

    展开全文
  • JavaBean生命周期

    千次阅读 2017-09-13 16:21:49
    毕后组件被销毁,每次刷新时一个新的JavaBean被创建,又开始重复执行。 2.request范围 当前计数是:<jsp:getProperty name="obj" property="counter"/><br> 显示为2. 3.session范围 ...

    转自:http://blog.csdn.net/jifengshuai/article/details/4456368



    <%@page contentType="text/html;charset=GB2312"%>
    public class Counter
    {
       private int counter=0;
       public String getCounter()
       {
          return ""+counter++
       }
    }
    1.page范围
    <html>
    <body>
    <jsp:useBeen id="obj" class="Counter" scope="page"/>
    当前计数是:<jsp:getProperty name="obj" property="counter"/><br>
    </body>
    </html>
    无论你如何刷新页面显示永远是1.原因是,在page范围里,当页面开始执行,组件创立,页面执行完

    毕后组件被销毁,每次刷新时一个新的JavaBean被创建,又开始重复执行。
    2.request范围
    <html>
    <body>
    <jsp:useBeen id="obj" class="Counter" scope="request"/>
    当前计数是:<jsp:getProperty name="obj" property="counter"/><br>
    <jsp:forward page="a.jsp">
    </body>
    </html>
    显示为2.
    3.session范围
    <html>
    <body>
    <jsp:useBeen id="obj" class="Counter" scope="session"/>
    当前计数是:<jsp:getProperty name="obj" property="counter"/><br>
    </body>
    </html>
    在一个浏览器中每刷新一次刷新会增加1,一旦关闭浏览器,信息销毁。再打开浏览器时,由从1开始
    4.application范围
    <html>
    <body>
    <jsp:useBeen id="obj" class="Counter" scope="application"/>
    当前计数是:<jsp:getProperty name="obj" property="counter"/><br>
    </body>
    </html>
    无论打开浏览器,重启浏览器,计数只会自增1.只在web应用程序重新启动时数据才重新至于零


    展开全文
  • JavaBean生命周期(page/request/session/application) 首先JSP页面中的javabean是通过JSP的动作标签来实现对javabean对象的操作,动作标签: 其中scope指的就是javabean生命周期,javabean实际上就是...
  • Bean的生命周期:  1,实例化bean  2,设置javaBean的属性值  3,若该bean实现了BeanNameAware接口,则调用该接口的setBeanName()方法  4,若该bean实现了BeanFactoryAware接口,则调用该接口的...
  • Bean的生命周期:  1,实例化bean  2,设置javaBean的属性值  3,若该bean实现了BeanNameAware接口,则调用该接口的setBeanName()方法  4,若该bean实现了BeanFactoryAware接口,则调用该接口的...
  • Bean的生命周期: 1,实例化bean 2,设置javaBean的属性值 3,若该bean实现了BeanNameAware接口,则调用该接口的setBeanName()方法 4,若该bean实现了BeanFactoryAware接口,则调用该接口的setBeanFactory()...
  • JavaBean生命周期 一:基本概念 bean 就是由IOC 容器初始化、装配及管理的对象。 Spring中的bean默认都是单例的,那么单例Bean在多线程程序下如何保证线程安全呢? Spring的单例是基于BeanFactory也就是Spring容器...
  • 严格区分JavaBean生命周期

    千次阅读 2006-12-07 10:54:00
    严格区分JavaBean生命周期现将JavaBean的scope的四种属性列举如下: scope=”page” class=”mypackage.CounterBean”> 在这种情况下,JavaBean对象的有效范围是客户请求访问的当前JSP网页,其生命周期在发生...
  • JSP中JavaBean生命周期

    千次阅读 2007-09-08 10:46:00
    JavaBean生命通过scope属性来描述的,也就是JavaBean的实例id在JSP程序中存在的范围。下面看看具体的scope四个值的含义:page-JavaBean对象保存在pageContext对象中,有page范围JavaBean实例只能在当前创建这个...
  • package springBeanTest; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config....
  • JavaBean的作用域(生命周期

    千次阅读 2012-12-17 16:45:32
    JavaBean的作用域(生命周期JavaBean生命周期存在于4中范围之中,分别为page、request、session、application,它们通过标签的sope属性进行设置,与jsp页面中的page、request、session、application范围相对应...
  • JSP——JavaBean的四种生命周期

    千次阅读 2019-04-27 11:52:10
    JSP中JavaBean是通过标签<jsp:useBean>来声明实现的,基本语法如下: <jsp:userBean id="beanName" class="className" scope="page/request/session/...JavaBean生命通过scope属性来描述的,也就是Java...
  • 演示application类型的生命周期 < / title > < / head > < body > < jsp : useBean id = "counter" class = "mybean.Counter" scope = "application" > < / jsp : useBean > 范围:application < br > 您...
  • JSP由于其强大的生命力在web开发中有很广泛的应用,实际上在JSP开发中,JSP程序中只占用了很少的一部分,大部分是由JavaBean完成的,通过JavaBean可以封装业务逻辑,数据库处理等等,由于有了JavaBean才使得程序更为...
  • 如果Bean配置了destroy-method方法,则会执行destroy-method配置的方法,至此,整个Bean的生命周期结束 4.BeanFactory容器中bean的生命周期 BeanFactoty容器中, Bean的生命周期如上图所示,与ApplicationContext相比...
  • 注: web.xml中的 / :代表项目根路径 例:http://localhost:8888/XXX/ jsp中的 / :服务器根路径 例:http://localhost:8888/ Servlet生命周期:5个阶段 加载 初始化:init(),该方法会在Servlet被加载并实例化的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,072
精华内容 11,228
关键字:

javabean的生命周期

java 订阅