首页 > 学院 > 开发设计 > 正文

Spring3学习笔记

2019-11-08 19:27:27
字体:
来源:转载
供稿:网友

SPRing3学习笔记

Spring3学习笔记一Spring简介二IOC详解三DI一注入方式六AOP面向切面编程一AOP基础二基于配置Schema的AOP

一、Spring简介

Spring 是一个开源的轻量级应用开发框架。使用Spring可以简化开发流程,Spring可以帮我们管理对象和依赖关系,提供通用日志记录、性能统计、安全控制、事务处理等。

Ioc容器AOP事务管理JDBCMVC框架and so on

非侵入式设计:应用程序不需继承框架的类或接口即可使用框架提供的功能。方便代码重用和框架切换。

POJO:简单java对象,只包含业务逻辑或持久化逻辑。容器:提供运行环境,如Tomcat;管理对象生命周期和依赖关系,如Spring。AOP:AOP是aspect Oriented Programming的缩写,意思是面向切面编程。抽取通用的代码逻辑,在需要的时候动态织入到程序中去。

二、IOC详解

IOC:控制反转,它不是一项技术,而是一种设计思想。IOC容器控制了对象的生命周期和依赖关系,将对象的获取方式反转了。DI:依赖注入,它是IOC的同一个概念的不同角度描述IOC容器:具有依赖注入功能的容器,Spring中的是BeanFactory,其实现类有applicationContext、WebApplicationContext、ClassPathxmlApplicationContext、FileSystemXMLApplicationContext。Bean:由IOC容器管理的对象叫Bean。IOC容器使用BeanDefinition类来表示bean在xml文件中的定义信息。主要包含: 全限定名Bean在容器中的行为,包括作用域、是否惰性初始化、生命周期Bean的创建方式:构造器、工程方法Bean依赖关系,即对其他Bean的引用Bean命名:id是唯一标识符;只有name时,name也可做标识符,可以有别名(alias)

Bean定义方式:

无参构造器:

<bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>

有参构造器:

<bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2"> <!-- 指定构造器参数 --> <constructor-arg index="0" value="Hello Spring!"/> </bean>

静态工厂方式

<!-- 使用静态工厂方法 --> <bean id="bean3" class="cn.javass.spring.chapter2.HelloApiStaticFactory" factory-method="newInstance"> <constructor-arg index="0" value="Hello Spring!"/> </bean>

实例工厂方式

<!—1、定义实例工厂Bean --> <bean id="beanInstanceFactory" class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/> <!—2、使用实例工厂Bean创建Bean --> <bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance"> <constructor-arg index="0" value="Hello Spring!"></constructor-arg> </bean>

假如A类依赖B接口对象,这时B接口有多个实现类注册到了IOC容器中,在注入的时候,spring会报错:重复定义

Spring的IOC有两层含义:Bean依赖容器和容器注入Bean的依赖资源。好处如下:

动态替换Bean依赖对象,程序更灵活;更好实践面向接口编程,代码更清晰;更好实践优先使用对象组合,而不是继承;增加Bean可复用性;

三、DI

(一)注入方式

构造器注入 可分为三种:根据参数索引注入、根据参数类型注入、根据参数名注入,其中索引注入可靠性最高,参数类型注 入中除了制定类型外,还要按照构造函数的参数列表顺序来注入。 构造器注入是需要相应的构造函数的,Spring的BeanFactory会根据配置文件中配置的参数(即constructor)的个数、类型等属性来匹配构造器,如果构造器匹配失败则抛出异常

<!-- 直接用构造器进行类属性的注入 ,属性映射使用相应构造器的参数列表的index进行映射--><bean id="byIndex" class="com.rambo.domain.Person"> <constructor-arg index="0" value="Hello World!" /> <constructor-arg index="1" value="1" /></bean><!--使用静态工厂类来调用构造器进行注入 ,属性映射使用相应构造器的参数列表的index+type进行映射 --><bean id="byType" class="com.rambo.domain.PersonStaticFactory" factory-method="newInstance"> <constructor-arg type="java.lang.String" value="Hello World!" /> <constructor-arg type="int" value="2" /></bean><!--使用实例工厂类来调用构造器进行注入 ,属性映射使用相应构造器的参数列表的index+name进行映射,不建议使用 --><bean id="byName" class="com.rambo.domain.PersonFactory" factory-method="newInstance"> <constructor-arg name="message" value="Hello World!" /> <constructor-arg name="index" value="3" /></bean>

setter注入 其先通过默认构造器实例化Bean以后,再通过setter方法将属性设值,所以该类的默认构造器不能被覆盖。

<!-- 通过setter方式进行依赖注入 --> <bean id="bean" class="cn.javass.spring.chapter3.HelloImpl4"> <property name="message" value="Hello World!"/> <property name="index"> <value>1</value> </property> </bean>

可以看出来,value如果用简写的方式,指定的全是字符串,类型转换的工作有Spring容器来处理,如果转换出错将抛出相应的异常。 Spring类型转换系统对于boolean类型进行了容错处理,除了true/false外,还可以用yes/no、on/off、1/0来表示。

六、AOP–面向切面编程

(一)AOP基础

AOP:面向切面编程,是一种编程范式。模板方法:接口定义方法fun(),实现类A实现fun(),并定义模板方法funA(), 子类继承A,并实现funA()。AOP相关概念: 关注点:可以认为是所关注的任何东西,如支付组件;关注点分离:将问题细化为不可分割的组件,如支付组件和日志组件;横切关注点:一个组件无法完成所需的功能,需要其他组件协助完成,如日志组件横切于支付组件;织入:横切关注点分离后,需要通过某种技术将横切关注点融合到系统中来完成需要的功能;织入可能发生在编译期、加载期、运行期等。横切关注点有很多,如非业务的:日志、事务处理、缓存、性能统计、权限控制;也有可能业务的。AOP的作用: 分离横切关注点并织入;完善OOP;降低组件和模块之间的耦合性;使系统容易扩展;更好地复用组件。AOP基本概念: 连接点(Jointpoint):表示在什么地方进行横切关注点的插入,如:类初始化、方法执行、方法调用、字段调用、异常处理等,Spring只支持方法执行的连接点,在哪里干 切入点(Pointcut):连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,默认使用AspectJ语法,在哪儿干的集合通知(Advice):在连接点上执行的行为,包括前置通知(before advice)后置通知(after advice)环绕通知(around advice),Spring通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知,干什么方法/切面(Aspect):横切关注点的模块化,如日志组件。Spring中可以使用Schema和@AspectJ方式进行组织实现,在哪儿干和干什么的集合引入(inter-type declaration):内部类型声明,为已有的类添加新的字段/方法。目标对象(Target Object):需要织入横切关注点的对象,亦作”被通知对象”,Spring中是被代理对象,即委托对象,对谁干织入(Weaving):将切面应用到目标对象从而创建出AOP代理对象的过程,可以在编译期、类装载期、运行期进行。

(二)基于配置(Schema)的AOP


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表