1. 概念
1.1 Spring是什么?
(1)Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用。
(2)是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
--从大小与开销两方面而言spring都是轻量级的。
--通过控制反转(IOC)的技术达到松耦合的目的。
--提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。
--包含并管理应用对象的配置和生命周期,这个意义上是一种容器。
--将简单的组件配置、组合成为复杂的应用,这个意义上是框架。
1.2 Spring作用是什么?
(1)容器
(2)提供了对多种技术的支持
--JMS
--MQ支持
--UnitTest
--。。。。
(3)AOP(事务管理、日志等)
(4)提供了众多方便应用的辅助类(JDBC Template等)
(5)对主流应用框架(Hibernate等)提供了良好的支持。
1.3 适用范围
(1)构建企业应用(Spring MVC + Spring + Hibernate/Mybatis)
(2)单独适用Bean容器(Bean管理)
(3)单独适用AOP进行切面处理
(4)其他的Spring功能,如:对消息的支持等。
(5)在互联网中的应用。。。
1.4 什么是框架
(1)框架的特点
--半成品
--封装了特定的处理流程和控制逻辑
--成熟的、不断升级改进的软件
(2)框架与类库的区别
--框架一般是封装了逻辑、高内聚的,类库则是松散的工具组合。
--框架专注于某一领域,类库则是更通用的。
2. Spring IOC容器
2.1 什么是IOC?
IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。
DI(依赖注入)是某一种实现方式。
目的:创建对象并且组装对象之间的关系。
2.2 单元测试
(1)下载junit-.*jar并引入工程
(2)创建UnitTestBase类,完成对Spring配置文件的加载、销毁。
(3)所有的单元测试类都继承自UnitTestBase,通过它的getBean方法获取想要得到的对象
(4)子类(具体执行单元测试的类)加注解:@RunWith(BlockJUnit4ClassRunner.class)
(5)单元测试方法加注解:@Test
(6)右键选择要执行的单元测试方法执行或者执行一个类的全部单元测试方法。
2.3 Bean容器的初始化
(1)基础:两个包
(2)初始化ApplicationContext方式:
--本地文件
--Classpath
--Web应用中依赖servlet或Listener
2.4 Spring注入
Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
常用的两种注入方式:
(1)设值注入:通过调用属性的set方法自动初始化对象
(2)构造注入
3 Spring Bean装配(上)
3.1 Bean配置项
Bean的配置项主要有:id、Class、Scope、Constructor arguments、Properties、Autowiring mode、lazy-initialization mode、Initialization/destruction method
3.2 Bean的作用域
(1)singleton:单例,指一个Bean容器中只存在一份。
(2)prototype:每次请求(每次使用)创建新的实例,destory方式不生效。
(3)request:每次http请求创建一个实例且仅在当前request内有效。
(4)session:同上,每次http请求创建,当前session内有效。
(5)global session:基于portlet的web中有效(portlet定义了global session),如果是在web中,同session.
3.3 Bean的生命周期
定义、初始化、使用、销毁。其中:
3.4 Bean的自动装配
(1)No:不做任何操作。
(2)byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
(3)byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发送
(4)Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造参数类型一致的bean,那么抛出异常。
4 Spring Bean装配(下)
4.1 Classpath扫描与组件管理
(1)从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是XML定义bean,比如@Configuration,@Bean,@Import,@DependsOn
(2)@Component是一个通用注解,可用于任何bean
(3)@Repository,@Service,@Controller是更有针对性的注解。
--@Repository通常用于注解DAO类,即持久层。
--@Service通常用于注解Service类,即服务层。
--@Controller通常用于Controller类,即控制层(MVC)。
4.2 元注解(Meta-annotations)
5 Spring AOP基本概念
5.1 什么是AOP?
AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
5.1.2 AOP实现方式
(1)预编译
AspectJ
(2)运行期动态代理(JDK动态代理,CGLib动态代理)
SringAOP、JbossAOP
5.1.3 AOP几个相关概念
名称 | 说明 |
切面(Aspect) | 一个关注点的模块化,这个关注点可能横切多个对象 |
连接点(Joinpoint) | 程序执行过程中的某个特定的点 |
通知(Advice) | 在切面的某个特定的连接点上执行的动作 |
切入点(Pointcut) | 匹配连接点的断言,在AOP中通知和一个切入点表达式关联 |
引入(Introduction) | 在不修改类代码的前提下,为类添加新的方法和属性 |
目标对象(Target Object) | 被一个或者多个切面所通知的对象 |
AOP代理(AOP Proxy) | AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能) |
织入(Weaving) | 把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入,类加载时织入,执行时织入 |
5.1.4 Advice的类型
5.1.5 Spring框架中AOP的用途
(1)提供了声明式的企业服务,特别是EJB的替代服务的声明。
(2)允许用户定制自己的方面,以完成OOP与AOP的互补使用。
5.1.6 Spring的AOP实现
(1)纯java实现,无需特殊的编译过程,不需要控制类加载器层次
(2)目前只支持方法执行连接点(通知Spring Bean的方法执行)。
(3)不是为了提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中的常见问题。
(4)Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方案。
5.1.7 有接口和无接口的Spring AOP实现区别
(1)Spring Aop默认使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理。
(2)Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)。
-------------------------------------------------------------------------------------------------------待续!