spring-bean的创建方式,bean的生命周期

bean的创建方式:

1、调用构造器创建bean

package cn.itouchtv;

public class News {
    private String title;
    private String content;
    private int viewCnt;
    private int likeCnt;

    public News(String title, String content, int viewCnt, int likeCnt) {
        this.title = title;
        this.content = content;
        this.viewCnt = viewCnt;
        this.likeCnt = likeCnt;
    }

    public News() {
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public int getViewCnt() {
        return viewCnt;
    }

    public int getLikeCnt() {
        return likeCnt;
    }
}

调用无参数构造器创建bean:这种方式是通过property标签来为属性赋值。


        
        
        
        
    

调用有参数构造器创建bean:通过对应的构造器,参数的顺序即为赋值的顺序。


        
        
        
        
    

2、通过静态工厂方法来创建

首先有个工厂类:

public class StaticFactory {

    public static  News getNews(String title,String content,int viewCnt,int likeCnt){
        return new News(title,content,viewCnt,likeCnt);
    }
}

xml文件中的配置:

  
        
        
        
        
    

这里指定的类为工厂类,还要指定factory-method对应的静态方法,使用constructor-arg来为静态方法传参数,这里发现实例的创建不再是通过容器,而是通过用户自己定义的工厂方法来创建,不过之后,bean和其他方式创建的bean没什么区别,都是由spring来管理。

3、通过实例工厂方法来创建bean:

同样需要工厂类:不过这次创建实力的方法为实力方法,不再是静态方法。

package cn.itouchtv;

public class InstanceFactory {

    public News getNews(String title,String content,int viewCnt,int likeCnt){
        return new News(title,content,viewCnt,likeCnt);
    }
}

xml的配置,其实要调用InstanceFactory 的方法来创建bean,首先得创建工厂,具体配置:

  

    
        
        
        
        
    

4、通过FactoryBean来创建

实现Spring提供的FactoryBean接口

package cn.itouchtv;

import org.springframework.beans.factory.FactoryBean;

public class NewsFactoryBean implements FactoryBean {
    private String title;
    private String content;
    private int viewCnt;
    private int likeCnt;

    /**
     * 返回的bean
     * @return
     * @throws Exception
     */
    @Override
    public Object getObject() throws Exception {
        return new News(title,content,viewCnt,likeCnt);
    }

    /**
     * 该对象的类型
     * @return
     */
    @Override
    public Class getObjectType() {
      return  News.class;
    }

    /**
     * 是否单实力
     * @return
     */
    @Override
    public boolean isSingleton() {
      return true;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getViewCnt() {
        return viewCnt;
    }

    public void setViewCnt(int viewCnt) {
        this.viewCnt = viewCnt;
    }

    public int getLikeCnt() {
        return likeCnt;
    }

    public void setLikeCnt(int likeCnt) {
        this.likeCnt = likeCnt;
    }
}

xml的配置:

    
        
        
        
        
    

以上是四种创建bean的方式。

 

bean的生命周期:

bean的生命周期的管理是针对单实例singleton的bean来说的,IOC容器知道它的创建,初始化和销毁;对于多实例prototype的bean,IOC容器只知道创建,创建后就不再由容器管理了。

举个例子吧:


    
        
        
        
        
    
package cn.itouchtv;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class News  implements InitializingBean,DisposableBean{
    private String title;
    private String content;
    private int viewCnt;
    private int likeCnt;

    public News(String title, String content, int viewCnt, int likeCnt) {
        this.title = title;
        this.content = content;
        this.viewCnt = viewCnt;
        this.likeCnt = likeCnt;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean destory...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet 方法");
    }

    public News() {
        System.out.println("调用构造器。。。");
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public int getViewCnt() {
        return viewCnt;
    }

    public int getLikeCnt() {
        return likeCnt;
    }

    public void setTitle(String title) {
        System.out.println("设置属性。。。");
        this.title = title;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public void setViewCnt(int viewCnt) {
        this.viewCnt = viewCnt;
    }

    public void setLikeCnt(int likeCnt) {
        this.likeCnt = likeCnt;
    }

    public void initItouchtv(){
        System.out.println("初始化操作。。。。");
    }

    public void myDestory(){
        System.out.println("銷毀方法。。。");
    }
}

 

这里的initItouchtv方法是个初始化方法,News类实现了InitializingBean接口,对于调用

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

时,输出结果为:

调用构造器。。。
设置属性。。。
afterPropertiesSet 方法
初始化操作。。。。
DisposableBean destory...
銷毀方法。。。

调用构造器-》设置属性-》afterPropertiesSet 方法-》初始化操作=》DisposableBean destory=》銷毀方法

这里要注意的是afterPropertiesSet和init都是初始化方法,但是afterPropertiesSet会先执行

destory和myDestory都是销毁方法,但是DisposableBean 的destory会先执行。

 

你可能感兴趣的:(spring-bean的创建方式,bean的生命周期)