Spring框架中Bean是什么?实例化Bean的三种方式?

文章介绍了Spring框架中Bean的默认单例模式,如何通过构造方法实例化Bean,以及三种实例化方式(构造方法、静态工厂和实例化工厂)。还涉及了依赖注入、生命周期管理和配置选项,如setter注入、构造器注入和自动装配。
摘要由CSDN通过智能技术生成

1-首先知道Bean是什么?

spring中默认bean对象是单例的(默认为singleton)-要想切换成非单例的,将scope属性更改为protype即可。

<bean id="xxx" class="xxx" scope="prototype" />

1.1 为什么bean默认是单例

因为bean对象是交给spring容器进行管理的。如果bean不是非单例的,那么bean的数量会有无穷个,每用一次都要重新造一个bean,spring并不是帮我们管理这样的bean的,事实上spring在帮我们管理的是我们可以复用的对象。比如A方法使用x对象,造了一次x的bean对象,B方法也使用x对象,又造了一次x的bean对象,这样的话效率很低。因此,spring默认的就是造单例对象,可以进行复用。

2-Bean是如何创建的?

bean本质上就是对象,Java中创建对象有两种方式,分别是new,构造方法。

在spring中通过构造方法来创建对象。

3-实例化Bean的三种方式

3.1-通过构造方法实例化Bean

package com.yfzhang.dao;
public interface BookDao{
  public void save();
}
package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
   public BookDaoImpl(){
    System.out.println("公共无参构造方法被调用");
    }
    public void save(){
    System.out.println("BookDaoImpl的save方法被调用")
    }
}
​
<bean id="bookDao" class="com.yfzhang.dao.impl.BookDaoImpl" />

此时控制台可以输出“公共无参方法被调用

将构造方法私有化以后呢?

package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
   private BookDaoImpl(){
    System.out.println("公共无参构造方法被调用");
    }
    public void save(){
    System.out.println("BookDaoImpl的save方法被调用")
    }
}

此时控制台仍然可以输出“公共无参方法被调用

由此可得,spring肯定调用了构造方法,并且无论私有公有都可以使用。那么私有的方法,怎么得到呢-------通过反射。

将无参构造方法改为有参构造方法后呢?

​
package com.yfzhang.dao.impl;
public class BookDaoImpl implements BookDao{
   public BookDaoImpl(int i){
    System.out.println("公共有参构造方法被调用");
    }
    public void save(){
    System.out.println("BookDaoImpl的save方法被调用")
    }
}

此时会报错-bean对象初始化失败--javase中提到过,当前情况有参构造方法会覆盖掉无参构造方法

3.2通过静态工厂实例化Bean

有一个OrderDao

这是orderdao的实现类,重写了save方法

这是一个工厂-orderdaofactory,在里面有一个静态的工厂,方法名叫做getOrderDao

这是main函数

用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?

class后面配的是工厂类名,factory-method还要配置工厂里面真正用于造对象的方法名

<bean
 id="orderDao" factory-method="getOrderDao" class="com.yfzhang.factory.OrderDaoFactory" 
/>

3.3通过实例化工厂初始化Bean

userdao一个接口

一个实现类,重写了save方法

同3.2也有一个工厂,但是,是一个非静态方法

main函数。因为不是静态方法所以要先创建一个工厂对象,

然后通过工厂对象再创建对象调用save方法

用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?

首先造工厂的bean对象,然后再通过这个工厂对象获取工厂的方法

<bean id="userFactory" class="com.yfzhang.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory" />

3.4对实例化工厂初始化bean的改造

弊端:

factory包下定义一个UserDaoFactoryBean类 实现FactoryBean接口(实现的接口必须为此)

想造什么对象,泛型就写什么。本文想造UserDao对象,所以泛型写UserDao

实现接口要重写方法

1-得到bean实例

2-得到bean类型

此时更改单例,非单例不再通过bean标签修该

直接在新加的类中添加方法isSingleton,返回值为true就是单例,反之 非单例

3-设定bean是不是单例

用这样的方式造出来的,交给spring管理应该怎么管理呢---怎么管理这个bean?

class此时写新创建的工厂类(程序不需要改其他任何东西)

<bean id="userDao" class="com.yfzhang.factory.UserDaoFactoryBean" />

4-Bean的生命周期

可以使用接口控制生命周期。容器关闭后才会执行destory方法。

也可以使用xml配置文件

bean的生命周期

5-依赖注入方式

5.1-setter注入

5.1.1-简单类型

5.1.2-引用类型

ref是来做引用类型的

5.2-构造器注入

5.2.1-简单类型

5.2.2-引用类型

6-自动装配

6.1  按类型自动装配 

仅需autowire  此时的类型对应id=“bookDao”

 7-加载properties文件

开启context命名空间,生成一个全新的叫做context的空间

8-容器

9-纯注解开发

9.1-注册定义Bean

9.2-生命周期

9.3-自动装配

引用类型

简单类型

配置文件

9.4-第三方bean管理

写一个新的方法,自己手写代码。返回值就是要的bean

把管理对象的方法移出去  然后再配置类中导入进来

9.5-第三方bean依赖注入

配置类的成员变量往里给就行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值