0
点赞
收藏
分享

微信扫一扫

Spring配置文件详解

梦想家们 2022-02-06 阅读 144



文章目录


  • 1. bean标签基本配置
  • 2. bean标签范围配置
  • 2.1 测试singleton和prototype范围
  • 2.2 测试对象bean创建的时机
  • 2.3 singleton和prototype的总结
  • 3. bean生命周期配置
  • 4. bean 实例化三种方式
  • 4.1 无参构造方法实例化
  • 4.2 工厂静态方法实例化
  • 4.3 工厂实例方法实例化

Spring文章系列篇:

  1. Spring快速入门

1. bean标签基本配置


用于配置对象交由​​Spring​​ 来创建。默认情况下它调用的是类中的无参构造函数如果没有无参构造函数则不能创建成功。

基本属性:


  • ​id​​:Bean实例在Spring容器中的唯一标识
  • ​class​​:Bean的全限定名称

2. bean标签范围配置

  • ​scope​​​:指对象的作用范围,取值如下:
    Spring配置文件详解_ioc

2.1 测试singleton和prototype范围

1、当scope的取值为​​singleton​​时,案例

Spring配置文件详解_bean_02

  • 创建单元测试,引入
dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
  • 创建测试类:
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
  • 当输出的地址是一样的,说明默认是单例模式
    Spring配置文件详解_java_03

2、当scope的取值为​​prototype​​时,案例

  • 把上面的application.xml配置文件中的范围改为​​prototype​
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl" scope="prototype">

  • 其他和上面一样
  • 测试后:
    Spring配置文件详解_ioc_04
  • 说明spring容器当中存在的userDao是多个对象

2.2 测试对象bean创建的时机


  • 因为配置​​scope​​​为​​singleton​​​和​​prototype​​​的不同会导致​​bean​​的创建时机是不一样的
  • 把​​application.xml​​​,bean的访问设置为​​singleton​

<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl" scope="singleton">

  • 默认情况下它调用的是类中的无参构造函数如果没有无参构造函数则不能创建成功。
  • 在 ​​UserDaoImpl​​ 类中复写该类的无参构造方法

public UserDaoImpl() {
System.out.println("UserDaoImpl被创建了......");
}

@Override
public void save() {
System.out.println("save running......");
}


如果找的是无参构造对象,那代表上述语句sout打印一次证明无参构造方法调用一次,无参构造方法调用一次就代表对象创建一次。



断点测试:在测试类中ApplicationContext一行中打一个断点
Spring配置文件详解_java_05



Debug:
Spring配置文件详解_ioc_06



当程序执行到这断点时,控制台还没任何输出,点击下面的跳入
Spring配置文件详解_java_07
Spring配置文件详解_bean_08



打开控制台,发现刚刚重写的无参构造语句输出了
Spring配置文件详解_bean配置文件_09



此时还没执行到getBean方法获取到UserDao的bean。说明applicationContext配置文件一旦被加载,​​UserDaoImpl​​就被创建了



继续执行测试的 :跳入
Spring配置文件详解_ioc_10
Spring配置文件详解_ioc_11
Spring配置文件详解_java_12



完成后没有再去执行无参构造



如果 scope 配置为 prototype ,那这个bean什么时候创建?

当加载配置文件创建spring容器时,bean 就创建了?


  • 把上面scope改为 prototype后,执行上面一样的断点测试
  • 当执行到加载完配置文件时,重写的无参构造方法的语句没有输出
    Spring配置文件详解_spring_13
  • 当执行到完userDao1的getBean()时输出重写的无参构造语句
    Spring配置文件详解_ioc_14
  • 当执行完userDao2时方法时又打印一句,说明对象又被创建一次
  • 执行完后
    Spring配置文件详解_java_15

而设置为 scope 为 prototype 时,bean的创建时机是每次getBean()的时候

2.3 singleton和prototype的总结

1)当scope的取值为​​singleton​​时

Bean的实例化个数:1个

Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

Bean的生命周期:


  • 对象创建:当应用加载,创建容器时,对象就被创建了
  • 对象运行:只要容器在,对象一直活着
  • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为​​prototype​​时

Bean的实例化个数:多个

Bean的实例化时机:当调用​​getBean()​​方法时实例化Bean


  • 对象创建:当使用对象时,创建新的对象实例
  • 对象运行:只要对象在使用中,就一直活着
  • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

3. bean生命周期配置


  • ​init-method​​:指定类中的初始化方法名称
  • ​destroy-method​​:指定类中销毁方法名称

要在配置文件中指定初始化方法或消费方法,才会打印输出,否则就会执行这两个方法

  • applicationContext.xml
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy">

UserDaoImpl

public class UserDaoImpl implements UserDao {
public UserDaoImpl() {
System.out.println("UserDaoImpl被创建了......");
}

public void init(){
System.out.println("初始化方法......");
}

public void destroy(){
System.out.println("销毁方法......");
}

@Override
public void save() {
System.out.println("save running......");
}
}
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
}

  • 对象先创建再去执行初始化方法,init方法通过无参构造去调用
    Spring配置文件详解_bean_16
  • 销毁方法还没来得及打印方法就执行完毕了,所以就看不到销毁的方法输出了。
  • 测试:手动关闭,因为 ​​applicationContext​​ 接口没有对应的关闭方法,所以直接用 ​​ClassPathXmlApplicationContext​​ 来关闭

ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
app.close();

Spring配置文件详解_bean_17

4. bean 实例化三种方式

4.1 无参构造方法实例化

  • 上面的案例

4.2 工厂静态方法实例化

案例:

  • userDao
package com.xdr630.dao;

public interface UserDao {
public void save();
}
  • userDaoImpl
package com.xdr630.dao.impl;

import com.xdr630.dao.UserDao;

public class UserDaoImpl implements UserDao {
public UserDaoImpl() {
System.out.println("UserDaoImpl被创建了......");
}

public void init(){
System.out.println("初始化方法......");
}

public void destroy(){
System.out.println("销毁方法......");
}

@Override
public void save() {
System.out.println("save running......");
}
}
  • 通过静态工厂获取对象
<bean id="userDao" class="com.xdr630.factory.StaticFactory" factory-method="getUserDao"></bean>
  • 创建一个工厂类,StaticFactory
package com.xdr630.factory;

import com.xdr630.dao.UserDao;
import com.xdr630.dao.impl.UserDaoImpl;

public class StaticFactory {
public static UserDao getUserDao(){
return new UserDaoImpl();
}
}
  • 测试,
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
}
}

Spring配置文件详解_java_18

4.3 工厂实例方法实例化

创建工厂bean的配置文件

<bean id="factory" class="com.xdr630.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>

创建工厂实例化

public class DynamicFactory {

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


其他跟上面一样



运行:
Spring配置文件详解_bean配置文件_19



这三种bean的实例化方式,常见一般使用无参构造,其他两种了解即可




举报

相关推荐

0 条评论