文章目录
- Bean注解
- 使用注解方式代替 web.xml 文件
- Spring注解方式整合Mybatis
- 事务管理器配置
- 请求与响应
- @EnableWebMvc 注解
- REST 风格
- RestController
- ComponentScan
- 静态资源放行
- 表现层数据封装
- @EnableAspectJAutoProxy(AOP注解方式)
- AOP 通知获取数据(参数,返回值,异常)
- 异常处理器
- 项目异常处理
- 拦截器
- Maven 相关
- 分模块开发
- 依赖传递
- 可选依赖与排除依赖
- 依赖冲突
- 聚合
- 继承
- 属性
- 配置文件加载属性
- 版本管理
- 多环境开发
- 跳过测试
- 私服
Bean注解
用户自定义的类可以用 @Service、@Controller 等注解将其标注,使用注解扫描方式使得 Spring 去创建这些 bean 对象。
Q:第三方的类如何使用注解方式使 Spring 去创建呢?
A:@Bean 注解声明
DataSourceConfiguration.java
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Bean("dataSource")public DataSource getDataSource(User user) throws PropertyVetoException {System.out.println("-----加载数据源-------");System.out.println(user);ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(username);dataSource.setPassword(password);return dataSource;}}
SpringConfiguration.java
@Configuration
@ComponentScan("com.xmu")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}
第三方 bean 依赖注入
-
引用类型:方法形参
-
简单类型:成员变量
使用注解方式代替 web.xml 文件
ServletContainersInitConfig.java
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMVCConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
pom.xml
中导入插件
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins>
</build>
Spring注解方式整合Mybatis
DataSourceConfig.java
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Bean("dataSource")public DataSource getDataSource() throws PropertyVetoException {ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(username);dataSource.setPassword(password);return dataSource;}// 事务管理器@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager ds = new DataSourceTransactionManager();ds.setDataSource(dataSource);return ds;}
}
使用注解方式使 Spring 容器去产生 Mapper 类的对象
MybatisConfig.java
public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage("com.xmu.domain");ssfb.setDataSource(dataSource);return ssfb;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.xmu.mapper");return msc;}}
事务管理器配置
首先在 SpringConfig 上加 @EnableTransactionManagement 注解
配置 事务管理器的 Bean
接口上加 @Transactional
请求与响应
请求体中有数据,转换成 Java 对象,Controller 层方法形参 ➕ @RequestBody;
请求参数中有数据,转换成 Java 对象,Controller 层方法形参 ➕ @RequestParam;
@RequestMapping("/addUsers")
public void addUsers(@RequestBody List<User> userList){
}@RequestMapping("/addNames")
public void addNames(@RequestParam List<String> nameList){
}
@EnableWebMvc 注解
注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
@EnableWebMvc:可以开启由 json 数据 转换成对象的开关
eth:请求体中是 Json 数据,而 Controller 层方法形参是 Java 对象
@Configuration
@ComponentScan("com.xmu.controller")
@EnableWebMvc // 可以开启由 json 数据 转换成对象的开关
public class SpringMVCConfig {@Beanpublic ViewResolver viewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/pages/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);return resolver;}
}
REST 风格
@RequestMapping("/user/{id}")
public void method(@PathVariable Integer id){}
RestController
@RestController = @Controller + @ResponseBody
ComponentScan
@ComponentScan(value = "com.xmu",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
静态资源放行
注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
其它方式解决
SpringMVCConfig 去实现WebMvcConfigure 接口的方法,这样就不用 SpringMvcSupport 继承 WebMvcConfigurationSupport
,而且也不用扫描 config
包
步骤:
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {// 静态资源放行registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");}
}
表现层数据封装
后端响应格式
设置统一数据返回结果类
设置统一数据返回结果编码
Controller 层根据操作结果返回 Result
@EnableAspectJAutoProxy(AOP注解方式)
启动 AOP注解开发
AOP 通知获取数据(参数,返回值,异常)
获取切入点参数
这里 proceed 的 args 可以不传递(效果一致),但是如果要对参数修改的话,传递的时候一定要传 args 参数
获取返回值
returning 参数指定接收返回值的对象名称,一般这里的对象用 Object 类型接收,此处的 JoinPoint 参数可写可不写,写的话要放在前面的位置。
获取异常
异常处理器
- 声明这个类是做异常处理的(@RestControllerAdvice)
- 在这个类中实现一个方法处理异常(@ExceptionHandler(异常类型))
项目异常处理
1. 自定义异常类
2. 自定义异常编码
3. 触发自定义异常
4. 拦截并处理异常
5. 前端效果
拦截器
- 编写拦截器类实现 HandlerInterceptor 接口,并实现它的方法,用 @Component 注解将其加入 Spring 容器
- 实现 addInterceptors方法,添加拦截的 Bean 与拦截路径
3. 开启注解扫描这两个类
注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
其它方式解决
SpringMVCConfig 去实现WebMvcConfigure 接口的方法,这样就不用 SpringMvcSupport 继承 WebMvcConfigurationSupport
,而且也不用扫描 config
包