IOC相关内容

目录

1、Bean的基础配置

1.1、Bean的基础配置(id和class)

1.2 、Bean的name属性

1.3、Bean的作用范围scope属性 

1.4、Bean基本配置小结

2、Bean实例化

2.1、构造方法实例化

2.2、静态工厂

2.3、实力工厂与FactoryBean

2.4、FactoryBean的使用 

2.5、bean实例化小结

3、bean的生命周期

3.1、生命周期设置

3.2、bean生命周期小结


1、Bean的基础配置

对于Bean的配置中,主要是Bean基础配置,Bean的别名配置,Bean的作用范围配置。

1.1、Bean的基础配置(id和class)

注意:class属性不能写接口,因为接口是没办法创建对象的

1.2 、Bean的name属性

注意:Bean依赖注入的ref属性指定Bean,必须在容器中存在

1.3、Bean的作用范围scope属性 

思考:

1、为什么bean默认为单例?

  • bean为单例的意思是在SpringIOC容器中只会有该类的一个对象
  • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
2、bean 在容器中是单例的,会不会产生线程安全问题 ?
  • 如果对象是有状态对象(即该对象有成员变量可以用来存储数据的),因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
  • 如果对象是无状态对象(即该对象没有成员变量没有进行数据存储的),因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
1.4、Bean基本配置小结

2、Bean实例化

 实例化Bean的三种方法:构造方法静态工厂实例工厂

Bean的本质上就是对象,对象在new的时候会使用构造方法完成,那么在创建Bean时也是使用构造方法完成的。

2.1、构造方法实例化

为类提供一个无参构方法

public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("BookDaoImpl is running.......");
    }
}
  • 当将public改为private时,依旧运行成功,说明内部走的依旧是构造方法,能访问到类中的私有构造方法,显而易见Spring底层用的是反射。
  • Spring底层使用的时类 的误餐构造方法
2.2、静态工厂

步骤1:创建一个工厂类bookDaoFactory并提供一个静态方法

public class BookDaoFactory {
    public static BookDao getBookDai(){
        return new BookDaoImpl();
    }
}

步骤2:在Spring配置文件中applicationContext.xml中添加以下内容:

<bean id="bookDao" class="com.AT.utility.BookDaoFactory" factory-method="getBookDao"></bean>

class:工厂类的类全名

factory-mothod:具体工厂类中创建对象的方法名

静态工厂的意义:在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,这些操作必不可少。 

2.3、实力工厂与FactoryBean

步骤1:创建一个工厂类bookDaoFactory并提供一个普通方法

public class BookDaoFactory {
    public BookDao getBookDao(){
        return new BookDaoImpl();
    }
}

步骤2:在Spring配置文件中配置以下内容。

//factory-bean:工厂的实例对象
//factory-method:工厂对象中的具体创建对象的方法名
<bean id="BookDaoFactory" class="com.AT.utility.BookDaoFactory"></bean>
<bean id="bookDao" factory-method="getBookDao" factory-bean="BookDaoFactory"></bean>

实例化工厂的运行顺序:

  1. 创建实例化工厂对象,对应第一行的配置
  2. 调用对象中的方法来创建Bean,对应的是第二行配置

2.4、FactoryBean的使用 

步骤1:创建一个工厂类bookDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法。

public class BookDaoFactoryBean implements FactoryBean<BookDao> {
    public BookDao getObject() throws Exception {
        return new BookDaoImpl();
    }

    public Class<?> getObjectType() {
        return BookDao.class;
    }
}

 步骤2:在Spring配置文件中进行配置

<bean id="bookDao" class="com.AT.utility.BookDaoFactoryBean"></bean>

factoryBean接口的三个方法:

  • 方法一:getObject(),被重写后,在方法中进行对象的创建并返回
  • 方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象
  • 方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默true。
2.5、bean实例化小结

(1)bean实际上都是构造方法(无参)创建的。

(2)重点掌握构造方法和factoryBean即可。

3、bean的生命周期

(1)什么是生命周期

  • 由创建到消亡的整个过程

(2)bean生命周期控制是什么

  • 在bean创建后到销毁前做一些事情
3.1、生命周期设置

具体的控制有两个阶段:

  • bean创建之后,想要添加内容,比如用来初始化需要用到资源
  • bean销毁之前,想要添加内容,比如用来释放用到的资源

实现方法也有两种。一种是通过编码加配置进行实现,另一种通过接口实现

方法一:编码加配置

步骤1:添加初始化和销毁方法

在bookDaoImpl类中分别添加两个方法,方法名任意

public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("BookDaoImpl is running.......");
    }

    public void init(){
        System.out.println("init.......");
    }
    public void destory(){
        System.out.println("destory.......");
    }
}

步骤2:配置生命周期

在配置文件中,如下:

<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>

方法二:接口方法

Spring 提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置 init - method
destroy - method
接下来在 BookServiceImpl 完成这两个接口的使用 :
修改 BookServiceImpl 类,添加两个接口 InitializingBean DisposableBean 并实现接口中的
两个方法 afterPropertiesSet destroy
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

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

    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

小细节:

  • 对于InitializingBean接口中的afterPropertiesSet方法,翻译过来为属性设置之后
  • 对于BookServiceImpl来说,bookDao是它的一个属性
  • setBookDao方法是SpringIOC容器为其注入属性的方法
3.2、bean生命周期小结
       
(1) 关于 Spring 中对 bean 生命周期控制提供了两种方式 :
  • 在配置文件中的bean标签中添加init-methoddestroy-method属性
  • 类实现InitializingBeanDisposableBean接口,这种方式了解下即可。
(2) 对于 bean 的生命周期控制在 bean 的整个生命周期中所处的位置如下 :
   
  • 初始化容器
  1. 创建对象(内存分配)
  2. 执行构造方法
  3. 执行属性注入(set操作)
  4. 执行bean初始化方法
  • 使用bean
  1. 执行业务操作
  • 关闭/销毁容器
  1. 执行bean销毁方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值