Spring详解篇之IoC控制反转

###一.Spring概况

  • spring是一个开源框架
  • 是一个轻量的控制反转和面向切面的容器框架
  • 大小和开销都是轻量的。
  • 通过控制反转技术可以达到松耦合的目的
  • 切面编程,允许通过分离应用的业务逻辑。
  • 包含并管理应用对象的配置和生命周期,是一个容器,并且能够组装。

ioc控制反转:控制权转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责和维护。ioc的目的是创建对象并且组装对象之间的关系。

####1.bean容器初始化

  • –org.springframework.beans

  • –org.springframework.context

  • beanfactory 提供配置结构和基本功能,加载并初始化bean

  • applicationContext 保存bean对象并在应用中被应用

2.spring注入:

  • spring 注入是指在启动 spring容器加载bean配置的时候,完成对变量的赋值行为。
  • 常见的注入方式:设值注入、构建注入

举个例子,构建注入

dao层

 
 

service 层接口:

 
 

service 层实现:

 
 

在spring xml中的配置

 
 

单元测试

本系列文章单元测试基类

 
 

单元测试:

 
 

运行打印:

Service接收参数:这是要保存的数据

保存数据:这是要保存的数据:1247298779

这个例子说明,我们可以通过ClassPathXmlApplicationContext.getBean()获取到了service,这个service 是通过xml配置注入到容器中,并且注入的时候通过构造函数的设置了成员变量dao。

####3.1 bean常见的配置项,如下:

  • Id
  • Class
  • Scope
  • Constructor arguments
  • Properties
  • Autowiring mode
  • lazy-initialization mode
  • Initialization/destruction method

3.2 bean的作用域

  • singleton: 单列
  • prototype每次使用都会创建新实例
  • request :每次http请求创建一个实例,仅在当前 request有效
  • session : 当前session有效

举个例子:
测试sinleton和prototype

创建bean实例

 
 

在xml中配置,作用域为singleton

 
 

单元测试:

 
 

运行单元测试:

BeanScope say : 1113008012

BeanScope say : 1113008012

在xml中配置,作用域为prototype

 
 

运行单元测试

BeanScope say : 144724468

BeanScope say : 1432645272

由此可发现sington在bean容器是一个实例,而prototype创建了二个实例。

包括以下几个方面:

  • 定义,在xml中配置
  • 初始化
  • 使用
  • 销毁

初始化

有两种方式

  • 实现 InitializingBeean接口,覆盖afterPropertiesSet()
  • 配置init-method方法

销毁

也有两种方式:

  • 实现DisposableBean接口,覆盖destroy();
  • 配置 destroy-method

举个例子:

创建bean实例:

 
 

bean的配置:

 
 

单元测试:

 
 

运行:

Bean afterPropertiesSet.

Bean start .

Bean destroy.

Bean stop.

同时实现两种方式的初始化方法的执行顺序: 接口实现优先于xml中的配置。

  • No: 不做任何操作
  • byname:根据属性名自动装配
  • byType:如果容器存在一个与指定类型相同的bean,则自动装配,雅思培训一般多少钱如果存在多个,则抛出异常。
  • constructor:与 byType类似,不同之处它在于构造器的参数。

举例子:
1.byName方式:

创建一个dao:

 
 

创建一个service

 
 

在xml中配置:

 
 

单元测试:

 
 

运行:

setAutoWiringDAO

AutoWiringDAO : this is a test

通过default-autowire=“byName”;
AutoWiringService 自动获取了autoWiringDAO的实例。

2.byTYpe

将在xml中配置改为byType :

 
 

其他不变,运行和byName 一样。

3.constructor

 
 

AutoWiringService 中增加构造器

 
 

允行:

AutoWiringDAO : this is a test

从spring 3.0开始,spring javaConfig 项目提供了许多特性,包括使用java而不是xml

1.比如注解

@Configuration
@Bean
@Import
@DependsOn

@Component 是一个通用注解,应用于任何bean

@Reposity注解DAO

@Service注解service

@Controller注解controller

2.spring可以自动检测类并注册bean到applicationContext中。比如
@Service @Reposity等

3.< context:annoation-config />会查找applicationContext中bean的注解。

扫描 :< context:component-scan> 包含< context:annoation-config/>,通常只需要使用前者。

 
 

举个例子:
通过扫描获取bean,在xml中的配置:

 
 

定义一个bean类:
其中scope 注解表示bean的作用域,默认singleton。Component默认类名并将第一个字母小写。

 
 

单元测试:

 
 

运行:

BeanAnnotation : This is test.

  • @Autowired可以用于setter方法上
  • 可以用于成员变量
  • 可以用于构造器

举个例子:

采用包扫描:

 
 

采用注解:DAO层

 
 

service层:

 
 

单元测试:

 
 

运行:

Service接收参数:This is autowired.

保存数据:This is autowired.:1641742937

  • @Bean 标识一个用于配置和初始化一个由springIoC容器管理的新对象的方法,类似于 xml配置文件的</ bean>

举个例子:
用注解去代替xml文件

 
 

javabean StringStore类

 
 

单元测试:

 
 

另外可以用ImportResource注解类获取资源文件信息:

 
 
  • spring支持jsr-250
  • @Resource注解变量或者setter 方法
  • Resource注解有一个name属性,默认该值作为被注入bean的名称。 

猜你喜欢

转载自www.cnblogs.com/yujingyua/p/9809674.html