飞道的博客

Spring对bean的管理细节

340人阅读  评论(0)

一、创建bean的三种方式

环境搭建:
1、pom.xml

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.2.RELEASE</version>
</dependency>

2、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">
    
    <bean id="accountService" class="com.uos.service.impl.AccountServiceImpl"></bean>

</beans>

3、IAccountService.java

public interface IAccountService {
    void saveAccount();
}

3、AccountServiceImpl .java

public class AccountServiceImpl implements IAccountService {
    public AccountServiceImpl() {
        System.out.println("对象创建了");
    }

    public void saveAccount() {
        System.out.println("saveAccount()方法被调用了");
    }
}

4、Client .java

public class Client {
    public static void main(String[] args) {
        // 获取核心容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        // 根据id获取bean对象
        IAccountService accountService = applicationContext.getBean("accountService", IAccountService.class);
        accountService.saveAccount();
}

1、方式一

使用默认构造函数的形式:bean标签中只有id和class属性,并没有其他的配置。

<bean id="accountService" class="com.uos.service.impl.AccountServiceImpl"></bean>

如果程序员没有给类AccountServiceImpl 提供构造函数,则编译器会自动提供一个默认的无参数的构造函数;如果用户提供了自己的构造函数,则编译器就不再提供默认的无参数构造函数。此时如果我们使用默认构造函数的形式创建bean则会报错(找不到默认的构造函数)。

2、方式二

使用普通工厂中的方法进行创建对象(使用某个类中的方法创建对象,并存入Spring容器中)

InstanceFactory.java

public class InstanceFactory {
    public IAccountService getAccountService() {
        return new AccountServiceImpl();
    }
}
<bean id="instanceFactory" class="com.uos.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

3、方式三

使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入Spring容器中)

StaticFactory.java

public class StaticFactory {
    public static IAccountService getAccountService() {
        return new AccountServiceImpl();
    }
}
 <bean id="accountService" class="com.uos.factory.StaticFactory" factory-method="getAccountService"></bean>

二、bean的作用范围调整

使用bean标签中的scope属性,scope属性值如下:
  • singleton:单例(默认)
  • prototype:多例
  • request:作用于web应用请求范围
  • session:作用于web应用会话范围
  • global-session:作用于集群环境下的会话范围
 <bean id="accountService" class="com.uos.service.impl.AccountServiceImpl" scope="prototype"></bean>

三、bean对象的生命周期

单例
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象死亡
总结:容器和对象同生共死

多例
出生:当我们使用对象的时候,Spring为我们创建
活着:对象只要在使用过程中就一直活着
死亡:当对象长时间不用,且没有别的对象引用时,由Java垃圾回收机制进行回收

在AccountServiceImpl.java中添加如下方法

	public void init() {
        System.out.println("对象初始化了");
    }
    public void destroy() {
        System.out.println("对象销毁了");
    }
<bean id="accountService" class="com.uos.service.impl.AccountServiceImpl" scope="singleton"
    init-method="init" destroy-method="destroy">

测试代码

public class Client {
    public static void main(String[] args) {
        // 获取核心容器对象
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        // 根据id获取bean对象
        IAccountService accountService = applicationContext.getBean("accountService", IAccountService.class);
        accountService.saveAccount();
        // 手动关闭容器
        applicationContext.close();
}


转载:https://blog.csdn.net/weixin_41842236/article/details/105889638
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场