1.springboot是spring的自动配置,spring本身仍是核心。
2.POJO:就是平时熟知的javabean,主要是为了与EJB的javabean区分
3.IoC(反转控制)容器:可以当作管理javabean的工厂。
工厂思想:动态管理、提供对象。如一开始30个http请求抵达时新建30个对象,结束后不一定回收对象而是保留(类似于缓冲池);下次10个请求抵达时取出其中10个使用(就是拿来复用),无需再新建对象、分配内存,提高效率。所谓的javabean放入容器,大概就是让spring了解如何生成一个对象后,让它来充当上述的“工厂”。
因此后续需要使用时,可以通过getBean(id)这个方法来获取对象,而非直接new。
4.java注解:详情百度,类似于元编程,提供对代码本身处理的能力。使用注解,能让spring识别你的代码并予以处理
5.mvc:这个v指视图,指jsp之类的(通俗点就是可以执行java代码html)。m指model,指送向视图的对象。如原来单纯的的jsp中,想要读取服务器中的txt文件,需要在jsp中写java代码;但在mvc中,可以在c(controller)中把读取的结果放入String str
中,包装到model对象上,指定送入的视图(hellp.jsp之类的),然后在视图直接引用${str}
即可显示结果,实现逻辑代码与视图显示的分离。
bean放入容器管理的几个注解
@Component:
把该类放入容器管理(如果被spring扫描到)。(其参数value等同spring配置文件的id,默认为类名首字母变小写的骆驼峰式)
@Configuration:
该注解含有@Component注解,因此本身也会被纳入管理。
作用等同与spring的xml配置文件:本身等同<beans>标签;内部的@Bean注解的方法等同<bean>,方法名默认等同"id"属性,方法返回值(对象)默认等同"class"属性
@Import:
如@Import( {Cat.class, Dog.class} )
,就是把Cat类和Dog类纳入管理。
@ImportResource:
@ImportResource( {locations = {"a.xml, b.xml"} )
就是加载a.xml, b.xml为spring的配置文件,相当于回退到以前直接写配置文件那样
所以,把某个类(javabean)放入容器的方法有:
1.直接在类中加@Component注解(若类比较分散,维护时容易懵逼)
2.写一个配置类(其作用主要就是为了配置,并无他用)用@Configuration注解,内部成员方法用@Bean注解(这个应该是推荐写法吧?)
3.启动类追加@Import注解(如果不在启动类的context范围内使用当我没说),把类.class作参数即可
4.启动类追加@ImportResource注解,像写spring配置文件那样操作就行。(不推荐)
@SpringBootApplication 注解启动类
标记启动类。所谓启动类,大概作用就是能用它访问尽所有的javabean及其它必须的东西。
内含3个主要的功能:
@ComponentScan:
上面说到的扫描,就是由这个扫描。它去扫描那些注解,不被扫描到的注解就无效。(即类使用了@Component,但若在另一个不被扫描的包中,此类不会被放入容器)
@SpringBootConfiguration:
本身就被@Component,因此也被纳入管理。主要作用是根据扫描把本身所在包及子包所有类(有适合的注解那些),放入容器管理
@EnableAutoConfiguration:
第三方(就是你通过工具/手动添加的jar依赖)的类也被加入容器。
所以,被@SpringBootApplication注解的类,能够把所有子包及所在包的类,根据其注解进行适当的处理,也就被称为启动类。
@ConfigurationProperties和@Value注入值
1.根据application.yml(以yml作例)注入值。yml是json超集,其格式采用key: value
(冒号后面的空格不能缺)表示键值对,采用缩进表示层次。
若值为字符串,双引号可以省略,可以使用单引号(没什么用);使用双引号包括字符串时,转义字符\n
之类的才有效,否则直接输出\n。
若值为数组、集合、list,可直接以[1,2,3,4]
为值解决。
若值为map或对象,可直接以{a: a,b: b}
为值解决。(冒号后面的空格不能缺)
2.@ConfigurationProperties注解在类,@Value注解在类成员。
3.@ConfigurationProperties(prefix = "指定前缀")
,要求类的成员和yml写的名称对应(能够以松散写法对应),这个注入将覆盖@Value注入
4.@Value("${指定前缀.指定成员}")
,此时指定成员和类的成员名称便不需要对应了。可以使用@Value("${指定前缀.指定成员:默认值}")
来实现yml中指定成员不存在时注入默认值。
5.流程为:@Configuration+@Bean--->@Component--->注入值
整个流程只有一个对象,因此注入值将覆盖前面设置的值。
注:@Configuration+@Bean和@Component只有要一个即可完成新建对象,两个都写也没问题,但始终整个流程保持新建一个对象
6.yml也能使用${指定前缀.指定成员}
来引用另外一个值
7.@PropertySource:
@PropertySource(value = "classpath:myconf.properties")
注解在类,指定properties文件(默认是application.yml和application.properties)来获取注入值(不支持yml)。这里classpath指的是编译结果目录classes下(源代码中的properties/yml编译时将被复制到classes目录下)
@Controller 注解“控制”类
@RequestMapping 设置请求url的映射
1.@Controller中有@Component,因而受IoC容器管理,其参数value也就同@Component的value参数
2.@RequestMapping 设置在方法上,意为url路径对应时映射到该方法上。设置在控制类时,作用是使控制类的方法的路径映射变为相对路径的映射。
3.路径斜杠/
问题:
(1)这两个注解的字符串参数中,第一个字符可以不为斜杠,也可以写上斜杠,是一样的。
(2)设置返回的view路径时,返回的view均是以根路径开始的,首字符是不是斜杠都是一样的。
(3)设置返回的return "redirect:xxx.html"
时,首字符为斜杠则以根路径开始;没有斜杠则为相对路径,父路径为@Controller的参数。
4.静态资源与模板引擎:
(1)static中的html可以直接通过url访问;模板中的html不可直接通过url访问(404错误)
(2)mvc中,最终到达view时,url是不会改变的;如果返回的是重定向return "redirect:xxx.html"
,url会改变进行跳转,此时不会到达view
5.url中的路径参数{prama}
,捕获的路径参数是不会跨越/
的。即/a/{prama}
不会匹配/a/b/c
。
6.@GetMapping,其实就是@RequestMapping(method=RequestMethod.GET)
,其余@PostMapping等等均是同理。
7.更多详细mvc相关注解,右转大佬:springmvc常用注解标签详解
HandlerMethod(即Controller中的处理方法)的参数注入相关
上面大佬文章已经很详细,这里补几个:
1.方法的参数可以直接写上一个自定义的javabean,spring将把post/get方式传入的参数按“name属性”对应注入javabean对象同名成员中。如果成员不是简单类型,那么只要form中的标签的name
以xxx.xxx
表示层次即可完成对应。
2.大佬文章说的RequestToViewNameTranslator类,最终效果就是根据@RequestMapping的value当作viewName。
3.启动时可以参数覆盖.properties
设置,如java -jar filename.jar --server.port=9090
即可改变端口
网友评论