3.2 構(gòu)造器注入
3.3 自動配置標(biāo)簽刪除;
標(biāo)簽中添加 autowire 屬性。在
或
標(biāo)簽內(nèi)部寫array
、list
、set
、map
、props
標(biāo)簽。
管理第三方bean步驟:
${key}
5. 核心容器@Configuration
注解,將其標(biāo)識為一個配置類,替換applicationContext.xml
;@ComponentScan
替換
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {}
6.2 注解開發(fā)bean作用范圍與生命周期管理@Scope
:設(shè)置該類創(chuàng)建對象的作用范圍,可用于設(shè)置創(chuàng)建出的bean是否為單例對象@PostConstruct
:設(shè)置該方法為初始化方法@PreDestroy
:設(shè)置該方法為銷毀方法注解開發(fā)只提供了自動裝配的注解實(shí)現(xiàn)。
@Autowired
:為引用類型屬性設(shè)置值,自動裝配;@Qualifier
:為引用類型屬性指定注入的beanId,即可以在多個實(shí)現(xiàn)類中指定注入Bean的 Id;@Value
:為 基本數(shù)據(jù)類型 或 字符串類型 屬性設(shè)置值;@PropertySource
:加載properties文件中的屬性值,屬性值可以使用@Value("${key}")
注入。@Bean
注解將方法的返回值制作為Spring管理的一個bean對象@Bean
:設(shè)置該方法的返回值作為spring管理的bean@Import({JdbcConfig.class})
引入第三方bean@Import
:導(dǎo)入配置類@Value
注解引入值,在第三方bean的方法中傳遞參數(shù)進(jìn)去即可;要整合的內(nèi)容:
第一件事是: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.*(..))
- 前置通知
- 后置通知
- 環(huán)繞通知(重點(diǎn))
- 返回后通知
- 拋出異常后通知
9.5 通知中獲取參數(shù)@EnableAspectJAutoProxy
:配置類定義上方,開啟注解格式AOP功能@Aspect
:切面類定義上方,設(shè)置當(dāng)前類為AOP切面類@Pointcut
:切入點(diǎn)方法定義上方,設(shè)置切入點(diǎn)方法@Before
:通知方法定義上方,設(shè)置當(dāng)前通知方法與切入點(diǎn)之間的綁定關(guān)系,當(dāng)前通知方法在原始切入點(diǎn)方法前運(yùn)行@Before
@After
:通知方法定義上方,設(shè)置當(dāng)前通知方法與切入點(diǎn)之間的綁定關(guān)系,當(dāng)前通知方法在原始切入點(diǎn)方法后運(yùn)行@AfterReturning
:通知方法定義上方,設(shè)置當(dāng)前通知方法與切入點(diǎn)之間綁定關(guān)系,當(dāng)前通知方法在原始切入點(diǎn)方法正常執(zhí)行完畢后執(zhí)行@AfterThrowing
:通知方法定義上方,設(shè)置當(dāng)前通知方法與切入點(diǎn)之間綁定關(guān)系,當(dāng)前通知方法在原始切入點(diǎn)方法運(yùn)行拋出異常后執(zhí)行@Around
:通知方法定義上方,設(shè)置當(dāng)前通知方法與切入點(diǎn)之間的綁定關(guān)系,當(dāng)前通知方法在原始切入點(diǎn)方法前后運(yùn)行,對原始方法的調(diào)用通過pjp.proceed();
實(shí)現(xiàn)@Transactional
,可以寫在接口類上、接口方法上、實(shí)現(xiàn)類上和實(shí)現(xiàn)類方法上,建議寫在實(shí)現(xiàn)類或?qū)崿F(xiàn)類的方法上@EnableTransactionManagement
@EnableTransactionManagement
:配置類定義上方,設(shè)置當(dāng)前Spring環(huán)境中開啟注解式事務(wù)支持;@Transactional
:業(yè)務(wù)層接口上方、業(yè)務(wù)層實(shí)現(xiàn)類上方、業(yè)務(wù)方法上方,為當(dāng)前業(yè)務(wù)層方法添加事務(wù)(如果設(shè)置在類或接口上方則類或接口中所有方法均添加事務(wù))@Transactional
注解的參數(shù)上進(jìn)行設(shè)置@Transactional
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(String out,String in,Double money ) {logDao.log("轉(zhuǎn)賬操作由"+out+"到"+in+",金額:"+money);
}
2-SpringMVC
1. SpringMVC概述與入門案例
1.1 SpringMVCSpringMvcConfig
,添加注解:@Configuration
@ComponentScan("com.itheima.controller")
@Controller
注解,定義方法添加@RequestMapping("/save")
注解設(shè)置當(dāng)前控制器方法請求訪問路徑,添加注解@ResponseBody
設(shè)置返回數(shù)據(jù)為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控制器類定義上方,設(shè)定SpringMVC的核心控制器bean;@RequestMapping
:SpringMVC控制器類或方法定義上方,設(shè)置當(dāng)前控制器方法請求訪問路徑;@ResponseBody
:SpringMVC控制器類或方法定義上方,設(shè)置當(dāng)前控制器方法響應(yīng)內(nèi)容為當(dāng)前返回值,無需解析@ComponentScan
:類定義上方,設(shè)置spring配置類掃描路徑,用于加載使用注解格式定義的bean;excludeFilters:排除掃描路徑中加載的bean,需要指定類別(type)和具體項(xiàng)(classes)、includeFilters:加載指定的bean,需要指定類別(type)和具體項(xiàng)(classes)@@RequestMapping("/book")
、@RequestMapping("/user")
進(jìn)行區(qū)分@Override
protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
2.2 五種類型參數(shù)傳遞@RequestParam
注解@RequestParam
:SpringMVC控制器方法形參定義前面,綁定請求參數(shù)與處理器方法形參間的關(guān)系@EnableWebMvc
注解@RequestBody
注解@EnableWebMvc
:SpringMVC配置類定義上方,開啟SpringMVC多項(xiàng)輔助功能@RequestBody
:SpringMVC控制器方法形參定義前面,將請求中請求體所包含的數(shù)據(jù)傳遞給請求參數(shù)——用于接收 json 數(shù)據(jù)@RequestParam
:用于接收url地址傳參,表單傳參@DateTimeFormat
:SpringMVC控制器方法形參前面,設(shè)定日期時間型數(shù)據(jù)格式@ResponseBody
,如果加了該注解,會直接將頁面名稱 page.jsp 當(dāng)字符串返回前端@ResponseBody
注解,文本數(shù)據(jù)return回去即可@ResponseBody
注解和@EnableWebMvc
注解,將實(shí)體類對象或集合對象 return 即可@ResponseBody
:SpringMVC控制器方法定義上方和控制類上,設(shè)置當(dāng)前控制器返回值作為響應(yīng)體,寫在類上,該類的所有方法都有該注解功能。方法上有@ReponseBody
注解后按照REST風(fēng)格訪問資源時使用行為動作區(qū)分對資源進(jìn)行了何種操作
按照不同的請求方式代表不同的操作類型:
@RequestMapping
提到類上面,用來定義所有方法共同的訪問路徑/books
、/user
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
設(shè)置當(dāng)前控制器方法請求訪問路徑與請求動作@RestController
注解替換@Controller
與@ResponseBody
注解寫在 Controller 類上方@PathVariable
解決方法形參的名稱和路徑{}中的值不一致問題與多個參數(shù)的區(qū)分問題@PathVariable
:SpringMVC控制器方法形參定義前面,綁定路徑參數(shù)與處理器方法形參間的關(guān)系,要求路徑參數(shù)名與形參名一一對應(yīng)@RestController
:基于SpringMVC的RESTful開發(fā)控制器類定義上方,設(shè)置當(dāng)前控制器類為RESTful風(fēng)格,等同于@Controller
與@ResponseBody
兩個注解組合功能@GetMapping @PostMapping @PutMapping @DeleteMapping
:基于SpringMVC的RESTful開發(fā)控制器方法定義上方,設(shè)置當(dāng)前控制器方法請求訪問路徑與請求動作,每種對應(yīng)一個請求動作,例如@GetMapping
對應(yīng)GET請求@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//設(shè)置靜態(tài)資源訪問過濾,當(dāng)前類需要設(shè)置為配置類,并被掃描加載
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry){//當(dāng)訪問/pages/????時候,從/pages目錄下查找內(nèi)容
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 項(xiàng)目入口配置類
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 請求地址攔截規(guī)則
@Override
protected String[] getServletMappings() {return new String[]{"/"};
}
// 設(shè)置 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 ? "" : "數(shù)據(jù)查詢失敗,請重試!";
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 ? "" : "數(shù)據(jù)查詢失敗,請重試!";
return new Result(code,list,msg);
}
}
目的:出現(xiàn)異常的時候,也會返回一個 Result 標(biāo)準(zhǔn)結(jié)果對象回去,在 msg 屬性中添加異常信息。
6.1 異常分類// 自定義業(yè)務(wù)異常類
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;
}
}
// 自定義系統(tǒng)異常類
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) {// 模擬業(yè)務(wù)異常,包裝成自定義異常
if(id == 1){throw new BusinessException(Code.BUSINESS_ERR,"請不要用你的技術(shù)挑戰(zhàn)我的耐性");
}
// 模擬系統(tǒng)異常,將可能出現(xiàn)的異常包裝轉(zhuǎn)換成自定義異常
try {int i = 1 / 0;
} catch (Exception e){throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服務(wù)器訪問超時,請重試!",e);
}
return bookDao.getById(id);
}
@RestControllerAdvice
public class ProjectExceptionAdvice {// @ExceptionHandler 用于設(shè)置當(dāng)前處理器類對應(yīng)的異常類型
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){//其他處理:記錄日志、發(fā)送消息給運(yùn)維、發(fā)送郵件給開發(fā)人員
// 接替 controller 返回結(jié)果
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, "系統(tǒng)繁忙,請稍后再試");
}
}
6.3 知識點(diǎn)@RestControllerAdvice
:Rest風(fēng)格開發(fā)的控制器增強(qiáng)類定義上方,為Rest風(fēng)格開發(fā)的控制器類做增強(qiáng)——此注解自帶@ResponseBody
注解與@Component
注解,具備對應(yīng)的功能@ExceptionHandler
:專用于異常處理的控制器方法上方,設(shè)置指定異常的處理方案,功能等同于控制器方法,出現(xiàn)異常后終止原始控制器執(zhí)行,并轉(zhuǎn)入當(dāng)前方法執(zhí)行@Component
//定義攔截器類,實(shí)現(xiàn)HandlerInterceptor接口
//注意當(dāng)前類必須受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override
//原始方法調(diào)用前執(zhí)行的內(nèi)容
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");
return true;
}
@Override
//原始方法調(diào)用后執(zhí)行的內(nèi)容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");
}
@Override
//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
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
//實(shí)現(xiàn)WebMvcConfigurer接口可以簡化開發(fā),但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {//配置多攔截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}
7.3 攔截器參數(shù)你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧