具有的特性:派生性、层次性、遗传性
1、模式注解(范式注解)装配:声明在引用中所扮演的角色
- @Component 基础注解(生成bean),下面几个注解内部都有这个注解(“继承这个注解”)
- @Configuration 标记在配置类上面,表明这是一个配置类
- @Controller 控制器模式注解,标记在web模块进入,逻辑控制器
- @Repository 数据存储标,记在访问数据库的地方
- @Service 服务模式注解,业务逻辑上
@Bean
public UserDao userDao(){
return new UserDao();
@ComponentScan 指定范围注解
@ResponseBody(返回信息自动json化)
@RestController (ResponseBody + Controller)
@RestController//代替@ResponseBody的作用给每一个反方的返回值
public class Index {
@RequestMapping("/hello")
public Map<String,Object> index(){
Map<String,Object> map = new HashMap<>();
map.put("String",55);
map.put("double","白开水");
return map;
}
@RequestMapping("/hello02")
public String index02(){
return "这就是一行字符串!!02hello";
}
@RequestMapping("/hello03")
public String index03(){
return "这就是一行字符串!!03hello";
}
}
@EnableAutoConfiguration的作用就是开启自动装配,加载pom里的内容(不会扫描其他的包)
@ComponentScan("com.stude.spring_boot_stude.base")
@EnableAutoConfiguration
public class HelloWorld {
public static void main(String[] args) {
SpringApplication.run(HelloWorld.class,args);
}
}
@SpringBootApplication (= EnableAutoConfiguration + ComponentScan)不设置扫描路径,默认是当前包及其子包
@SpringBootApplication("com.stude.spring_boot_stude.base")
public class AutoConfiguration {
public static void main(String[] args) {
SpringApplication.run(AutoConfiguration.class,args);
}
}
全局异常捕获
//简短描述 错误类型
logger.error(runtimeException.toString());
//调用此方法会把完整的异常信息打印到控制台
void printStackTrace()
@ControllerAdvice指定需要捕获的类,切面编程@ExceptionHandler(RuntimeException.class)指定捕获异常类型
@ControllerAdvice(basePackages = "com.stude.spring_boot_stude.exception")
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
//这里可以使用ResponseBody返回json或者使用modeAndView返回页面
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String,Object> errorResult(RuntimeException runtimeException){
logger.error(runtimeException.toString());
runtimeException.printStackTrace();
Map<String,Object> errorResultMap = new HashMap<>();
errorResultMap.put("errorCode","500");
errorResultMap.put("errorMsg","运行时异常");
return errorResultMap;
}
}
//返回错误页面
@ExceptionHandler(RuntimeException.class)
public String runtimeExceptionHandler(RuntimeException runtimeException, ModelMap modelMap) {
logger.error(runtimeException.getLocalizedMessage());
modelMap.put("status", IntegralConstant.FAIL_STATUS);
return "exception";
}
@RestControllerAdvice 类似于 @RestController 与 @Controller的区别
ResponseBodyAdvice 用于实现传入参数格式转换(用我们统一的自定义类传递消息)
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {
/**
* 判断消息,是否需要转化固定格式
* 类或者方法标记了IgnoreResponseAdvice 注解,就不转换
* @param methodParameter
* @param aClass
* @return
*/
@Override
public boolean supports(MethodParameter methodParameter,
Class<? extends HttpMessageConverter<?>> aClass) {
if (methodParameter.getDeclaringClass().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
if (methodParameter.getMethod().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
return true;
}
/**
* 消息转化固定格式
* @param o
* @param methodParameter
* @param mediaType
* @param aClass
* @param serverHttpRequest
* @param serverHttpResponse
* @return
*/
@Nullable //代表参数可以是空值 @NonNull 代表不能是空值
@Override
public Object beforeBodyWrite(@Nullable Object o,
MethodParameter methodParameter,
MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
CommonResponse<Object> response = new CommonResponse<>(0, "");
if (null == o) {
return response;
} else if (o instanceof CommonResponse) {
response = (CommonResponse<Object>) o;
} else {
response.setData(o);
}
return response;
}
}
@Autowired 注入bean (@Autowired(required=false) 代表即使没有bean也不会报错)
@Autowired(required=false)
private LogDao logDao;
@Qualifier("userDao") 设置注入bean的名称 (一般这两个注解一起使用)
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Autowired
@Qualifier("userDao")
public void setUserDao(UserDao userDao) {
System.out.println("auto inject");
this.userDao = userDao;
}
@Autowired
public void init(@Qualifier("userDao")UserDao userDao,LogDao logDao){
System.out.println("multi param inject");
this.userDao = userDao;
this.logDao =logDao;
}
@Resource("car") (功能类似Autowired + Qualifier)
@Resource("car")
private void setCar(Car car){
System.out.println("execute in setCar");
this.car = car;
}