3.2 构造器注入
3.3 自动配置标签删除;
标签中添加 autowire 属性。在
或
标签内部写array
、list
、set
、map
、props
标签。
管理第三方bean步骤:
${key}
5. 核心容器@Configuration
注解,将其标识为一个配置类,替换applicationContext.xml
;@ComponentScan
替换
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {}
6.2 注解开发bean作用范围与生命周期管理@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
@EnableAspectJAutoProxy
execution(* 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-test
mybatis
、mysql-connector-java
、druid
、mybatis-spring
junit
spring-webmvc
、javax.servlet-api
、jackson-databind
tomcat7-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/*");
}
}
7.3 拦截器参数你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧