Bean详解(Spring)

控制反转思想:反转Bean的创建权[反射机制],为了解决对象和对象之间的耦合,我们在Spring容器中声明一个bean对象

<bean></bean>

属性:

id:唯一性标识


class:全限定名

它内部是一个全类名,通过它找到一个具体的实现类
反射默认通过无参构造去创建对象,我们这样配置必须保证bean(指的UserDaoImpl)内部存在无参构造

scope:指定对象的作用范围

我们没有配置scope,默认就是singleton,为什么呢,因为用UserDaoImpl是作为方法对象,搞那么多对象没有意义。

singleton,意味着在容器中存在的对象只有一个

prototype,意味着从容器中拿bean对象时,有多个对象

引入junit来研究对象个数和对象创建时机:

改写UserDaoImpl类:



导入坐标



新建测试类



scope为singleton的结果:

地址全完一致,容器内只有一个对象。
对象在加载配置文件applicationContext.xml时创建,只创建一次(只有一个对象的原因)



scope为prototype的结果:

地址不一致,容器内有多个对象。
对象在getBean时创建,有几次getBean就创建几次(有多个对象的原因)






Bean生命周期配置





Bean创建的方式:

无参构造方法实例化:我们上文使用的就是无参构造方法实例化




有参构造

UserDaoImpl类添加参数:



配置文件报错



使用Bean的子标签constructor-arg标签添加参数,有几个添加几个





工厂静态方法实例化:特征是static getUserDao()静态方法

无参构造方法实例化

新建静态工厂类:


getUserDao方法能返回一个UserDao类型的对象。

配置文件改为:


Spring调用前面这个Demo.factory.StaticFactory类名的getUserDaoMethod()静态方法,返回UserDao对象,并以UserDao为id存到容器(类似Map中的key,对象就是Map中的value)
相当于UserDao getUserDaoInStatic = StaticFactory.getUserDaoMethod;
加载配置文件的时候,先找到factory.staticFactory这个类,然后发现后面有factory-method属性,
就找factory-method指定的getUserDaoMethod方法去返回userDao对象。

有参构造方法实例化:与非工厂类的无参构造类似,使用Bean的子标签constructor-arg标签添加参数,有几个添加几个。


工厂实例方法实例化:

无参构造方法实例化:

新建实例工厂类:


配置文件改为:


相当于:
TheDynamicFactory = new DynamicFactory();
UserDao getUserDaoInDynamic = TheDynamicFactory.getUserDaoMethod;
加载配置文件时先找到实例工厂类,
然后通过factory-bean属性进入这个工厂,再用factory-method属性从getUserDaoMethod方法中去获得userDao这个对象

有参构造:使用Bean的子标签constructor-arg标签添加参数,有几个添加几个


原文地址:https://www.cnblogs.com/maomaodesu/p/12539660.html