spring中bean的配置(别名,实例化方法)


bean取别名

bean标签中除了IOC容器可以通过Id命名得到对应的实体类,也可以通过name属性的取名创建实体类。(bean可以定义多个别名 使用逗号 分号 空格来分隔)

<bean id="bookService" name="service service2 service3" class="com.springStudy.service.impl.BookServiceImpl">
        <!--配置service与dao的关系-->
<!--        property标签表示配置当前bean的属性-->
<!--        name属性表示配置一个具体的属性-->
<!--        ref表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>
    </bean>
public class main {
    public static void main(String[] args) {
        //3.获取IOC容器
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        //4.获取bean
        BookService bookService = (BookService) ctx.getBean("service3");

        bookService.save();
    }
}
bean的作用范围(单例和多例的配置)

bean标签中 scope属性控制创建的实体是单例还是多例 singleton(单例模式)  prototype(多例模式)

spring中bean默认创建的对象是单例对象。(实例对象地址相同)
表现层对象,业务层对象,数据层对象,工具对象适合交给容器进行管理(只用创建一次即可)
封装实体的域对象不适合交给容器进行管理(其中的成员变量值会发生改变)

bean的实例化(三种方式)
构造方法(常用)

bean本质上就是对象,创建bean使用构造方法完成。(使用的是无参的构造方法,通过反射的方法实现因此无论无参构造方法是公有还是私有,都可以创建该实体类)

如果没有提供无参的构造方法,将抛出异常BeanCreationExcception

 

 

 静态工厂初始化对象

1.创建工厂类提供静态方法创建需要创建的对象

package com.beanStudy.factory;
import com.beanStudy.dao.OrderDao;
import com.beanStudy.dao.impl.OrderDaoImpl;

public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        System.out.println(" factory setup...");
        return new OrderDaoImpl();
    }
}

2.配置文件中配置对应的bean。

<!--使用静态工厂实例化-->
<!--    factory-method属性:从OrderDaoFactory中找到改方法并执行返回-->
    <bean id="orderDao" class="com.beanStudy.factory.OrderDaoFactory" factory-method="getOrderDao"/>

3.还是通过容器得到对应是实例化对象。

public class AppForInstanceBook {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
        orderDao.save();
    }
}

执行结果:

 实例工厂初始化对象

1.创建工厂类提供方法创建所需实体类。

package com.beanStudy.factory;

import com.beanStudy.dao.UserDao;
import com.beanStudy.dao.impl.UserDaoImpl;

public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

2.配置文件中配置bean
首先创建工厂的实体类,在创建所需类的bean
factory-bean:调用的工厂类bean。
factory-method:调用该工厂类的该方法。

<!--使用实例工厂实例化bean-->
    <bean id="userFactory" class="com.beanStudy.factory.UserDaoFactory"/>
    
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

3.任然通过容器创建所需实体类
 

public class AppForInstanceBook {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
        UserDao userDao = (UserDao) ctx.getBean("userDao");
        userDao.save();
    }
}

执行结果;

 FactoryBean实例化bean(实例工厂初始化对象的改良)(实用方法)

1.创建工厂类去实现FactoryBean<T>接口 T为所需要创建的类型
FactoryBean下有三个方法

package com.beanStudy.factory;

import com.beanStudy.dao.UserDao;
import com.beanStudy.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class UserDaoFactoryBean implements FactoryBean<UserDao> {

    //代替原始实例工厂中创建对象的方法,得到bean的实例
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    //返回的对象是什么类型
    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }

    //控制实现的是单例还是双例(默认为true 单例对象)
    @Override
    public boolean isSingleton() {
        return true;
    }
}

2..配置文件中配置bean

<!--使用factoryBean实例化对象-->
        <bean id="userDao" class="com.beanStudy.factory.UserDaoFactoryBean"/>

此时创建的不是UserDaoFactoryBean的实体类,而是getObject方法返回的实体类。

运行结果:

bean的生命周期

生命周期:从创建到消亡的完整过程。
1.在所需控制生命周期的类中添加所需要的初始化操作方法,或销毁前的操作方法。

package com.beanStudy.dao.impl;

import com.beanStudy.dao.BookDao;

public class BookDaoImpl implements BookDao {

    @Override
    public void save() {
        System.out.println("Book dao save");
    }

    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }

    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }

}

2.修改xml中的配置

<bean id="bookDao" class="com.beanStudy.dao.impl.BookDaoImpl" scope="singleton" init-method="init" destroy-method="destory"/>

init-method:bean初始化前执行该类中的此方法。
destory-method:bean消亡前执行该类中的此方法。

3.让bean消亡的两种方式
(1):ClassPathXmlApplicationContext中调用该类的close方法,直接将容器关闭。
(2):关闭钩子
      调用ClassPathXmlApplicationContext中的registerShutdownHook()方法。
      该方法的作用是,在虚拟机停止之前,会关闭容器。

package com.beanStudy;

import com.beanStudy.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        ctx.registerShutdownHook();

        bookDao.save();
    }
}

如果不想通过xml配置实现生命周期的控制。可以实现InitializingBean和DisposableBean接口实现对应方法。

package com.beanStudy.service.impl;

import com.beanStudy.dao.BookDao;
import com.beanStudy.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {


    @Override
    public void save() {
        System.out.println("book service save ...");
    }


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

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

      

bean的整个过程:
创建对象(内存分配)——>执行构造方法——>执行属性注入(set操作)——>执行bean初始化方法——>执行业务操作——>执行bean的销毁方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值