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