Spring-基础(三)

一、bean基础配置
-

1.1 bean基础配置

  • id:bean的id,使用容器可以通过id值找到对应bean,在一个容器中id唯一
  • class:bean的类型,配置的全路径类名

1.2 bean别名配置

  • name:别名,并且可以提供多个别名

1.3 bean作用域配置

  • scope:定义bean的作用番位,可选范围
    • singleton:单例
    • prototype:非单例

为什么bean默认为单例?

  • 适合交给容器进行管理的bean
    • 表现层对象
    • 业务层对象
    • 数据层对象
    • 工具对象
  • 不适合交给容器进行管理的bean
    • 封装实体的域对象

二、实例化bean的方法
-

2.1 bean实例化-构造方法

默认方式

2.2 bean实例化-静态工程

工厂:

public class OrderDaoFactory {
public static OrderDao getOrderDao() {
return new OrderDaoImpl();
}
}

配置:

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

2.3 bean实例化-实例工厂与FactoryBean

2.3.1

实例工厂:

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

配置:

<bean
id="userDaoFactory"
class="xx.xx.UserDaoFactory"
/>
<bean
id="UserDao"
factory-method="getUserDao"
factory-bean="userDaoFactory"
/>

2.3.2

FactoryBean:

public class UserDaoFactoryBean impl FactoryBean<UserDao> {
public UserDao getObject() {
return new UserDaoImpl();
}

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

配置:

<bean
id="userDao"
class="xxxx.UserDaoFactoryBean"
/>

五、bean的生命周期
-

5.1 生命周期控制方法

5.1.1 提供生命周期控制方法

public class BookDaoImpl impl BookDao {
public void init() {}
public void destory() {}
}

5.1.2 配置生命周期控制的方法

<bean id="bookDao" class="xxxx.BookDaoImpl" init-method="init" destory-method="destory"/>

5.1.3 接口控制

实现InitializingBeanDisposableBean接口。

5.2 bean生命周期过程

  • 容器初始化
    1. 创建对象(内存分配)
    2. 执行构造方法
    3. 执行属性注入(set)
    4. 执行bean初始化方法
  • 使用bean
    1. 执行业务操作
  • 关闭/销毁容器
    1. 执行bean销毁方法

5.3 销毁机制

  • 容器关闭前出发bean的销毁
  • 关闭容器方式
    • 手工关闭容器ConfigurableApplicationContext接口close()操作
    • 注册关闭钩子,在虚拟机退出前关闭容器,在关闭虚拟机ConfigurableApplicationContext接口registerShutdownHook()操作

六、依赖注入
-

6.1 分析

  • 向一个类中传递数据的方式有
    • 普通方法(set)
    • 构造方法
  • 依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要数字或字符串?
    • 引用类型
    • 简单类型
  • 依赖注入方式
    • setter注入
    • 构造器注入

6.2 简单类型注入

  • 在bean中定义类型属性并提供set方法

    private int number;
    public void setNumber(int number) {
    this.number = number;
    }
  • 配置中使用prototype标签value属性注入简单类型数据

    <bean id="bookDao" class="xxxx.BookDaoImpl">
    <property name="number" value="10"/>
    </bean>

6.3 构造器注入

  • 在bean中定义引用类型属性提供可访问的构造方法

    private BookDao bookDao;
    public BookDaoImpl(BookDao bookDao) {
    this.bookDao = bookDao;
    }
  • 配置中使用constructor-arg标签ref属性注入引用类型对象

    <bean id="bookService" class="xxxx.BookServiceImpl">
    <constructor-arg name="bookDao" ref="bookDao"/>
    <constructor-arg type="String" value="1"/>
    <constructor-arg index="0" value="1"/>
    </bean>

6.4

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
  2. 可选依赖使用setter进行注入,灵活性强
  3. spring提倡使用构造器
  4. 如果有必要可以使用两者同时注入
  5. 实际开发中根据实际情况
  6. 推荐使用setter注入

七、依赖自动装配
-

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程
  • 自动装配方式

    • 按类型
    • 按名称
    • 按构造方法
    • 不启动自动装配
  • 配置中使用bean标签autowire属性设置自动装配的类型

    <bean id="bookDao" class="xxxx.BookDaoImpl"/>
    <bean id="bookService" class="xxxx.BookServiceImpl" autowire="byName"/>

7.1 特征

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时,必须保障容器中相同类型的bean唯一
  • 使用按名称装配时,必须保障容器中具有指定名称的bean
  • 自动装配优先级低于setter注入和构造器注入

八、集合注入
-

  • 数组: array-value
  • list: list-value
  • set: list-value
  • map: map-entry-key-value
  • properties: props-prop-key

九、加载properties
-

  • 开启context命名空间
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
  • 使用context命名空间,加载指定properties, 不加载系统属性,加载properties文件标准格式
    <context:property-placeholder location="jdbc.properties"/>
    <context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
  • 使用${}读取加载的属性值
    <property name="username" value="${jdbc.username}" />

十、容器
-

10.1 创建容器

  • 方式一:类路径加载
    ApplicationContext ctx = new ClassPathXmlApplicationContext("xxx");
  • 方式二:文件路径加载
    ApplicationContext ctx = new FileSystemXmlApplicationContext("xxx");
  • 方式三:加载多个配置文件
    ApplicationContext ctx = new ClassPathXmlApplicationContext("xxx.xml", "yyy.xml");

10.2 创建bean

  • 方式一:使用bean名称获取
    BookDao bookDao = (BookDao)ctx.getBean("bookDao");
  • 方式二:使用bean名称获取并指定类型
    BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
  • 方式三:使用bean类型获取
    BookDao bookDao = ctx.getBean(BookDao.class);

10.3 容器类层次结构

10.4 BeanFactory