Spring是什么
Spring是一个开源框架,是为了解决企业应用开发的的复杂性而创建的,但是现在已经不仅局限于企业应用。技术层面来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。它有以下的特点:
- 接口
只能有声明不能有实现,支持多重继承(在java8中接口可以拥有方法体)
抽象类:即可以有包含实现的声明也可以有不包含实现的声明
类:声明必须包含实现 接口实现的变动不会影响其他各层的调用,对公共服务非常重要
- IoC——控制反转
- Spring的Bean的配置
<bean id="oneInterface(自定义)" class="配置的实现类"></bean>
public void test(){ OneInterface interface=super.getBean("oneInterface");//获取bean,不需要new对象 interface.hello();//调用函数 }
首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。说完了IoC,那什么又是DI呢?DI的全称就做Dependency Injection,也叫依赖注入,一般是通过外接注入的方式来实现的,主要实现了解耦。DI实现解耦的方式通常有三种:构造器注入、属性设置器注入和接口注入。
- Spring注入
<property name="xxx" ref="xxx"></property>
构造注入:利用属性或成员变量的set方法进行注入 其中property里面的name是需要注入参数的成员变量的名称,ref是注入参数引入bean的名称
<constructor-arg name="xxx" ref="xxx"></constructor-arg>
Bean的配置及作用域
- Bean的常用配置项(理论上只有class是必须的)
- Bean的作用域
- 初始化
- 销毁(与初始化类似)
- 配置全局初始化、销毁方法(属于默认配置)
- LoadTimeWeaverAware,加载Spring Bean时织入第三方模块,如AspectJ
- BeanClassLoaderAware,加载Spring Bean的类加载器
- BootstrapContextAware,资源适配器BootstrapContext,如JCA,CCI
- ResourceLoaderAware,底层访问资源的加载器
- BeanFactoryAware,声明BeanFactory
- PortletConfigAware,PortletConfig
- PortletContextAware,PortletContext
- ServletConfigAware,ServletConfig
- ServletContextAware,ServletContext
- MessageSourceAware,国际化
- ApplicationEventPublisherAware,应用事件
- NotificationPublisherAware,JMX通知
- org.springframework.beans.factory.BeanNameAware,声明Spring Bean的名字
Bean的自动装配(AutoWiring)
1.No:不做任何操作
2.byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
3.byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型的bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生
4.Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常
Bean的自动装配:在beans标签配置属性 default-autowire="no/byName/byType/constructor" 作用为:省去了在Spring的xml中配置property标签和constructor-arg标签,只需要配置bean标签即可
PS:byName和byType为设值注入,constructor为构造注入; byName要求bean标签的id属性需要和成员变量的名称一致, byType和constructor则跟id无关
- 什么是AOP
AOP:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 ·主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
- 对切面的理解
程序中的每一个模块或者说功能,任何一个模块中都要记录它的日志、事务、安全验证等等,给我们带来的工作量非常大。 当程序到达某种规模时,尤其是格式调整之类的,这种改动量是非常大的。如果通过切面方式,对开发人员是不可见的,默认地会对每一个子模块记录日志等这些工作。通过预编译或者动态代理的方式来执行这个功能, 对开发人员是透明,他不需要知道。 切面是和功能垂直的,也就是切面是横切与各个功能之上的
- AOP实现方式
①预编译-AspectJ
②运行期动态代理(JDK动态代理、CGLib动态代理)-SpringAOP、JbossAOP
- AOP几个相关概念
①切面---一个关注点的模块化,这个关注点可能会横切多个对象
②连接点--程序执行过程中的某个特定的点
③通知----在切面的某个特定的连接点上执行的动作
④切入点--匹配连接点的断言,在AOP中通知和一个切入点表达式关联
⑤引入----在不修改类代码的前提下,为类添加新的方法和属性
⑥目标对象-被一个或者多个切面所通知的对象
⑦AOP代理--AOP框架创建的对象,用来实现切面契约(包括通知方法执行等功能)
⑧织入---把切面连接到其他的应用程序类型或者对象上,并且创建一个被通知的对象,分为:编译时织入,执行时织入 Spring的AOP实现 ·纯java实现,无需特殊的编译过程·,不需要控制类加载器层次 ·目前只支持方法执行连接点(通知Spring Bean的方法执行) ·不是为了提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中的常见问题 ·Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方案。 有接口和无接口的Spring AOP实现区别 ·Spring AOP默认使用标准的JAVASE动态代理作为AOP代理,使得任何接口(或者接口集)都可以被代理 ·Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)
Spring的七大模块