控制反转是一种通过描述(在java中通过xml或者注解)并通过第三方去产生或获取特定对象的方式。
控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
控制反转就是获取依赖对象的方式反转了,正常情况下由应用程序主动创建依赖对象,实现对依赖对象的管理,创建依赖对象的控制权在应用程序手中,应用程序需要什么对象,就主动去创建这个对象,这是正转的情况。实现控制反转之后,由IoC容器实现依赖对象的创建和管理,应用程序需要什么样的对象,IoC容器就根据需求创建这个对象,应用程序只是被动地接收和使用这个对象,依赖对象的创建管理控制权由应用程序转移给了IoC容器,这就实现了控制反转。
控制反转的另一种表述方式,即让调用类对某一接口的实现类的依赖关系由第三方(容器或协作类)注入,用以移除调用类对某一接口实现类的依赖。
Spring通过配置文件描述Bean以及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立起Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等服务。
Beanfacory 是Spring框架最核心的接口,提供了高级IoC的配置机制。Beanfacory使管理不同的java对象成为可能,ApplicationContext(应用上下文)建立在Beanfacory基础之上,提供更多面向引用的功能。Beanfacory 即为IoC容器,由于ApplicationContext建立在Beanfacory,我们也称ApplicationContext为IoC容器。
1、动态创建、注入依赖对象。
2、管理对象生命周期。
3、映射依赖关系。
1、依赖查找。
2、依赖注入。
依赖注入的三种方式:1、构造器注入。2、setter注入。3、接口注入。
注入是实例化一个类时对类中各个参数的赋值方式。
装配是定义bean以及bean之间关系。
1、基于xml中配置。
2、基于注解中配置。
3、基于java类配置。
4、基于Groovy DSL配置。
1、单例(singleton):它是默认的选项,在整个应用中,Spring只为其生成一个Bean的实例。
2、原型(prototype):每次注入时,或者通过Spring IoC容器获取Bean时,Spring都会为它创建一个新的实例。
3、会话(session):在web应用中使用,就是在会话过程中Spring只会创建一个实例。
4、请求(request):在web应用中使用,就是在一次请求中Spring会创建一个实例,但是不同的请求会创建不同的实例。
(1)byName:根据名字自行自动匹配。
(2)byType:根据类型自行自动匹配。
(3)construtor:根据构造函数自行自动匹配。
(4)autodetect:根据bean的自省机制选择byType或者construtor。
(1)继承;(2)依赖;(3)引用。
@Component:用于对所有的类进行注解。
@Repository:用于对Dao实现类进行标注。
@Service:用于对Service实现类进行标注。
@controller:用于对controller实现类进行标注。
(1)@Autowired:通过@Autowired注解实现Bean的依赖注入。
(2)@Autowired的required属性:用来指定是否必须找到匹配的Bean。
(3)@Qualifier,指定Bean的名称。
profile:用于切换开发环境。
Spring EL:
概念:更为灵活的注入方式,能够在运行时构建复杂表达式,存取对象属性、对象方法调用等。
1、使用bean id引用bean。
2、调用指定对象的方法和访问对象的属性。
3、进行运算。
4、提供正则表达式进行匹配。
5、集合配置。
概述:AOP技术利用"横切"技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
1、方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。
2、连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
3、通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。
4、切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上。
5、引入(Introduction):添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口。
6、目标对象(Target Object):包含连接点的对象。也被称作被通知或被代理对象。POJO。
7、AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
8、织入(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
1、使用proxyFactoryBean和对应的接口实现AOP
2、使用XML配置AOP
3、使用@AspectJ注解驱动切面
4、使用AspectJ注入切面
(1)aspect里面有一个order属性,order属性的数字就是横切关注点的顺序。
(2)Spring默认以aspect的定义顺序作为织入顺序。
Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器。
(1)传播行为:
Spring定义了七种传播行为,以下为常见类型:
PROPAGATION_REQUIRED:表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行
PROPAGATION_MANDATORY:表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
(2)隔离级别
隔离级别定义了一个事务可能受其他并发事务影响的程度。
(3)只读:通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。
(4)事务超时:事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。
(5)回滚规则:这些规则定义了哪些异常会导致事务回滚而哪些不会。
Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。
简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。
宜信技术学院 作者:姚远