Spring相关
IOC、DI、AOP
- IOC(inversion of control:控制反转)
在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你想要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的类而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
我们的容器不需要创建,直接丢给IOC,让它去创建整个bean的生命周期,包括它的依赖。 - DI(dependency injection:依赖注入)
容器通过调用set方法或者构造器来建立对象之间的额依赖关系。
组件之间的依赖关系,是容器在运行的时候决定的 - IOC是目标,DI是手段
- AOP(aspect oriented programing:面向切面编程)
spring aop使用了动态代理技术在运行期织入增强的代码,使用了两种代理机制,一种是基于jdk的动态代理,另一种是基于CGLib的动态代理
Spring Boot常用注解
-
@RequestMapping: 是一个用来处理请求地址映射的注解,它提供路由信息,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。它告诉Spring任何 来自"/"路径的HTTP请求都应该被映射到index方法。
-
@RestController注解告诉Spring以字符串的形式渲染结果,并直接返回给调用者。
-
@Profiles: Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定环境下生效。任何@Component或@Configuration都能被@Prefiles标记,从而限制加载它时 机。
-
@ResponseBody: 表示该方法的返回结果直接写入 HTTP response body中,一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上 @Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。 比如异步获取json数据,加上@Responsebody后,会直接返回json数据。
-
@Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。一般公 共的方法我会用上这个注解。
-
@Autowired: byType方式,把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不会报错。
-
@RequestParam:用在方法的参数前面。 @RequestParam String a = request.getParameter(“a”);
-
@PathVariable:路径变量。
RequestMapping("user/get/mac/{macAddress}")
public String getByMacAddress(@PathVariable String macAddress){
//do something;
}
- 全局处理异常的: @ControllerAdvice: 包含@Component。可以被扫描到, 统一处理异常。 @ExceptionHandler(Exception.class): 用在方法上面表示遇到这个异常就执行以下方法。
/**
*
*/ 全局异常处理
@ControllerAdvice
class GlobalDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error";
@ExceptionHandler({TypeMismatchException.class, NumberFormatException.class})
public ModelAndView formatErrorHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("error", "参数类型错误");
mav.addObject("exception", e);
mav.addObject("url", RequestUtils.getCompleteRequestUrl(req));
mav.addObject("timestamp", new Date());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
}
-
通过@value注解来读取application.properties里面的配置
-
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的,作用 为:配置spring容器(应用上下文)
-
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为注册bean对象
注:
(1)、@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
(2)、@Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
@Configuration
public class TestConfiguration {
public TestConfiguration() {
System.out.println("spring容器启动初始化。。。");
}
//@Bean 注解注册testNean" bean, 同时可以指定初始化和销毁方法 //@Bean(name=" ,initMethod="start",destroyMethod="cleanUp")
@Bean
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
}
public class TestMain {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class); // 获取tb bean
TestBean = context.getBean("testBean");
tb.sayHello();
}
}