
3.2 构造器注入3.3 自动配置标签删除; 标签中添加 autowire 属性。在或标签内部写array、list、set、map、props标签。

管理第三方bean步骤:

${key}5. 核心容器

@Configuration注解,将其标识为一个配置类,替换applicationContext.xml;@ComponentScan替换@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {}
@Scope:设置该类创建对象的作用范围,可用于设置创建出的bean是否为单例对象@PostConstruct:设置该方法为初始化方法@PreDestroy:设置该方法为销毁方法注解开发只提供了自动装配的注解实现。
@Autowired:为引用类型属性设置值,自动装配;@Qualifier:为引用类型属性指定注入的beanId,即可以在多个实现类中指定注入Bean的 Id;@Value:为 基本数据类型 或 字符串类型 属性设置值;@PropertySource:加载properties文件中的属性值,属性值可以使用@Value("${key}")注入。@Bean注解将方法的返回值制作为Spring管理的一个bean对象@Bean:设置该方法的返回值作为spring管理的bean@Import({JdbcConfig.class})引入第三方bean@Import:导入配置类@Value注解引入值,在第三方bean的方法中传递参数进去即可;
要整合的内容:
第一件事是:Spring要管理MyBatis中的SqlSessionFactory
第二件事是:Spring要管理Mapper接口的扫描
整合步骤:


@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {SpringConfig.class}) //加载配置类spring-context、aspectjweaver@Pointcut("execution(void com.itheima.dao.BookDao.update())")
private void pt(){}@Before("pt()")@Component、@Aspect@EnableAspectJAutoProxyexecution(* com.itheima.service.*Service.*(..))- 前置通知
- 后置通知
- 环绕通知(重点)
- 返回后通知
- 抛出异常后通知9.5 通知中获取参数@EnableAspectJAutoProxy:配置类定义上方,开启注解格式AOP功能@Aspect:切面类定义上方,设置当前类为AOP切面类@Pointcut:切入点方法定义上方,设置切入点方法@Before:通知方法定义上方,设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行@Before@After:通知方法定义上方,设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行@AfterReturning:通知方法定义上方,设置当前通知方法与切入点之间绑定关系,当前通知方法在原始切入点方法正常执行完毕后执行@AfterThrowing:通知方法定义上方,设置当前通知方法与切入点之间绑定关系,当前通知方法在原始切入点方法运行抛出异常后执行@Around:通知方法定义上方,设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行,对原始方法的调用通过pjp.proceed();实现@Transactional,可以写在接口类上、接口方法上、实现类上和实现类方法上,建议写在实现类或实现类的方法上@EnableTransactionManagement@EnableTransactionManagement:配置类定义上方,设置当前Spring环境中开启注解式事务支持;@Transactional:业务层接口上方、业务层实现类上方、业务方法上方,为当前业务层方法添加事务(如果设置在类或接口上方则类或接口中所有方法均添加事务)
@Transactional注解的参数上进行设置
@Transactional
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(String out,String in,Double money ) {logDao.log("转账操作由"+out+"到"+in+",金额:"+money);
}2-SpringMVC
1. SpringMVC概述与入门案例
1.1 SpringMVCSpringMvcConfig,添加注解:@Configuration
@ComponentScan("com.itheima.controller")@Controller注解,定义方法添加@RequestMapping("/save")注解设置当前控制器方法请求访问路径,添加注解@ResponseBody设置返回数据为jsonpublic class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Override
protected Class>[] getRootConfigClasses() {return new Class[]{};
}
@Override
protected Class>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {return new String[]{"/"};
}
}@Configuration
@ComponentScan(value="com.itheima",
excludeFilters=@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
) p
ublic class SpringConfig {}@Controller:SpringMVC控制器类定义上方,设定SpringMVC的核心控制器bean;@RequestMapping:SpringMVC控制器类或方法定义上方,设置当前控制器方法请求访问路径;@ResponseBody:SpringMVC控制器类或方法定义上方,设置当前控制器方法响应内容为当前返回值,无需解析@ComponentScan:类定义上方,设置spring配置类扫描路径,用于加载使用注解格式定义的bean;excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)和具体项(classes)、includeFilters:加载指定的bean,需要指定类别(type)和具体项(classes)@@RequestMapping("/book")、@RequestMapping("/user")进行区分@Override
protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}2.2 五种类型参数传递@RequestParam注解@RequestParam:SpringMVC控制器方法形参定义前面,绑定请求参数与处理器方法形参间的关系@EnableWebMvc注解@RequestBody注解@EnableWebMvc:SpringMVC配置类定义上方,开启SpringMVC多项辅助功能@RequestBody:SpringMVC控制器方法形参定义前面,将请求中请求体所包含的数据传递给请求参数——用于接收 json 数据@RequestParam:用于接收url地址传参,表单传参@DateTimeFormat:SpringMVC控制器方法形参前面,设定日期时间型数据格式@ResponseBody,如果加了该注解,会直接将页面名称 page.jsp 当字符串返回前端@ResponseBody注解,文本数据return回去即可@ResponseBody注解和@EnableWebMvc注解,将实体类对象或集合对象 return 即可@ResponseBody:SpringMVC控制器方法定义上方和控制类上,设置当前控制器返回值作为响应体,写在类上,该类的所有方法都有该注解功能。方法上有@ReponseBody注解后按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
按照不同的请求方式代表不同的操作类型:
@RequestMapping提到类上面,用来定义所有方法共同的访问路径/books、/user@GetMapping@PostMapping@PutMapping@DeleteMapping设置当前控制器方法请求访问路径与请求动作@RestController注解替换@Controller与@ResponseBody注解写在 Controller 类上方@PathVariable解决方法形参的名称和路径{}中的值不一致问题与多个参数的区分问题@PathVariable:SpringMVC控制器方法形参定义前面,绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应@RestController:基于SpringMVC的RESTful开发控制器类定义上方,设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能@GetMapping @PostMapping @PutMapping @DeleteMapping:基于SpringMVC的RESTful开发控制器方法定义上方,设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry){//当访问/pages/????时候,从/pages目录下查找内容
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}同时注意让 SpringMvcConfig 配置类扫描到 config 包中的 SpringMvcSupport 类。
4. SSM 整合流程:
spring-jdbc、spring-testmybatis、mysql-connector-java、druid、mybatis-springjunitspring-webmvc、javax.servlet-api、jackson-databindtomcat7-maven-plugin
@Configuration
@ComponentScan({"com.itheima.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {}public class JdbcConfig {@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
public DataSource dataSource(){DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager dstm = new DataSourceTransactionManager();
dstm.setDataSource(dataSource);
return dstm;
}
}public class MyBatisConfig {@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.itheima.domain");
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.itheima.dao");
return mapperScannerConfigurer;
}
}@Configuration
@ComponentScan({"com.itheima.controller", "com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {}// Web 项目入口配置类
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {// 加载 Spring 配置类
@Override
protected Class>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};
}
// 加载 SpringMvc 配置类
@Override
protected Class>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};
}
// 配置 SpringMVC 请求地址拦截规则
@Override
protected String[] getServletMappings() {return new String[]{"/"};
}
// 设置 post 请求中文乱码过滤器
@Override
protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
}@RestController
@RequestMapping("/books")
public class BookController {@Autowired
private BookService bookService;
@PostMapping
public Result save(@RequestBody Book book){boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_OK : Code.SAVE_ERR, flag);
}
@PutMapping
public Result update(@RequestBody Book book){boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_OK : Code.UPDATE_ERR, flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_OK : Code.DELETE_ERR, flag);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){Book book = bookService.getById(id);
Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
String msg = book != null ? "" : "数据查询失败,请重试!";
return new Result(code, book, msg);
}
@GetMapping
public Result getAll(){Listlist = bookService.getAll();
Integer code = list != null ? Code.GET_OK : Code.GET_ERR;
String msg = list != null ? "" : "数据查询失败,请重试!";
return new Result(code,list,msg);
}
} 
目的:出现异常的时候,也会返回一个 Result 标准结果对象回去,在 msg 属性中添加异常信息。
6.1 异常分类// 自定义业务异常类
public class BusinessException extends RuntimeException{private Integer code;
public Integer getCode() {return code;
}
public void setCode(Integer code) {this.code = code;
}
public BusinessException(Integer code, String message){super(message);
this.code = code;
}
public BusinessException(Integer code, String message, Throwable cause){super(message,cause);
this.code = code;
}
}// 自定义系统异常类
public class SystemException extends RuntimeException{private Integer code;
public Integer getCode() {return code;
}
public void setCode(Integer code) {this.code = code;
}
public SystemException(Integer code, String message){super(message);
this.code = code;
}
public SystemException(Integer code, String message, Throwable cause){super(message,cause);
this.code = code;
}
}@Override
public Book getById(Integer id) {// 模拟业务异常,包装成自定义异常
if(id == 1){throw new BusinessException(Code.BUSINESS_ERR,"请不要用你的技术挑战我的耐性");
}
// 模拟系统异常,将可能出现的异常包装转换成自定义异常
try {int i = 1 / 0;
} catch (Exception e){throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服务器访问超时,请重试!",e);
}
return bookDao.getById(id);
}
@RestControllerAdvice
public class ProjectExceptionAdvice {// @ExceptionHandler 用于设置当前处理器类对应的异常类型
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){//其他处理:记录日志、发送消息给运维、发送邮件给开发人员
// 接替 controller 返回结果
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){return new Result(ex.getCode(),null,ex.getMessage());
}
// 除了自定义的异常处理器,保留对 Exception 类型的异常处理
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){//其他处理
return new Result(Code.SYSTEM_UNKNOW_ERR, null, "系统繁忙,请稍后再试");
}
}6.3 知识点@RestControllerAdvice:Rest风格开发的控制器增强类定义上方,为Rest风格开发的控制器类做增强——此注解自带@ResponseBody注解与@Component注解,具备对应的功能@ExceptionHandler:专用于异常处理的控制器方法上方,设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override
//原始方法调用前执行的内容
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");
return true;
}
@Override
//原始方法调用后执行的内容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");
}
@Override
//原始方法调用完成后执行的内容
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{System.out.println("afterCompletion...");
}
}@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {//配置拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books");
}
}@Override
protected void addInterceptors(InterceptorRegistry registry) {//配置拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*" );
}@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {//配置多拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧