- spring的发展了解
spring刚出现时,两大主要核心就是IOC和AOP,都是基于XML配置文件的方式,到了JDK1.5发布后,java支持注解开发,spring的很多配置都能用注解实现,减少了XML的配置。那究竟应该用xml还是注解?最好的方式是系统配置如数据源,事务管理等用XML配置,业务类如一个service的管理用注解更好。到了spring3.x,开始支持java配置的方式,spring4.x时java配置已经成为官方推荐的方式,可以减少配置文件的编写同时更深刻理解自己配置的bean。java配置也是取代xml配置的一种方式。
- 基本的注解配置
@Configuration作用于类,表明该类作为spring的配置
@CompoentScan(basePackages = “com.focus”)作用于类,扫描包的路径设置
@Bean作用于方法,表明该方法标识为一个bean进行管理
@Bean
public UserDao getUserDao() {return new UserDao();}
@PropertySource(value = {“classpath:jdbc.properties”, “classpath:redis.properties”})读取配置文件
- springboot简介
传统开发,spring在整合其他框架的时候,会有大量的配置要去做,比如整合一个Freemarker,web.xml里要配置它的过滤器,springmvc.xml里要配置它的视图解析器,这对于初学者马上上手写代码效率是很低的,要花一定时间去配置这些东西,所以springboot就产生了,它是一个习惯优于约定的框架,什么意思?约定就是传统的配置,而习惯就是常用的配置,也就是说springboot自己已经整合好了很多常用第三方框架并内置好整合框架的默认配置,而这些配置也都是基础java配置的方式。同时springboot还内置servlet容器(tomcat),所以springboot本身做完就是一个jar包,直接运行即可,连项目的部署过程就省略了,当然生产环境,还是要使用传统的war包,但是在开发环节,为开发人员节省了很多时间去部署的过程。
- springboot快速入门案例
首先,使用springboot必须是一个maven工程,然后这个工程的parent必须是springboot,如果已经有一个父工程了怎么办?其实可以撤销,父工程的目的无非就是jar包版本管理和一些预设的配置,这些springboot都已经内置好了。然后可以配置一个springboot的maven插件,用于启动springboot项目。
@Controller
@SpringBootApplication
@Configuration
public
class
HelloApplication {
class
HelloApplication {
@RequestMapping
(
“hello”
)
@ResponseBody
public
String hello(){
return
“hello world
!
“
;
}
public
static
void
main(String[]
args
) {
SpringApplication.
run
(HelloApplication.
class
,
args
);
run
(HelloApplication.
class
,
args
);
}
}
springboot的类一般都是以Application结尾,还需要加上@SpringBootApplication,表示这是springboot的配置文件,不加其他的就是开启自动配置,@Configuration是spring的配置类,其他都是跟传统项目一样的作用。
启动springboot项目,一个是通过main方法启动,还有个就是用前面配置的springboot插件,结合它用maven命令也可以启动。
- 常用配置介绍
@SpringBootApplication其实是一个组合注解,查看其源码会发现它还有很多其他的注解,同时还能在这里配置不需要自动配置的第三方框架,一般都是*AutoConfiguration什么的类。@Configuration可以用springboot推荐的@SpringBootConfiguration代替(也就是说可以不写@Configuration)。
springboot还支持自定义的banner(就是启动时候显示的一个logo),放在resource下命名为banner.txt即可。通过SpringApplication可以设置BannerMode关闭banner。
对于一些springboot的全局配置,使用application.properties或者application.yml(推荐,IDEA有该文件的插件,可以提示springboot的配置),在里面能定义一些全局配置如端口,第三方框架的配置等等。默认放在classpath下,不需要再定义配置这个读取配置文件的位置,默认就是这个路径下的指定文件名。
spring-boot-starter是一个springboot的启动器,官方还提供了很多其他的启动器,导入相应的starter,比如freemarker的starter,就能免去它的配置,而由springboot自动配置。
虽然springboot提倡无配置,但是实际开发中有些地方还是避免不了使用配置文件,用@ImportResource({“classpath:applicationContext.xml”})可以引入配置文件。
springboot支持各种日志框架,要想修改日志的配置,就在springboot的全局配置文件中修改即可。
logging.level.org.springframework = DEBUG
- springboot自动配置原理
首先是SpringApplication.run()启动springboot时,在它容器初始化的过程中,会读取spring.factories文件,里面每个factory配置了很多product(工厂能生产的类),其中一个factory就是EnableAutoConfiguration,它的product就有很多常见第三方框架的自动配置,比如RedisAutoConfiguration。
那第三方框架自己又是如何自动配置的呢?其实也很简单,无非就是spring所推荐的那种java配置方式,这也体会到了使用java配置的一种好处,就是能用代码去修改配置。拿redis举例,它的RedisAutoConfiguration就是实现自动配置的类,类上有注解@ConditionOnClass({Jedis.class…..}),这个注解的作用是根据类的存在而判断是否实例化该类,上面还有个注解是@EnableConfigurationProperties(RedisProperties.class),很显然这是与java配置相关的类,在这个properties类里就配置了redis的一些属性,同时也是可以通过springboot的全局配置去修改的。
总结下来,其实自动配置就是通过@ConditionOnClass注解检测相应的类是否引入,引入了就会实例化对应的自动配置类,而自动配置类所加载的“配置文件”就是java配置,所以就是框架检测与java配置。
- 在web中的常见配置
1.视图解析器
首先是springmvc的视图解析器,springmvc默认配置InternalResourceViewResolver,优先级是最低的(这里补充一个知识点,InternalResourceViewResolver的原理是给一个返回路径加上前缀和后缀定义到具体位置,但是由于它相对于其他解析器比较特殊,其他解析器是如果不匹配,就返回null,让视图解析器链的下一个去解析,但是InternalResourceViewResolver的做法是不管匹不匹配,都不会返回null,造成比它优先级低的解析器永远都没办法解析),如果配置了freemarker,FreeMarkerViewResolver的优先级默认是比这个要高的,当然什么都不配置,就只有InternalResourceViewResolver。同时还要注意一点,springboot官方不推荐使用jsp技术,因为springboot在打成jar包时是不能解析jsp的,内嵌tomcat不支持这个功能,所以要想使用jsp,还是比较繁琐的,必须打包成war发布到服务器。
静态资源
2.静态资源处理
springboot默认的静态资源映射机制为/** –> classpath:[/META/resources/, /resources/, /static/, /public/ ], context:/(context指servletContext,即webapp下)。通过spring.resources.static-locations可修改默认的静态资源路径,修改规则为:直接写 “/” 代表webapp下,带classpath前缀为类路径下,每个路径用逗号隔开,解析顺序为路径的配置顺序。
这里有一个坑不好理解,就是映射过来的访问url。比如配置static-locations = /static/,那么静态资源就要放在/webapp/static/js/demo.js,访问的url为/js/demo.js,而不用加static,url与映射路径是不一样的,这里需要好好理解下,也算是springmvc里的知识了。还有个要说明的是这里的静态资源指的是*.xxx,即有后缀名的请求都认为是静态资源,即使是jsp也算,它的解析顺序是比如/demo.js/,会首先去看有没有RequestMapping为demo的controller方法,没有才去查静态资源的位置,所以静态资源的名称不能与controller的请求url一样。
3.自定义消息转换器和拦截器
首先是消息转换器,默认是自动配置了StringHttpMessageConverter,在HttpMessageConverterAutoConfiguration类中有一个静态类StringHttpMessageConverterConfiguration进行配置,且默认就是UTF-8的编码。
如果要进行自定义,有两种方式,第一种是在有@Configuration的类中配置一个@Bean返回自定义的消息转换器即可,如果是StringHttpMessageConverter不会冲突,因为它自动配置是检测容器里是否有这个bean存在的。第二种是继承springmvc的java配置,然后重写父类方法添加自定义消息转换器,下面详细说。
对于拦截器,需要自定义一个类继承WebMvcConfigurerAdapter,重写addInterceptors方法,添加自定义拦截器即可。上面的第二种自定义消息转换器的方法其实道理一样,重写configureMessageConverters方法即可。需注意,这个继承了springmvc的java配置的类必须带有@Configuration注解才行,表明这是spring的一个配置类。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/4278.html