Spring中的bean配置

配置说明

类别 描述
名称 bean
类型 标签
所属 beans标签
功能 定义Spring核心容器管理的对象
格式

属性
列表
id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id是唯一的
class:bean的类型,即配置的bean的全路径类名
范例
1、Bean别名配置

配置说明

类别 描述
名称 name
类型 属性
所属 bean标签
功能 定义bean的别名,可定义多个,使用逗号,分号,空格分隔
范例

代码演示

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
    name属性:可以设置多个别名,别名之间使用逗号,空格,分号等分隔
    注意:id只能设置一个,并且id的值要唯一。name可以设置多个
    给BookDao取别名
    -->
    <bean class="com.demo.dao.impl.BookDaoImpl" id="bookDao" name="bookDao2,bookDao3"></bean>

</beans>
@Test
public void test01(){
    //创建IOC容器,加载xml文件创建文件中的对象到IOC容器中
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-bean-base.xml");

    //使用IOC容器获取name = bookDao2对象
    BookDao bean = (BookDao) ctx.getBean("bookDao2");

    //对象调用方法
    bean.save();

    //关闭容器
    ctx.close();
}

**注意事项:**获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException

2、Bean作用范围配置

配置说明

类别 描述
名称 scope
类型 属性
所属 bean标签
功能 定义bean的作用范围,可选范围如下:
singleton 单例(默认)在IOC容器创建时创建,只创建一次
prototype 非单例 每次从IOC容器获取的时候都会创建新的对象,获取多次创建多次。
范例

scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。

  • request:仅适用于Web环境下的ApplicationContext,每一个Http请求都会拥有一个单独的实例。
  • session:仅适用于Web环境下的ApplicationContext,即每一个用户都将拥有一个单独的实例。
  • globalSession:仅适用于Web环境下的ApplicationContext,表示每一个全局的Http Session下都会拥有一个单独的实例。

为什么bean默认为单例?

适合交给容器进行管理的bean

  • 控制器对象 (以前用的Servlet做为控制器)
  • 业务层对象 (如:BookService)
  • 数据层对象 (如:BookDao或BookMapper)
  • 工具对象 (如:CartUtils对象)

以上对象都只需要创建一个就够了

不适合交给容器进行管理的bean

  • 封装实体的域对象(实体类对象 Book 包名:pojo,entity, domain)
  • 实体类对象一般是mybatis查询数据库得到结果,需要根据每一次结果创建对象
3、bean的生命周期

生命周期相关概念介绍

  • 生命周期:从创建到消亡的完整过程
  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期控制:在bean创建后到销毁前做一些事情

代码演示

  • 提供生命周期控制方法
public class BookDaoImpl implements BookDao {
    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...");
    }
}
  • applicationContext.xml配置
<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
  • 测试类
public class AppForLifeCycle {
    public static void main( String[] args ) {
        //此处需要使用实现类类型,接口类型没有close方法
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //关闭容器,执行销毁的方法
        ctx.close();
    }
}
  • 容器关闭前触发bean的销毁
  • 关闭容器方式:
    • 手工关闭容器
      调用容器的close()操作
    • 注册关闭钩子(类似于注册一个事件),在虚拟机退出前先关闭容器再退出虚拟机
      调用容器的registerShutdownHook()操作
public class AppForLifeCycle {
    public static void main( String[] args ) {
        //此处需要使用实现类类型,接口类型没有close方法
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();
        //关闭容器
        //ctx.close();
    }
}
4、Bean对象的创造方式

构造方法方式

  • BookDaoImpl实现类
public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }
    public void save() {
        System.out.println("book dao save ...");
    }
}
  • applicationContext.xml配置

<bean id="bookDao" class="com.demo.dao.impl.BookDaoImpl"/>
  • AppForInstanceBook测试类
public class AppForInstanceBook {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        bookDao.save();
    }
}

**注意:**无参构造方法如果不存在,将抛出异常BeanCreationException

静态工厂方式

  • OrderDao接口和OrderDaoImpl实现类
public interface OrderDao {
    public void save();
}
public class OrderDaoImpl implements OrderDao {
    public void save() {
        System.out.println("order dao save ...");
    }
}
  • OrderDaoFatory工厂类
//静态工厂创建对象
public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}
  • applicationContext.xml配置

<bean id="orderDao" class="com.demo.factory.OrderDaoFactory" factory-method="getOrderDao"/>
  • AppForInstanceOrder测试类
public class AppForInstanceOrder {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");

        orderDao.save();
    }
}

实例工厂方式

  • UserDao接口和UserDaoImpl实现类
public interface UserDao {
    public void save();
}
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("user dao save ...");
    }
}
  • UserDaoFactory工厂类
//实例工厂创建对象
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
  • applicationContext.xml配置

<bean id="userFactory" class="com.demo.factory.UserDaoFactory"/>

<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
  • AppForInstanceUser测试类
public class AppForInstanceUser {
    public static void main(String[] args) {
        //        //创建实例工厂对象
        //        UserDaoFactory userDaoFactory = new UserDaoFactory();
        //        //通过实例工厂对象创建对象
        //        UserDao userDao = userDaoFactory.getUserDao();
        //        userDao.save();
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) ctx.getBean("userDao");
        userDao.save();
    }
}

你可能感兴趣的:(spring,java,后端)