Spring框架总结

Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。序言:

   小伙伴们,spring框架大家应该不陌生吧,因为它基本适用java的任何一个项目,都会用到它,首先来说一下spring到底是什么呢,我的理解是spring是一个基于代理结构的管理框架,它不充当项目中mvc中的任何一个环节,但是它影响每一个环节,mvc任何一个环节受spring管理,而spring的存在大大节省了软件开发效率,也节约了软件开发成本,最重要的是它也降低了软件开发的门槛,让人人可以开发,也解密了软件的神秘面纱。

                                                                              

一.发展背景

Spring(由Rod Johnson创建的一个开源框架)  方法

      ①Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
      ②Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及 持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。其中这一点尤其重要,刚开始学习框架的人以为spring也是作为mvc中的一层进行出现,不然,并不是这样的,spring开发之出并没有想要替换它们,spring设计初衷就是怎么样能让它们之间更好的合作开发出更好的软件。这是设计初衷,小伙伴们要着重理解这一点,对大家学习spring很重要。
 二.框架特征
  轻量--从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,  Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
  控制反转--它也是spring的核心思想,想要熟练的使用spring,就要始终把这种思想贯穿在脑中,Spring通过一种称作控制反转( IoC)的技术促进了低耦合。当应用了IoC,  一 个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
  面向切面---Spring提供了 面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和 事务transaction)管理)进行 内聚性的开发。 应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器----Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型( prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的 组件配置、组合成为复杂的应用。在Spring中, 应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能( 事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。

小伙伴们,以上我是参考的spring的官方解释,大家了解一下,毕竟是专业的嘛。
三.作用以及用法
   spring践行工厂模式,作为工厂(容器)出现,生产项目中的组件,进而管理组件,最终管理整个项目,所以如果一个项目中用了spring框架,它是整个框架的一个核心,没有它项目就无法运作,它出问题了,整个项目就瘫痪了。所以学好spring很重要。spring是java的框架中一个很有代表性的框架,虽然java框架千千万万种,但是所有的框架无非就是为了解决开发时间以及成本来开发的,这点不会变。大同小异,现在绝大多数公司用的框架主体是:ssm架构,即spring+springmvc+mybatis 基本上就是这样的架构,spring作决策者,springmvc作控制器,接收请求和响应请求。mybatis作数据源层,它和数据库进行通信,然后按照一定sql脚本规则取过来的数据传递给业务层进行处理(其中包括事务),传递给控制层(即springmvc),由它进行把数据传递给VIEW层进行渲染显示给用户。
  基本上所有的框架都离不开配置文件,即XML,spring也不例外,在配置文件中可以告诉spring需要生产bean的规则,如何管理项目,需要统统把mybatis纳入工厂管理。让spring接手管理决策。

  下面告诉大家一些它的用法:
   首先spring工厂的搭建:
    配置文件:applicationContext.xml  在这个配置里面需要配置需要生产的类是什么,然后spring才能生产一个对象出来(bean)。


如此配置了之后,直接通过id标识获取bean对象即可。这是生产简单对象的基本方法。

启动工厂有两张方法:
 ①通过接口进行启动,言外之意就是spring会认识这个接口,当有人调用这个接口时,spring会启动工厂模式,并创建好工厂中所有的bean等待被调用。
 ApplicationContext(接口)  context=new ClassPathXmlApplicationContext("/applicationContext.xml");
如此工厂启动完成  context就是工厂bean 工厂对象。我们取我们自己的对象(bean)也是从context中取的。
 ②通过在web.xml中配置监听的方式进行启动的,当启动服务器时,web.xml会初始化工厂从而启动工厂并创建所有的bean,等待被调用(其中包括Dao对象,Service对象,实体对象)都会被进行创建。我们通过标识进行获取即可。从而不需要我们自己手动创建,降低了耦合性。
 
其中第一种方法:当启动工厂以后,怎么样取bean对象呢?
context.getBean(“userDao”)//从工厂中获取bean
getBean()方法返回值的类型是Object,需要强转为我们需要的类型,即:UserDao userDao=(UserDao)context.getBean("userDao");
这是第一种方法取对象的方式,当然这种方法也仅仅局限于刚开始使用的spring的时候,为了了解工厂的内部结构和使用规则,才用此方法取bean.
当然,我们在正式的项目中此方法肯定是不会用的,有些小伙伴是不是感觉非常麻烦,是的,这肯定不是我们经常使用的方法。初学spring时知道即可。

第二种方法:是当服务器开启的时候,程序会初始化web.xml中的配置信息,在这里配置工厂监听即可。
监听如下:
<!-- 1.spring侦听 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 当配置好此配置之后,当服务器被开启的时候,工厂也就启动了,而工厂中所有的bean也被创建了,接下来工厂等待开发人员来取就可以了。
具体怎么取呢??
我们需要把mybatis纳入spring工厂管理,所以我们需要配置一下mybatis的信息,告诉spring哪些包需要被扫描需要创建对象。
具体配置如下:
①首先在applicationContext.xml需要包扫描,授权spring需要管理的包。

<context:component-scan base-package="hanuser.*">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>


其中<context:exclude-filter type="annotation" 。。。。>言外之意是排除带有Controller注解的包,它不被扫描。

②配置数据源,创建连接池连接。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>







<!-- 3.连接工厂,操作数据库的 -->  创建工厂bean,创建复杂对象时用的,例如:sqlSession,
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="typeAliasesPackage" value="hanuser/entity"></property>
    <property name="mapperLocations" value="classpath:config/*-map.xml"></property>
</bean>
此配置的意思是:创建复杂对象时需要用到工厂bean,创建sqlSessonFactory,需要得到sqlSession,连接数据库。
其中第一个配置dataSource是数据连接,连接数据库的数据源,那是肯定必须的。
其他属性是附加的:
第二项:typeAliasesPackage的作用是提前指定实体的权限名,当再次使用实体类的时候,只需要使用类名即可(别名),并不需要再map文件中都要指定权限名。
 
   
第三个配置:mapLocations的作用
  当mybatis的xml文件和mapper接口不在相同包下时,需要mapperLocations属性指定xml文件的路径,*是一个通配符,代表所有的文件
<!--4. 扫描Dao -->  
<!-- 通过扫描的模式,扫描目录在hanuser.Dao目录下的Dao-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="hanuser.Dao"></property>
    <property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"></property>
</bean>

扫描所有的Dao接口文件,并创建实现类,来提供bean对象。mybatis有个特点,没有实现类。其实Dao的实现类就是个中介,完全可以给工厂创建定义,然后我们直接在service通过工厂使用即可。

至此,spring的使用过程已经介绍完毕。
下面,介绍一下需要需要注意的地方:
DI(实操):自动注入

  • byType:基于属性类型 自动注入

                 :在工厂中查找和属性同类型的bean,将bean注入给属性

 :如果没有找到则不赋值,属性为null

 :如果工厂中有多个bean都和属性同类型,则因无法选择抛出异常

  • byName:基于属性名称 自动注入

   :在工厂中查找ID和属性名相同的bean,将bean注入给属性

   :如果没有找到则不赋值,属性为null


当在service中定义dao属性的时候,取bean的模式,注入值的方式就是注解byName的模式。







  • bean的生产原理


 反射:


<bean id=xxclass=com.xx.XX></bean>


Spring读取到如上配置时,会生产该类的对象:


Class claz=Class.forName(com.xx.XX);


XX obj=(XX)claz.newInstance();


获得类对象,然后调用空参构造获得实例对象


  • bean的创建模式


  两种创建模式singleton/prototype


 singleton:单例模式


spring工厂中只生产一次对应bean


                      : 即工厂中只有一份对应bean的对象


                      : 默认创建模式


  • Prototype:原型模式(非单例模式)


           :每次使用bean,spring工厂都会重新创建对象


有状态的bean需要原型模式,无状态的bean使用默认的单例模式即可

• bean的生命周期
 


如果使用spring生产复杂对象,就不可以直接new了,<bean id="xx" class="com.cn.XX">
这样使用id直接获取bean显然就不可以了,已经不适用了。
要想使用spring生产复杂对象必须找到复杂对象的工厂bean,用工厂bean生产复杂对象,而不直接通过工厂进行生产,间接的向工厂bean索要即可,例如:sqlSession对象,就不能直接进行生产,则需要通过SqlSessionFactory这样的工厂bean进行生产sqlsession。

aop:面向切面编程,相对于OOP的编程单位是class,aop的编程单位是切面(Aspect),aop基于代理框架功能,
代理结构:目标+额外功能

动态代理:
定制目标和额外功能   编织:将额外功能和目标组合成代理。
代理:目标+额外功能+切入点
切面:额外功能+切入点


关于spring的知识先介绍到这里。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值