欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【温故而知新】Spring容器

程序员文章站 2024-03-23 18:12:40
...

1、 容器是spring框架的核心,使用IOC管理所有组件

2、 Spring容器的分类

2.1 Bean工厂,简单,提供基础DI:Beanfactory
2.2 应用上下文:ApplicationContext

BeanFactory与ApplicationContext的区别?

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。

ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

简单区别:

  1. BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;

  2. ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;

3、Spring容器ApplicationContext应用上下文的实现类

常用实现:
1从类路径中加载配置文件
2从文件系统中加载配置文件
3从web上下文加载配置文件(需要导入spring-web-4.0.2.RELESE.jar)

4、Spring容器中的Bean的生命周期

a. 实例化bean对象(通过构造方法或者工厂方法)
b. 设置对象属性(setter等)(依赖注入)
c. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
d. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
e. 将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
f. 调用Bean的初始化方法
g. 将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
h. 使用Bean
i. 容器关闭之前,调用Bean的销毁方法

5、Spring容器对Bean的装配(DI)

1、 什么是bean的装配?
指由spring容器创建注入组件对象的过程,即被称为bean的装配

2、 Spring容器bean的装配方式
2-1:spring2.5的基于xml的装配
2-2:spring3.0的基于注解的装配(常用)
2-3:spring4.0提出的基于groovy的装配

3、 Bean元素在容器中的基本语法为(基于xml)
<bean id=’’ class=’’ ‘’>
<bean id=’’ class=’’ ‘’/>
id:用于设置bean组件对象在容器中的名称
class:用于设置bean组件的类名称(完整名称)

4、 Spring容器中的Bean默认状态下都是单态模式
如果要改变bean的单态模式,可以通过改变完成
Spring3.0版本中,使用singleton属性
<bean id="person" class="com.wangjie.po.Person" singleton ="true"/>
Spring4.0版本中,使用scope属性
<bean id="person" class="com.wangjie.po.Person" scope="singleton"/>

5、 Bean的初始化行为和销毁行为设置方式
5-1:通过在配置文件中进行配置
步骤:1、在Bean的组件类上自定义初始化方法和销毁方法
2、在配置中添加如下配置:
<bean id="" class="" init-method="自定义初始化行为" destroy-method="自定义销毁行为"/>
5-2:通过实现spring框架提供的接口
步骤:在bean组件类上添加接口并重写方法
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

6、 bean的注入
<1> 基本数据类型的注入:

<2> 组件对象的注入:(常用)

<bean id="person" class="com.wangjie.po.Person">
			<property name="pid" value="1001"></property>
			<property name="pname" value="张三"></property>
			<property name="dog" ref="dog"></property>```
	</bean>

ref=”dog”表示引用其它bean,这个bean是已经创建的

<3> 数组数据的注入:

<bean id="person" class="com.wangjie.po.Person">
	<property name="pid" value="1001"></property>
	<property name="pname" value="张三"></property>
	<property name="dog" ref="dog"></property>
	<property name="houses">
		<array>
			<value>房子1</value>
			<value>房子2</value>
			<value>房子3</value>
			<value>房子4</value>
		</array>
	</property>

<4>集合数据的注入:(set list)
【温故而知新】Spring容器
<5>Map注入:
【温故而知新】Spring容器

8 使用注解装配bean

8-1 在项目中添加spring-aop和spring-context的对应JAR包

8-2 在spring的配置文件中添加AOP和context的命名空间引用,例如:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
//*****//
</beans>

8-3 在spring配置文件中增加注解扫描配置:

  例如:
<context:component-scan base-package="com.huibo">
		<context:include-filter type="annotation" expression="com\.wangjie\.po.*"/>
		<context:exclude-filter type="annotation" expression="com\.huibo\.test.*"/>
	</context:component-scan>

简写:

 <context:component-scan base-package="com.wangjie"/>

备注:
base-package:设置当前项目中要扫描注解的基础包
context:inlude-filter:用于设置注解扫描时基础包中要包涵的包和类
context:exclude-filter:用于设置注解扫描时基础包中不扫描的包和类
type:用于设置扫描过滤器匹配的类型
【温故而知新】Spring容器
expressions:用于设置扫描过滤器匹配类型对应的表达式

8-4:在组件bean的类上添加对应的组件注解标识,常用注解如下:

**@Component:通用组件bean
@Controller:控制器组件bean
@Service:模型组件bean
@Repository:持久化组件bean**

.8-5:在具有依赖关系的组件类中使用@Autowired注解自动注入组件bean

  例如:
	@Component
	Public class Person {
		@Autowired

Private Dog dgo;

9、value注解的使用

作用:读取properties文件中的配置信息并注入到组件对象的属性中
使用步骤:

9-1:在项目中添加属性文件(properties文件),并将这个文件放在src目录下

9-2:在属性文件中,加入对应的key=value

9-3:在spring配置文件中配置容器加载属性文件

配置spring加载自定义

【温故而知新】Spring容器
备注:需要使用util命名空间
【温故而知新】Spring容器

9-4:在需要注入数据的组件类中,使用@Value完成注入

public class XXX{
			@Value("#{configProperties['key']}")
	private  String  xxx;

public  void  setParam(String  param){
	this.param = param;
}
}

备注:key代表的是属性文件中数据的名称
要注入的属性必须提供setter方法
在@Value注解使用${}写法:
1、 在9-3配置中补充一个bean的配置
2、 在类的属性上按如下写法进行书写