目录
Spring使用的设计模式
单例模式简介
Spring所管理的注解
Spring获取对象时加不加注解有什么区别?
spring默认所有的bean都是单例的
设计模式:单例模式。比如说 一个类只产生一个对象
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
@Controller,
表明这个类是一个控制器类,和@RequestMapping来配合使用拦截请求,这样请求会在完成后转向一个视图解析器。但是在大多微服务搭建的时候,前后端会做分离。所以请求后端只关注数据处理,后端返回json数据的话,需要配合@ResponseBody注解来完成。
@RestController,
它是@Controller和@ResponseBody的合集,返回的也是一个json
一个类被加上@RestController 注解,数据接口中就不再需要添加@ResponseBody。更加简洁。
@Autowride,
把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。
@Resource,
@Resource和@Autowired一样都可以用来装配bean,都可以标注字段上,或者方法上。 @Resource注解不是spring提供的,是属于J2EE规范的注解。
这两个注解的区别就是匹配方式上有点不同,@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配。
@Requestbody,
主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据)
@ResponseBody,
表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
Spring在启动的时候会扫描所有被Spring管理的类
当我们想用这个对象的时候直接加上@Autowired注解 交给spring去管理
如果我这个类想使用spring的对象,那么我们这个类也需要交给spring去管理
当一个接口有多个实现类的时候:
第一种解决方案:用list去接
第二种:
直接用具体的实现类的去用
当出现@Autowired拿不到对象的时候(这个对象不是spring提供的而是自己new出来的)就可以用一个工厂类 强制从spring工厂(容器)中提取出来
//强制从工厂里取出来
SpringFactoryUtils.getBean(xxxController.class)
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class SpringFactoryUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringFactoryUtils.applicationContext = applicationContext;}/*** 获取applicationContext** @return*/public static ApplicationContext getApplicationContext() {return applicationContext;}/*** 通过name获取 Bean.** @param name* @return*/public static Object getBean(String name) {return getApplicationContext().getBean(name);}/*** 通过class获取Bean.** @param clazz* @param * @return*/public static T getBean(Class clazz) {return getApplicationContext().getBean(clazz);}/*** 通过name,以及Clazz返回指定的Bean** @param name* @param clazz* @param * @return*/public static T getBean(String name, Class clazz) {return getApplicationContext().getBean(name, clazz);}public static Map getBeanMap(Class clazz) {return getApplicationContext().getBeansOfType(clazz);}
}