用户自定义的类可以用 @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 依赖注入
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[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
pom.xml
中导入插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>8080port>
<path>/path>
configuration>
plugin>
plugins>
build>
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;
}
// 事务管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(dataSource);
return ds;
}
}
使用注解方式使 Spring 容器去产生 Mapper 类的对象
MybatisConfig.java
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.xmu.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
@Bean
public 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){
}
注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
@EnableWebMvc:可以开启由 json 数据 转换成对象的开关
eth:请求体中是 Json 数据,而 Controller 层方法形参是 Java 对象
@Configuration
@ComponentScan("com.xmu.controller")
@EnableWebMvc // 可以开启由 json 数据 转换成对象的开关
public class SpringMVCConfig {
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
}
@RequestMapping("/user/{id}")
public void method(@PathVariable Integer id){}
@RestController = @Controller + @ResponseBody
@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 {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 静态资源放行
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}
}
这里 proceed 的 args 可以不传递(效果一致),但是如果要对参数修改的话,传递的时候一定要传 args 参数
获取返回值
returning 参数指定接收返回值的对象名称,一般这里的对象用 Object 类型接收,此处的 JoinPoint 参数可写可不写,写的话要放在前面的位置。
获取异常
1. 自定义异常类
2. 自定义异常编码
3. 触发自定义异常
4. 拦截并处理异常
5. 前端效果
注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
其它方式解决
SpringMVCConfig 去实现WebMvcConfigure 接口的方法,这样就不用 SpringMvcSupport 继承 WebMvcConfigurationSupport
,而且也不用扫描 config
包