Spring(总结整理)

来源:互联网 发布:word转换成excel软件 编辑:程序博客网 时间:2024/06/03 23:39

一. Spring简介

        Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,专门为了解决企业应用程序开发复杂性而创建的。

        Spring框架的不光是技术牛,而是它的核心思想更牛,它不重复发明轮子,而是把业界做的最好的技术黏合起来形成一个强大的企业级的应用框架。
        Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图所示:


组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

1. Spring Core核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。

2. Spring Context(Spring上下文:Spring上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

3. SpringAOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。可以很容易地使 Spring框架管理的任何对象支持AOP。SpringAOP模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

4. SpringDAO:JDBCDAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

5. SpringORM:Spring框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

6. SpringWeb:Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以Spring 框架支持与 Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

7. SpringMVC(框架):MVC框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

        Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring 。


二. IoC控制反转(Inversion of Control)

        将创建对象的权利交给spring容器,以后由spring容器维护对象的生命周期,从此程序员无需关注对象的创建过程。

        例如:User user = new User();    ===>    User user = context.getBean(user);

        配置Bean标签:

        

        编辑测试类:

       

Spring创建对象的原理

1. 当容器创建时,首先会读取核心配置文件applicationContext.xml;

2. 解析配置文件,并且逐行解析。当解析到bean标签时开始实例化对象;

3. 当spring容器扫描到bean标签时,首先解析Class属性,获取类的全路径名,通过反射调用实例化对象;

4. 将实例化的对象存储到Spring所维护的Map<key,value>中,key就是bean中的Id,value就是实例化的对象。

对象创建时注意:

默认情况下(scope=singleton) 是单例的,spring中创建的对象都是单例,并且维护其生命周期。单例对象的生命周期与spring容器共命运,同生共死。

但如果可以设置 scope=prototype 时是多例的,那么Spring容器只负责对象的创建,不负责维护其生命周期,也就是说如果容器关闭,对象并未销毁,需要用户自行关闭。


三. DI依赖注入属性(四种方式)

        1. set方法注入:(自己编写代码时使用Set注入居多)


        2. 构造方法注入:(架构层级用构造注入居多)


public User(String name, Integer age){this.name = name;this.age = age;}

        3. autowire属性注入


注意:@Autowired@Resource的区别

1. @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2. @Autowired默认按类型装配(属于spring),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。

3. @Resource(属于J2EE),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

        4. 通过注解形式注入



四. AOP面向切面编程(Aspect-Oriented Programming)

        AOP的核心思想是代理,AOP是弥补了面向对象的不足,给目标方法做了扩充,可以通过动态代理对象,完成目标对象额外的操作。

        个人的类比理解思路为:小明早上坐公交去上班,这本来是一个完整的过程(一段程序)。途中因为小明熬夜打游戏在公交车上睡着了(切入点), 便一不小心穿越到古代,变成了皇子,过上了风流倜傥的生活。过完这一辈子后(完成AOP类的内容后),便梦醒于公交上,继续到公司去上班。


        1.  实现AOP的技术分为两大类:

        一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

        二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

        Spring提供了两种方式来生成代理对象:JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理。如果目标对象实现了接口,可以强制使用CGLIB实现代理。(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)


        2. AOP的五大金刚:

        (1)切面(Aspect):很好理解,就是一个面,java在这之前关注都是每个类,而AOP出现,关注点提升到更高的层面,由关注某个点提升到关注某个面,所以面向切面编程是面向对象编程的补充。(白话意思:就是一个类)

        (2)切入点(Pointcut):进行规则匹配,不同的匹配,执行不同的内容。(白话意思:匹配规则)

        (3)目标对象(Target Object):被代理的对象。

        (4)连接点(JoinPoint):程序和面交汇的点叫做连接点。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point。(白话意思:客户端调用的方法)

        (5)通知(Advice):在连接点上触发的事件,从而可以在很多位置去执行额外的动作。如前置通知、后置通知、异常通知、环绕通知。(白话意思:执行额外的方法)


        3. AOP注解通知: 常用于异常监控。

        异常处理类和业务逻辑类完全松耦合。时刻捕获生产环境中所有的错误,实时监控该系统,异常收集。

        需求:记录程序异常,哪个类,出现的什么异常。

        @Before                  前置通知

        @Around                 环绕通知

        @AfterThrowing     异常通知

        @AfterReturning    后置通知

        @After                      最终通知