目录

  • Spring
  • 6、引入外部属性文本
  • 引入依赖
  • 创建bean文件
  • 测试
  • 7、bean的作用域
  • 被声明为singleton的bean
  • 8、bean的生命周期
  • 9、bean的作用域和生命周期的影响


Spring

6、引入外部属性文本
引入依赖
<!-- 连接mysql数据库 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>
<!-- 数据源 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.24</version>
</dependency>
创建bean文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8"></property>
		<property name="username" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>

可以用properties文件来简化连接

<!-- 
连接properties文件
	没有context的记得配置头文件中的xmlns 
-->
	<context:property-placeholder location="Sql.properties"/>
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${Sql.driver}"></property>
		<property name="url" value="${Sql.url}"></property>
		<property name="username" value="${Sql.username}"></property>
		<property name="password" value="${Sql.password}"></property>
	</bean>
测试
@SuppressWarnings("resource")
	@Test
	public void testContext() throws SQLException {
		 ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		 DruidDataSource bean = classPathXmlApplicationContext.getBean(DruidDataSource.class);
		 System.out.println(bean.getConnection());
		
	}
7、bean的作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者

目前Spring Bean的作用域范围有五种:

bean标签下scope属性作用域

描述

singleton

在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值

prototype

每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()

WebApplicationContext环境下作用域

描述

request

每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring

session

同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境

application

限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境

被声明为singleton的bean

如果bean的作用域的属性被声明为singleton,那么Spring Ioc容器只会创建一个共享的bean实例。对于所有的bean请求,只要id与该bean定义的相匹配,那么Spring在每次需要时都返回同一个bean实例

Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域。你可以在 bean 的配置文件中设置作用域的属性为 singleton,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton">
    <!-- collaborators and configuration for this bean go here -->
</bean>
8、bean的生命周期

spring的bean的生命周期主要是创建bean的过程,一个bean的生命周期主要是4个步骤:

实例化,属性注入(依赖注入),初始化,销毁


但是对于一些复杂的bean的创建,spring会在bean的生命周期中开放很多的接口,可以让你加载bean的时候对bean做一些改变,因此spring的bean的生命周期总共有以下几步:

首先在spring中有一些特殊的bean会介入到其他bean的声明周期当中去,所以一个普通的bean的生命周期为:

  1. 实现了BeanFactoryPostProcessor接口的bean,在加载其他的bean的时候,也会调用这个bean的 postProcessBeanFactory方法,可以在这个步骤去对bean中的属性去赋值。设置年龄初始化18等等。
  2. 实现了InstantiationAwareBeanPostProcessor接口的bean,会在实例化bean之前调用 postProcessBeforeInstantiation方法
  3. 然后在对bean进行实例化
  4. 对bean进行属性注入
  5. 对bean进行初始化,在初始化中,包含了以下几个步骤: 1. 实现了BeanFactoryAware接口,会先调用setBeanFactory方法 2. 实现了BeanNameAware接口,会先调用setBeanName方法 3. 实现了BeanPostProcessor接口,会先调用postProcessBeforeInitialization方法 3. 实现了InitializingBean接口,会调用afterPropertiesSet方法 4. 然后在进行aop后置处理,通过实现BeanPostProcessor接口,在postProcessAfterInitialization方法中进行动态代理
  6. 销毁
9、bean的作用域和生命周期的影响
  • scope="singleton"下生命周期:实例化、依赖注入、初始化是在加载IOC容器下就进行了
    例:只执行
@SuppressWarnings("resource")
	@Test
	public void testContext() throws SQLException {
		 ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	}

时,就会加载生命周期中的实例化、依赖注入、初始化

  • scope="prototype"下生命周期:实例化、依赖注入、初始化是在创建加载对象下进行的,同时销毁 的周期不属于IOC容器管理所以不会执行

生命周期还受bean的后置处理器影响

完整的生命周期:

  1. 实例化
  2. 依赖注入
  3. 后置处理器BeanPostProcessor初始化之前处理
  4. 初始化
  5. 后置处理器BeanPostProcessor初始化之后处理
  6. 销毁