Spring框架_part1_IOC

 

spring介绍

Spring的出现是为了取代EJB的臃肿、低效、脱离现实缺点,Spring致力于J2EE应用的各层的解决方案,是企业应用开发的“一站式”选择,贯穿表现层、业务层及持久层。Spring并不想取代那些已有的框架,而是与它们无缝地整合。

Spring是分层的JavaSE/EE应用一站式的轻量级开源框架,以Ioc(Inverse of control)控制反转和Aop(Aspect Oriented Programming)面向切面编程为核心 。

分层:系统分层,分为web层、业务层、持久层。
一站式:spring提供各各层的解决方案。
web层:spring MVC框架(类似 struts2,是一个mvc框架),提供和其它web层整合方案
业务层:声明式事务管理方式、任务调度。(即告诉别人要做什么而不是怎么做)

持久层:jdbc模版开发工具包、和其它持久层hibernate框架整合方案
上边各层以IOC和AOP作为基础。
轻量级:相对于EJB来说,好用,简单、方便,spring不依赖应用服务器(weblogic)
开源框架:纯java开源框架。

 

spring体系架构

image

 

IOC入门

将IOc当成一个容器,对象要调用另一个对象时,通过iOC容器来调用。IOC容器相当 于一个工厂。

定义:将原来程序中自己创建实现类对象的控制权反转到IOC容器中,程序只需要从IoC容器获取创建好的对象。

配置文件applicationContex.xml

是spring默认IOC配置文件名称,可以更改

在容器中配置bean(所有能被spring的IOC所管理的java对象,都称为bean),由IOC容器统一管理

image

通过容器来获取bean

image

引出DI依赖注入

IOC叫控制反转,将对象的创建权反转到IOC容器中。
分析哪些bean要反转,所有bean依赖的对象要被反转,比如:action要调用service,action依赖service,service要反转(service要放在容器中 管理),给控制反转起一个名称,叫依赖注入(Dependency Injection)”。
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

applicationContext.xml配置依赖关系

image

IOC和DI的区别

IoC 和 DI 描述的是同一件事
IoC 强调 将对象的创建权,被反转到IoC 容器
DI 强调 IoC容器将对象的依赖关系,动态注入到对象之中 ,DI是控制反转具体的实现过程。

IOC容器的作用:

1、将bean配置applicationContext.xml中,IOC容器在构建时自动创建bean实例(相当于new 对象)

2、将bean所依赖的bean配置applicationContext.xml中 IOC容器自动将bean所依赖的对象注入进去。

applicationcontext应用上下文

BeanFactory是spring的基础设施,面向spring框架本身,ApplicationContext属于上层设施,面向spring框架应用开发人员,一般我们直接使用ApplicationContext应用上下文。

初始化:

ApplicationContext的初始化也叫构建一个IOC容器中的实例对象,通过实例对象操作bean

ApplicationContext在初始化时,将容器中配置的单例的bean自动进行实例化。
BeanFactory在初始化时,并不实例化bean,等到去调用getBean时去实例化。

ApplicationContext的初始化,ApplicationContext面向spring的开发人员

如果applicationContext.xml 在 src下, ClassPathXmlApplication读取
如果applicationContext.xml 在WEB-INF下,FileSystemXmlApplicationContext读取

生命周期

ApplicationContext就是IOC容器,每执行new ClassPathXmlApplicationContext会构建一个新的容器,bean的实例化会重复进行,浪费资源,
解决方案:
将ApplicationContext作成单例方法。

image

 

IOC容器装配bean

 

xml方式

bean的实例化:
类构造器实例化、

image

如果手动添加自定义的有参的构造器,需要保留原来无参构造器!!!

静态工厂方法实例化:在工厂类中有一个静态方法获取对象。

工厂类:

image

交由工厂类管理:

image 

 

实例工厂方法实例化

image

image 

bean的命名

id和name:

定义bean指定id作为在容器中的唯一标识,不允许出现两个相同id的 bean。
定义bean指定name作为它的名称,不允许出现两个相同名称的bean。可以给一个 bean指定多个name,中间使用半角逗号分隔。
根据name或id获取bean的方式相同,调用applicationContext.getBean()方法。

匿名bean:

在容器中定义不指定id和name。

image

通过bean的全限定类型路径获取。

image

bean的作用域

image

singleton:单例bean
在构造applicationContext时候自动创建bean(限定为此bean为单例),在容器中只有一个实例
应用场景:service、dao作为单例 bean管,当多线程访问bean时,bean中不存在数据域的成员变量,此bean是线程的安全的,可以设置为singleton。

image

prototype:多例bean
只在每次调用getBean()创建一个新的bean实例,即从容器中取bean去实例。
应用场景:struts的action设置为多例。

image

bean的生命周期

image

bean的属性注入

构造参数注入:在bean中定义一个有参数的构造方法

image

在applicationContext.xml配置通过构造器注入属性值

image

setter注入:对应一个属性定义一个setter方法

bean中添加setter方法

image

applicationcontext中

image

注解方式

bean实例化
在class上使用@Component标识这个是一个bean

 image image

applicationcontext.xml中配置组件扫描器

image

Component的等效注解

web层:@Controller (表示一个控制器)
业务层:@Service (表示一个业务bean)
持久层:@Respository(表示一个持久层的dao)
如果遇到无法确定属于哪一层的bean 使用@Component
以上三个注解和Component完全 等价的。

image

这三个注解是为了让标注类本身的用途清晰,这个三注解可以使用@Component代替,不过推荐使用这三个注解标注Action、Service、Dao。

扩展什么需要使用注解:
针对哪需要开发比较多的bean,建议使用注解,省去在配置文件定义bean的过程

bean属性注入
@Value:在bean的属性上定义

image

@Autowired(重点)

@Autowired基于类型注入,可以设置属性上或set方法上,不需要指定将哪个bean的id注入

image

如果容器中出现多个bean且相同的类型:使用@Qualifier

image

@Resource (重点):jdk提供@Resource,在spring中支持

image

autowried和resource的区别(重点)

都可以完成属性注入,autowried是 spring提供的,resource是javaEE规范,如果系统的bean只有一个类型,可以使用autowired,如果bean有多个类型,需要autowired和qualifier结合使用

为了系统和spring解耦合,建议使用resource,因为resource是jdk的规范。

bean的作用域(重点)

1、singleton单例

image
2、prototype多例

image

bean的生命周期注解

@PostConstruct 相当于 init-method 指定初始化方法
@PreDestroy 相当于 destroy-method 指定对象销毁方法

xml配置和注解混合使用

Bean定义采用XML :
将bean在xml中配置,不使用compontent-scan组件扫描
Bean属性依赖注入,采用注解
使用annotation-config激活@Value、@Resource、@Autowired注解,实现属性注入

配置bean--xml配置

image

属性注入--注解方式

使用annotation-config激活@Value、@Resource、@Autowired注解

image

简单总结(注解)

1、bean实例化
@component--标注一个bean(通用)
@controller--标注一个action
@service--标注一个service
@repository--标注一个dao
@scop()--singleton或prototype
2、属性注入
@value(spEL)
@Autowired spring的包
和@Autowired同时使用Qualifier(bean的id)
@resource jdk的包

转载于:https://www.cnblogs.com/jkdong1024/p/5328294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值