一、创建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
查看评论