Spring是什么
是一个开源框架,为了解决企业应用开发的复杂性而创建的,
是一个轻量级的控制反转和面向切面的容器框架
Spring Framework Runtime
Spring作用
容器
提供了对多种技术的支持
JMS、MQ、UnitTest
AOP(事务管理、日志等)
提供了众多方便应用的辅助类
对主流框架提供良好的支持
什么是框架
通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品
框架的特点
半成品、封装了特定的处理流程和控制逻辑、成熟
框架与类库的区别
框架一般是封装了逻辑、高内聚的,类库则是松散的工具组合
框架专注于某一领域,类库则是更通用
IOC
接口及面向接口编程
接口
1、用于沟通的中介物的抽象化
2、实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改而不影响外界其他实体与其交互方式
3、对应Java接口即声明,声明了哪些方法是对外公开提供的
4、在Java8中,接口可以拥有方法体
面向接口编程
1、结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能接口,各层间仅依赖接口而非实现类
2、接口实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
3、“面向接口编程”中的“接口”是用于隐藏具体实现和实现多态的组件
什么是IOC
IOC:控制反转,控制权的转移,应用程序本身并不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
DI是其一种实现方式
目的:创建对象并且组装对象之间的关系
Spring的bean配置
xml、注解
Bean容器初始化
基础:两个bao
org.springframework.beans
org.springframework.context
BeanFactory提供配置结构和基本功能,加载并初始化Beam
ApplicationContext保存了Bean对象并在Spring中被广泛使用
方式:ApplicationContext
本地文件
Classpath
Web应用中依赖servlet或Listener
Spring注入
是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
常用的两种注入方式
设置注入
构造注入
Spring bean装配之Bean的配置项及作用域
bean的配置项
id:唯一标示
class:实例化类
scope:作用域
Constructor arguments:构造器参数
properties:属性
Autowiring mode:自动装配模式
lazy-intialization mode:懒加载模式
Initialization/destruction method:初始化和销毁
bean的作用域
singletion(默认模式):单例,指在一个bean容器中只存在一个
prototype:每次请求创建新的实例,destroy方式不生效
request:每次htto请求创建一个实例且仅在当前request有效
session:与request相似,在当前session内有效
global session:基于portlet的web中有效
bean的生命周期
定义:通过xml,annotation
初始化:
实现org.springframework.beans.factory.InitializingBean接口,实现afterPropertiesSet方法
配置init-method
销毁
实现org.springframework.beans.factory.DisposableBean接口,覆盖destroy方法
配置destroy-method
配置全局默认初始化、销毁方法
注当三种方式同时使用时,默认的配置不生效,实现接口优先于配置
Aware
Spring中提供了一些以Aware结尾的接口实现了Aware接口的bean在被初始化之后,可以获取相应资源
通过Aware接口,可以对Spring相应资源进行造作
为对Spring进行简单的扩展提供了方便的入口
bean的自动装配
No:不做任何操作
byname:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
bytype:如果容器中存在一个与指定属性类型相同的bean,那么将于该属性自动装配,如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则什么事都不发生
Constructor:与byType方式类似,不同之处在于它应用于构造参数,如果容器中没有找到与构造参数类型一致的bean,那么抛出异常
Resources&
针对资源文件的统一接口
Resources
UrlResources:URL对应的资源,根据一个URL地址即可构建
ClassPathResources:获取类路径下的资源文件
FileSystemResources:获取文件系统里面的资源
ServlrtContextResources:ServletContext封装的资源,用于访问ServletContext环境下的资源
InputStreamResource:针对输入流封装的资源
ByteArrayResource:针对于字节数组封装的资源
ResourceLoader
对Resources加载,所有的ApplicationConeext都实现了Resources
bean的定义及作用域的注解实现
Classpath扫描与组件管理
类的自动检测与注册Bean
Spring可以自动检测类并注册Bean到ApplicationContext
<context:annotation-config/>
<context:component-sca base-packge="" />包含<context:annotation-config/>功能
<context:include-filter type="" expression=""/>
<context:exclude-filter type="" expression=""/>
可以使用use-default-filters = “false”禁用自动发现与注册
type有:annotation、assignable、aspectj、regex、custom
定义一个bean
扫描过程中组件被自动检测,那么Bean名称是由BeanNameGenerator生成的(@Component、@Respository、@Service、@Controller都会有name属性用于显示设置Bean Name)
@Scop 指定作用域,也可以自定义scop策略
@Component
@Respository
@Service
@Controller
@Required:
适用于setter方法
这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值
@Autowired
可以用于setter方法
可以用于构造器或成员变量
每个类只能有一个构造器被标记为required=true
@Qualifier
按类型自动装配可能多个bean实例的情况,可以使用此注解缩小范围(或指定唯一),也可以用指定单独的构造器参数或方法参数
可用于注解集合类型变量
@Resource:相当于 @Autowired + @Resource ,适用于成员变量、只有一个参数的setter方法
基于java容器的注解
@Bean标识一个用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于XML配置文件的<bean>,默认是单例的
@Configration:标记为一个配置类
@ImportResource:引入资源文件
@Value:读取配置文件中的值
基于泛型的自动装配
Spring对JSR支持的说明
@Resource
@PostConstruct:初始化回调
@PreDestroy:销毁回调
注:只有CommonAnnotationBeanPostProcessor是Spring的ApplicationContext中注册的
JSR330标准注解
需要依赖javax.inject包
@Inject:等效与@Autowired
@Named如果想使用特定名称进行依赖注入,与Component等效
AOP
意为面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
主要的功能:日志记录,性能统计,安全控制,事务处理,异常处理等
切面:横切与各个功能之上的
实现方式
预编译:AspectJ
运行期动态代理(JDK、CGLIB):SpringAOP、JbossAOP
相关概念
Advice的类型
Spring框架中AOP的用途
提供了声明式的企业服务,特别是EJB的替代服务的声明
允许用户定制自己的方面,以完成OOP与AOP的互补使用
Spring的AOP实现
纯java实现,无需特殊的编译过程,不需要控制类加载器层次
目前只支持方法执行连接点
不是为了提供最完整的AOP,而是侧重于一种AOP实现和Spring IoC容器之间的整合,用于帮助解决企业应用中的常见问题
Spring AOP不会与AspectJ竞争,从而提供全面的AOP解决方案
有接口和无接口的SpringAOP实现区别
Spring AOP默认使用标准的JavaSE动态代理作为AOP代理,这使得任何接口都可以被代理
Spring AOP中也可以使用CGLIB代理
Schema-based AOP
Spring所有的切面和通知都必须放在<aop:config>内(可以配置包含多个<aop:config>元素),每个<aop:config>可以包含pointcut、dvisor和aspect
注:必须按照这个顺序进行声明
<aop:config>大量使用了Spring代理的机制
pointcut
execution(public * *(..)) 切入点为执行所有public方法时
execution(* set*(..)) 切入点为执行所有set开始的方法时
execution(* com.**.*.*(..)) 切入点为某个类中的所有方法时
execution(* com..(..)) 切入点为执行某个包下的所有方法时
exection(* com...(..)) 切入点为执行某个包及其子包下的所有方法时
within(com.*)(only in Spring AOP)
within(com..*)(only in Spring AOP)
within用于匹配指定类型内的方法执行
this(com.fg.TestServer)(only in Spring AOP)this用于匹配当前AOP代理对象类型的执行方法
advice
Before advice
After returning advice
After throwing advice
使用throwing属性来指定可被传递的异常的参数名称
After(finally)advice
Around advice:通知方法的第一个参数必须是ProceedingJoinPoint类型
Advice parameters
Introductions
简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象
由<aop:aspect>中的<aop:declare-parents>元素声明该元素用于声明所匹配的类型拥有一个新的parent
advisors
就像一个小的自包含的方面,只有一个advice
切面自身通过一个bean表示,并且必须实现某个advice接口,同时,advisor也可以很好的利用AspectJ的切入点表达式
大多数会与transaction adcice配合使用
可以使用order属性定义顺序
Spring AOP API
Pointcut
实现之一:NameMatchMethodPintcut,根据方法名进行匹配
成员变量:mappedNames,匹配的方法名集合
ProxyFactoryBean