《Spring实战》摘录 - 10

in #ievolution6 years ago

19-03-14-c0.jpg


91

Q: #4.3.3-2 | 在切面中,将切点表达式进行了分解,以展现参数是在什么地方指定的,用图表示
A:
19-03-14-c1.jpg


92

Q: #4.3.4-1 | 使用Spring AOP,我们可以为bean引入新的方法,代理拦截调用并委托给实现该方法的其他对象。请用图展示这一过程
A:
19-03-14-c2.jpg


93

Q: #4.3.4-2 | @DeclareParents注解由三部分组成
A:

  • value属性指定了哪种类型的bean要引入该接口。在本例中,也就是所有实现Performance的类型。(标记符后面的加号表示是Performance的所有子类型,而不是Performance本身。)
  • defaultImpl属性指定了为引入功能提供实现的类。在这里,我们指定的是DefaultEncoreable提供实现。
  • @DeclareParents注解所标注的静态属性指明了要引入了接口。在这里,我们所引入的是Encoreable接口。


94

Q: #4.4-1 | 基于注解的配置,基于Java的配置,基于xml的配置之间的优先级
A:
基于注解的配置要优于基于Java的配置,基于Java的配置要优于基于XML的配置


95

Q: #4.4-2 | Spring的AOP配置元素能够以非侵入性的方式声明切面,AOP的切面元素都有些什么?
A:

<aop:advisor> - 定义AOP通知器
<aop:after> - 定义AOP后置通知(不管被通知的方法是否执行成功)
<aop:after-returning> - 定义AOP返回通知
<aop:after-throwing> - 定义AOP异常通知
<aop:around> - 定义AOP环绕通知
<aop:aspect> - 定义一个切面
<aop:aspectj-autoproxy> - 启用@AspectJ注解驱动的切面
<aop:before> - 定义一个AOP前置通知
<aop:config> - 顶层的AOP配置元素。大多数的<aop:*>元素必须包含在<aop:config>元素内
<aop:declare-parents> - 以透明的方式为被通知的对象引入额外的接口
<aop:pointcut> - 定义一个切点


96

Q: #4.4.4-1 |<aop:declare-parents> 声明了切面所通知的bean的什么东西?
A:
<aop:declare-parents> 声明了此切面所通知的bean要在它的对象层次结构中拥有新的父类型。具体到本例中,类型匹配Performance接口(由types-matching属性指定)的那些bean在父类结构中会增加Encoreable接口(由implement-interface属性指定)


97

Q: #5.1.1-1 | 请求使用Spring MVC所经历的所有站点
A:
如下图
19-03-14-c3.jpg


98

Q: #5.1.2-1 | 最小但可用的Spring MVC配置
A:

package spittr.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc                    ---> 启用Spring MVC
@ComponentScan("spitter.web")            ---> 启用组件扫描
public class WebConfig extends WebMvConfigurerAdapter{
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();    ---> 配置JSP视图解析器
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeanAsAttributes(true);
        return resolver;
    }
    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){    ---> 配置静态资源
        configurer.enable();
    }
}


99

Q: #5.2.1-1 | 改进HomeControllerTest
A:

package spittr.web;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;
import spittr.web.HomeController;


public class HomeControllerTest{
    @Test
    public void testHomePage() throws Exception{
        HomeController controller = new HomeController();
        MockMvc mockMvc = standaloneSetup(controller).build(); //搭建MockMvc
        mockMvc.perform(get("/")) //对"/"执行get请求
               .andExpect(view().name("home")); //预期得到home视图
    }
}

尽管新版本的测试只比之前版本多了几行代码,但是它更加完整地测试了HomeController。这次我们不是直接调用home()方法并测试它的返回值,而是发起了对“/”的GET请求,并断言结果视图的名称为home。它首先传递一个HomeController实例到MockMvcBuilders.standaloneSetup()并调用build()来构建MockMvc实例。然后它使用MockMvc实例来执行针对“/”的GET请求并设置期望得到的视图名称。


100

Q: #5.2.2-1 | 添加命名空间,使得能够映射到对“/”和“/homepage”的GET请求
A:

//还可以将它映射到对“/homepage”的请求,只需将类级别的@RequestMapping改为如下所示


@Controller
@RequestMapping({"/", "/homepage"})
public class HomeController {
    ...
}

Coin Marketplace

STEEM 0.14
TRX 0.23
JST 0.031
BTC 84230.47
ETH 2080.32
USDT 1.00
SBD 0.63