文章目录
- 一、创建bean的三种方式
- 1、使用默认构造函数创建
- 2、使用普通工厂的方法创建对象
- 3、使用工厂模式 创建对象
- 二、bean对象的作用范围
- 1、bean.xml
- 2、测试类
- 三、bean对象的生命周期
- 1、bean.xml
- 2、业务层实现类
- 3、测试类
- 1.创建bean的三种方式
- 2.bean对象的作用范围
- 3.bean对象的生命周期
一、创建bean的三种方式
1、使用默认构造函数创建
<!-- 第一种方式:使用默认构造函数创建。
在spring的配置文件中使用bean标签,配置id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象。
注意:如果类中没有默认构造函数,则对象无法创建。
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
public class AccountServiceImpl implements IAccountService{
public AccountServiceImpl() {
System.out.println("对象创建了");
}
public AccountServiceImpl(String name) {
System.out.println("对象创建了String name");
}
public void saveAccount() {
System.out.println("AccountServiceImpl.saveAccount()");
}
}
2、使用普通工厂的方法创建对象
<!-- 第二种方式:使用普通工厂的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
此种方式是:
先把工厂的创建交给 spring 来管理。
然后在使用工厂的 bean 来调用里面的方法
factory-bean 属性:用于指定实例工厂 bean 的 id。
factory-method 属性:用于指定实例工厂中创建对象的方法。
-->
<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
/**
* 第二种方式:spring 管理实例工厂-使用实例工厂的方法创建对象
* 模拟一个实例工厂,创建业务层实现类
* 此工厂创建对象,必须现有工厂实例对象,再调用方法
*/
public class InstanceFactory {
public IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
3、使用工厂模式 创建对象
<!-- 第三种方式:使用工厂模式 创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
此种方式是:
使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
id 属性:指定 bean 的 id,用于从容器中获取
class 属性:指定静态工厂的全限定类名
factory-method 属性:指定生产对象的静态方法
-->
<bean id="accountService" factory-method="getAccountService" class="com.itheima.factory.StaticFactory"></bean>
/**
* 第三种方式:spring 管理静态工厂-使用静态工厂的方法创建对象
* 模拟一个静态工厂,创建业务层实现类
*/
public class StaticFactory {
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
二、bean对象的作用范围
1、bean.xml
<?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">
<!-- 把对象的创建交给spring来管理 -->
<!-- bean的作用范围调整
bean标签的scope属性:
作用:用于指定bean的作用范围
取值:常用的就是单例和多例的
singleton:单例的(默认值)
prototype:多例的(创建两次对象)
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:
作用于集群环境的会话范围(全局会话范围),
当不是集群环境时,它就是session
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="singleton"></bean>-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="prototype"></bean>
</beans>
2、测试类
public class Client {
public static void main(String[] args) {
//1、获取核心容器对象
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2、根据id获取bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
IAccountService as2 = (IAccountService)ac.getBean("accountService");
System.out.println(as==as2);
/**
多例------>prototype:false
单例------>singleton:true
singleton:单例的(默认值)
prototype:多例的(创建两次对象构造方法执行两次)
*/
//as.saveAccount();
}
}
三、bean对象的生命周期
1、bean.xml
<!-- bean对象的声明周期
(1)单例对象singleton 总结:单例对象的生命周期和容器相同
出生:当容器创建时,对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象死亡
(2)多例对象:prototype
出生:当我们使用对象时spring框架为我们创建
活着:对象在使用过程中就一直活着。
死亡:当对象长时间不用且没有别的对象引用时,(由java的垃圾回收器回收。)
(3)方法:属性:init-method destroy-method
单例:(立即加载)在加载配置文件时加载。
多例:(延迟加载)在使用对象时加载。
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
scope="singleton" init-method="init" destroy-method="destroy"></bean>
2、业务层实现类
public class AccountServiceImpl implements IAccountService{
public AccountServiceImpl() {
System.out.println("空构造方法");
}
public AccountServiceImpl(String name) {
System.out.println("对象创建了String name");
}
public void saveAccount() {
System.out.println("servlce中的saveAccount方法执行了~~~");
}
//初始化方法
public void init() {
System.out.println("servlce中的init(初始化)方法执行了~~~");
}
//销毁方法
public void destroy() {
System.out.println("servlce中的destory(销毁)方法执行了~~~");
}
}
3、测试类
public class Client {
public static void main(String[] args) {
//1、获取核心容器对象
//ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//ApplicationContext没有关闭的方法,看不到容器销毁
//ClassPathXmlApplicationContext有可以看到容器销毁
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2、根据id获取bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
as.saveAccount();
//手动关闭容器
ac.close();
}
}