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体系架构
IOC入门
将IOc当成一个容器,对象要调用另一个对象时,通过iOC容器来调用。IOC容器相当 于一个工厂。
定义:将原来程序中自己创建实现类对象的控制权反转到IOC容器中,程序只需要从IoC容器获取创建好的对象。
配置文件applicationContex.xml
是spring默认IOC配置文件名称,可以更改
在容器中配置bean(所有能被spring的IOC所管理的java对象,都称为bean),由IOC容器统一管理
通过容器来获取bean
引出DI依赖注入
IOC叫控制反转,将对象的创建权反转到IOC容器中。
分析哪些bean要反转,所有bean依赖的对象要被反转,比如:action要调用service,action依赖service,service要反转(service要放在容器中 管理),给控制反转起一个名称,叫依赖注入(Dependency Injection)”。
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
applicationContext.xml配置依赖关系
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作成单例方法。
IOC容器装配bean
xml方式
bean的实例化:
类构造器实例化、
如果手动添加自定义的有参的构造器,需要保留原来无参构造器!!!
静态工厂方法实例化:在工厂类中有一个静态方法获取对象。
工厂类:
交由工厂类管理:
实例工厂方法实例化
bean的命名
id和name:
定义bean指定id作为在容器中的唯一标识,不允许出现两个相同id的 bean。
定义bean指定name作为它的名称,不允许出现两个相同名称的bean。可以给一个 bean指定多个name,中间使用半角逗号分隔。
根据name或id获取bean的方式相同,调用applicationContext.getBean()方法。
匿名bean:
在容器中定义不指定id和name。
通过bean的全限定类型路径获取。
bean的作用域
singleton:单例bean
在构造applicationContext时候自动创建bean(限定为此bean为单例),在容器中只有一个实例
应用场景:service、dao作为单例 bean管,当多线程访问bean时,bean中不存在数据域的成员变量,此bean是线程的安全的,可以设置为singleton。
prototype:多例bean
只在每次调用getBean()创建一个新的bean实例,即从容器中取bean去实例。
应用场景:struts的action设置为多例。
bean的生命周期
bean的属性注入
构造参数注入:在bean中定义一个有参数的构造方法
在applicationContext.xml配置通过构造器注入属性值
setter注入:对应一个属性定义一个setter方法
bean中添加setter方法
applicationcontext中
注解方式
bean实例化
在class上使用@Component标识这个是一个bean
applicationcontext.xml中配置组件扫描器
Component的等效注解
web层:@Controller (表示一个控制器)
业务层:@Service (表示一个业务bean)
持久层:@Respository(表示一个持久层的dao)
如果遇到无法确定属于哪一层的bean 使用@Component
以上三个注解和Component完全 等价的。
这三个注解是为了让标注类本身的用途清晰,这个三注解可以使用@Component代替,不过推荐使用这三个注解标注Action、Service、Dao。
扩展什么需要使用注解:
针对哪需要开发比较多的bean,建议使用注解,省去在配置文件定义bean的过程
bean属性注入
@Value:在bean的属性上定义
@Autowired(重点)
@Autowired基于类型注入,可以设置属性上或set方法上,不需要指定将哪个bean的id注入
如果容器中出现多个bean且相同的类型:使用@Qualifier
@Resource (重点):jdk提供@Resource,在spring中支持
autowried和resource的区别(重点)
都可以完成属性注入,autowried是 spring提供的,resource是javaEE规范,如果系统的bean只有一个类型,可以使用autowired,如果bean有多个类型,需要autowired和qualifier结合使用
为了系统和spring解耦合,建议使用resource,因为resource是jdk的规范。
bean的作用域(重点)
1、singleton单例
bean的生命周期注解
@PostConstruct 相当于 init-method 指定初始化方法
@PreDestroy 相当于 destroy-method 指定对象销毁方法
xml配置和注解混合使用
Bean定义采用XML :
将bean在xml中配置,不使用compontent-scan组件扫描
Bean属性依赖注入,采用注解
使用annotation-config激活@Value、@Resource、@Autowired注解,实现属性注入
配置bean--xml配置
属性注入--注解方式
使用annotation-config激活@Value、@Resource、@Autowired注解
简单总结(注解)
1、bean实例化
@component--标注一个bean(通用)
@controller--标注一个action
@service--标注一个service
@repository--标注一个dao
@scop()--singleton或prototype
2、属性注入
@value(spEL)
@Autowired spring的包
和@Autowired同时使用Qualifier(bean的id)
@resource jdk的包