(七)Bean的实例化方式
创始人
2024-01-28 10:05:26
0

文章目录

  • 环境
  • Bean的实例化方式
    • 通过构造方法实例化
    • 通过简单工厂模式实例化
    • 通过工厂方法模式实例化
    • 通过FactoryBean接口实例化
  • BeanFactory和FactoryBean的区别
    • BeanFactory
    • FactoryBean
  • 工厂Bean的使用:注入自定义Date

上一篇:(六)Spring之回顾工厂模式

环境

spring6里程碑版本的仓库
依赖:spring context依赖、junit依赖、log4j2依赖
log4j2.xml文件放到类路径下。

Bean的实例化方式

Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活)

  • 第一种:通过构造方法实例化
  • 第二种:通过简单工厂模式实例化
  • 第三种:通过工厂方法模式实例化
  • 第四种:通过FactoryBean接口实例化

通过构造方法实例化

之前一直使用的就是这种方式。默认情况下,会调用Bean的无参数构造方法。
在Spring配置文件直接配置类的全路径,Spring会自动调用该类的无参数构造方法来实例化Bean。
创建一个Bean:SpringBean1类:

public class SpringBean1 {public SpringBean1() {System.out.println("Spring Bean1的无参构造方法执行");}
}

创建spring.xml配置:


测试程序:

    @Testpublic void testInstantiation1(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");SpringBean1 springBean1 = applicationContext.getBean("springBean1", SpringBean1.class);System.out.println(springBean1);}

请添加图片描述

通过简单工厂模式实例化

简单工厂模式实例化就是,创建一个简单工厂类,提供一个静态方法,手动实例化Bean对象,可见这个Bean是我们自己new出来的。
需要在Spring配置文件中告诉Spring框架,调用哪个类的哪个方法获取Bean。

定义一个Bean:SpringBean2类

public class SpringBean2 {public SpringBean2() {System.out.println("Spring Bean2的无参构造方法执行");}
}

定义工厂类角色:SpringBean2Factory

/*** 简单工厂模式中的工厂类角色。*/
public class SpringBean2Factory {//简单工厂模式又叫做静态工厂方法模式,有一个静态方法。public static SpringBean2 get(){//可见这个对象最终创建的时候还是我们负责new的。return new SpringBean2();}
}

spring.xml配置:
factory-method属性:配置哪个方法获取Bean。


测试程序:

    @Testpublic void testInstantiation2(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");SpringBean2 springBean2 = applicationContext.getBean("springBean2", SpringBean2.class);System.out.println(springBean2);}

请添加图片描述

通过工厂方法模式实例化

工厂方法模式实例化就是,创建一个简单工厂类,只是这个方法不再是静态方法,而是实例方法,手动实例化Bean对象,可见这个Bean也是我们自己new出来的。
因为是实例方法,需要在Spring配置文件中配置这个工厂的Bean,并告诉Spring框架,调用哪个类的哪个方法获取Bean。

定义一个Bean:SpringBean3类

/*** 具体产品角色*/
public class SpringBean3 {public SpringBean3() {System.out.println("Spring Bean3的无参构造方法执行");}
}

工厂角色:SpringBean3Factory类

/*** 具体工厂角色*/
public class SpringBean3Factory {//工厂方法模式里的方法是实例方法public SpringBean3 get(){//可见,创建对象还是我们直接创建的return new SpringBean3();}
}

spring.xml配置:
通过factory-bean + factory-method共同完成
因为是实例方法,需要实例化对象,所以工厂方法也需要Spring管理,需要配置bean

  • factory-method属性:配置哪个方法获取Bean。
  • factory-bean属性:指定哪个对象创建bean
	

测试程序:

    @Testpublic void testInstantiation3(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");SpringBean3 springBean3 = applicationContext.getBean("springBean3", SpringBean3.class);System.out.println(springBean3);}

请添加图片描述

通过FactoryBean接口实例化

前三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
第四种方案实际是第三种方案的简化

定义一个Bean:SpringBean4类

public class SpringBean4 {public SpringBean4() {System.out.println("Spring Bean4的无参构造方法执行");}
}

定义一个工厂:SpringBean4FactoryBean,实现FactoryBean接口
这个工厂也是一个Bean,只不过这个Bean比较特殊,叫做工厂Bean
通过这个工厂Bean可以获取普通的Bean
FactoryBean接口有三个方法,分别是:

  • getObject():抽象方法,在这个方法创建Bean,并返回。
  • getObjectType():抽象方法,在这个方法编写返回Bean的类型,是一个Class类型。
  • isSingleton():默认方法,它会告诉Spring,创建Bean是否是单例的,默认为true是单例的,如果不想Bean为单例,则可以覆盖此方法,并返回false就可以。
public interface FactoryBean {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass getObjectType();default boolean isSingleton() {return true;}
}

SpringBean4FactoryBean:

public class SpringBean4FactoryBean implements FactoryBean {/*在这个方法创建Bean*/@Overridepublic SpringBean4 getObject() throws Exception {//最终也是程序员自己new的return new SpringBean4();}@Overridepublic Class getObjectType() {return null;}/*在源码中有一个默认方法,它会告诉Spring,创建Bean是否是单例的,如果不想单例,覆盖该方法并返回false就可以这里就不在操作了,默认调用接口的默认方法*/@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}

spring.xml配置:


测试程序:

    @Testpublic void testInstantiation4(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");SpringBean4 springBean4 = applicationContext.getBean("springBean4", SpringBean4.class);System.out.println(springBean4);}

请添加图片描述

BeanFactory和FactoryBean的区别

BeanFactory

Spring IoC容器的顶级对象,BeanFactory被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。
BeanFactory是工厂。

FactoryBean

FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。
在Spring中,Bean可以分为两类:

  • 第一类:普通Bean
  • 第二类:工厂Bean(记住:工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其它Bean对象。)

工厂Bean的使用:注入自定义Date

java.util.Date在Spring中被当做简单类型,简单类型在注入的时候可以直接使用value属性或value标签来完成。
但我们之前已经测试过了,对于Date类型来说,采用value属性或value标签赋值的时候,对日期字符串的格式要求非常严格,必须是特殊格式的。其他格式是不会被识别的。

所以我们可以使用FactoryBean接口对Bean的创建进行增强操作。

定义一个学生类:Student

public class Student {private Date birth;public void setBirth(Date birth) {this.birth = birth;}@Overridepublic String toString() {return "Student{" +"birth=" + birth +'}';}
}

创建一个工厂Bean:DateFactoryBean类,实现FactoryBean

public class DateFactoryBean implements FactoryBean {private String strDate;public DateFactoryBean(String strDate) {this.strDate = strDate;}@Overridepublic Date getObject() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(strDate);return date;}@Overridepublic Class getObjectType() {return null;}
}

spring.xml配置:

	

测试程序:

    @Testpublic void testStudentDate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Student student = applicationContext.getBean("student", Student.class);System.out.println(student);}

在这里插入图片描述

相关内容

热门资讯

话费小本创业的项目 话费小本创... 小本创业项目:快餐小吃店话费小本创业的项目随着社会压力的增大,很多人没有时间本人做饭,为了工作会选择...
2014小本创业不容错过的项目... 2014小本创业做什么比较好?其实对于大部分创业者来说,小本创业更能取得成功,今天就给大家介绍几个小...
2014小本创业不容错过 卤中... 如今,随着近年来熟食行业的快速发展,给广大的消费者带来了美味,也给投资者带来了绝好的契机,卤中仙熟食...
小本创业好项目摆地摊做什么好?... 小本创业一直以来都是比较受普通大众所喜爱的,而很多人白手起家最开始做的就是摆地摊,不要瞧不起这个小本...
重访抗战地标丨英雄之城·不能忘...   为什么要永远铭记抗战英雄?因为当“中华民族到了最危险的时候”,“用血肉筑起新的长城”并不是艺术升...
各地高校持续实施“宏志助航计划...   央视网消息:当前正值高校毕业生就业关键期,教育部要求各地高校加快实施年度“宏志助航计划”,为离校...
2018小本创业好2017十个... 1、农户住宅设计业我们知道盖房是农民生活中的头等大事,随着社会经济的发展,农户住宅也向实用、美观、个...
环保创业好项目 环保行业有哪些... 酿酒蒸馏/餐饮食堂,全国90%传统锅炉需要改造。千亿市场商机等你来分享。具有竞争性独特产品,市场唯一...
2015年有哪些小本创业好项目... 对于普通大众来说,由于资金的限制,进行小本创业是最恰当的选择.都有什么项目适宜小本创业经营呢?  第...
创业小本好项目 创业小本好项目... 生活水平越来越高,这对于刚毕业的年轻人来说或许就产生了不小的压力,进入职场的时间不长,工资也没有太高...