SSM in Action——最终总结

Spring

Spring的关键点在于IoC容器和AOP框架,以及简化的数据和事务的服务。

  • IoC称为控制反转,以依赖注入的方式来实现:dont call me, we will call u。
  • AOP是为了弥补oop专注于业务需求的缺陷,比如系统需求需要打印日志,oop的做法会使得单一职责的类承担一些不必要的功能。
  • 简化数据访问和事务管理:举个例子就是模版化代码的替代,mybatis中,我们只需要配置一个config和mapper就可以忽略connection等一大堆模版化的代码。

IoC
以酒吧为例子,去了酒吧,我们不需要自己调制啤酒,而是对waiter说,我要xxx啤酒。或者waiter直接认识你是个常客,照旧给你端上来想要的啤酒。
waiter就相当于一个IoC Service Provider的角色,作用是业务对象的构建管理以及业务对象间的依赖绑定。
注入方法有三种,构造方法注入、setter注入以及不提倡使用的接口注入。setter方法不像构造方法那样,对象构造完就能使用,就好像进了酒吧,不是常客的你对waiter说,我需要xxx啤酒。

IoC Serivice Provider主要是以如下方法来判断注入对象和依赖对象的关系的:xml配置和java config。

Ioc Service Provider只是Spring IoC 容器的一部分,Spring提供了两种容器 beanfactory(懒汉式)和applicationcontex(饿汉式),除此之外applicationcontext是在前者基础上构建的,还包括其他功能。

beanfactory的具体实现包含了一个beanfactory以及beanDifinitionRegistry,后者才是担当bean的注册管理的角色。折旧好像,你去图书馆借书,虽然你是直接跟图书馆(也就是beanfactory的实例)打交道,但是书实际上是放在书架上(beanDifinitonRegistry)上的,由书架负责维护,书架上的书就是beanDifinition。

容器中对象生命周期包括,singleton(单例,容器不销毁一直存在),prototype(每一次请求都会生成一个新的对象,需要请求方自行销毁),还有其他的适合web程序的生命周期。

AOP
在开发中为了调试或者在生产环境中对系统进行监控,我们需要为这些系统需求添加日志记录功能,为了不破坏原来的类的单一功能,并且将系统需求的实现更具模块化,引入了AOP。
Aspect之于AOP就像Class之于OOP,如果说OOP的一个个CLASS是纵向模块的话,Aspect就需要被横向织入到模块中。

装配bean

有xml配置、java config配置,以及自动装配。
使用@Component和@ComponentScan的注解来标明该类作为组件以及启用组件扫描。
Spring的应用上下文会默认给bean一个Id,作法就是将类名第一个字母小写。可以通过@Component(“xxx”)和@Named(“xxx”)来修改默认命名。然后通过在@Bean(“xxx”)指定装配的bean。
如果没有为@ComponentScan设置任何属性,那么它会以当前包作为基础包来扫描。
最后通过@Autowired或者@Inject实现自动装配。

Profile
在Java配置中,可以使用@Profile注解指定某个bean属于哪个profile。

条件化的bean
@Conditional只有在xxx的条件下才创建,比如包含某个特定的库或者某个特定的bean被声明后才创建。设置给@Conditional的类可以是任意实现了Condition接口的类型。

处理自动装配的歧义性
NoUniqueBeanDefinitionException.可以由@Primary或者@Qualifier解决。

bean的作用域
@Scope来设置singleton或者prototype等等作用域的bean。

注入外部的值
通过配置properties声明属性,并通过Spring的Environment来检索属性。
我们有时候不希望写死属性,这就需要属性占位符${}或者SpEL#{},并通过@Value实现。

AOP

Spring切面包含5类通知:before after afterreturning afterthrowing around。这些通知的时机被成为连接点。一个切面并不需要通知所有的连接点,所以切面有助于缩小通知范围。
@EnableAspectJAutoProxy启用注解,@Pointcut定义切点,ProceedingJoinPoint jp的proceed()方法不能忘记调用,如果不调用这个方法,你会阻塞被通知方的调用。当然你也可以多次调用已达到通知失败后的重复尝试。
在这里插入图片描述

Spring——SpringMvc和MyBatis的基石

在这里插入图片描述
1)Spring是这个体系的基石,负责对接mybatis和SpringMVC,形成这个体系。2)mybatis是负责持久层的,也就是后台如何跟数据库交互。3)SpringMVC是web层面的框架,负责前端与后台的交互。

Spring和mybatis对接
使用Spring的profile,我可以拥有多种配置方案,比如一套linux的配置方案,一套是windows的配置方案,我在linux系统上切换成linux的方案就好了。
首先src/main/resources下创建jdbc文件夹用来放置不同数据库连接配置。比如一个开发环境的连接数据库配置,一个发布环境的连接数据库配置。
jdbc-develop.properties
jdbc-publish.properties

src/main/resources下创建spring-profile.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <!-- spring profiles 配置不同profile -->
    <beans profile="develop">
        <util:properties id="jdbc"
            location="classpath:jdbc/jdbc-develop.properties" />
    </beans>
    <beans profile="publish">
        <util:properties id="jdbc"
            location="classpath:jdbc/jdbc-publish.properties" />
    </beans>

</beans>

然后在web.xml中使该配置生效即可:下面这种写法,默认配置是publish,当前生效的是develop的配置。

<!--从类路径下加载Spring配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:spring-*.xml;
        </param-value>
    </context-param>
    <!--spring profile 上下文参数 -->
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>develop</param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>publish</param-value>
    </context-param>

<!--启动Spring容器的监听器,他将引用contextConfigLocation获得上下文配置文件的地址-->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

然后是Mybatis-config.xml文件:

 <!-- 扫描文件(自动将 dao service层注入) -->
    <context:component-scan base-package="com.vzr.VShow.dao" />
    <context:component-scan base-package="com.vzr.VShow.service" />


    <!--数据源配置-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
        destroy-method="close">  
        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
        <property name="driverClassName" value="#{jdbc['jdbc.driverName']}"/>
        <!-- 基本属性 url、user、password -->
        <property name="url" value="#{jdbc['jdbc.url']}" />
        <property name="username" value="#{jdbc['jdbc.username']}" />
        <property name="password" value="#{jdbc['jdbc.password']}" />
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="#{jdbc['jdbc.pool.minIdle']}" />
        <property name="minIdle" value="#{jdbc['jdbc.pool.minIdle']}" />
        <property name="maxActive" value="#{jdbc['jdbc.pool.maxActive']}" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="#{jdbc['jdbc.pool.maxWait']}" />
    </bean>  

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <!-- 自动扫描mapping.xml文件 -->  
        <property name="mapperLocations" value="classpath:com/vzr/VShow/mapping/*.xml"></property>  
    </bean>  

    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
        <property name="basePackage" value="com.vzr.VShow.dao" />  
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
    </bean>  

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  

如果设置了spring.profiles.active的话,它的值就会用来确定哪个profile是激活的。如果没有设置active,那么Spring将会查找default的值。如果均没有设置的话,那就没有激活的profile,因此只会创建那些没有定义在profile中的bean。
然后通过在service里注入mapper以及@Service标签实现持久层以及服务层。

Spring与SpringMVC对接
这个比较简单,通过@Controller@RequestMapping,以及注入service来完成(@Autowired、@Qualifier)。

Sprig Web应用程序

在这里插入图片描述
请求离开浏览器的第一站是DispatcherServlet,它可以将请求委托给应用程序的其他组件来执行。首先它通过请求所带有的url信息来查询处理器映射,得知这个请求应该发送给哪个控制器。
请求传递给相应的控制器后,控制器将业务委托给服务对象进行处理,并得到返回结果信息。
控制器把这些信息打包,作为model和视图名的形式发还给DispatcherSevlet。Servlet会使用视图解析器将视图名匹配为一个特定的视图实现。

按照传统的方式,像DispatcherServlet这样的Servlet会配置在web.xml文件中。用Java config的方式就是继承一个AbstractAnnotationConfigDispatcherServletInitializer类。它需要覆写三个方法:

  • getServletMappings(),它会将一个或者多个路径映射到DispatcherServlet。
  • getServletConfigClasses()。DispatcherServlet启动时,他会创建Spring应用的上下文,并加载配置文件或配置类中的所有声明的bean。我们要求DispatcherServlet加载应用上下文时,加载我们在WebConfig中的配置bean。
  • getServletConfigClasses()。返回的root config目前我不太清楚用处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值