注册web的filter组件
回顾: web开发--如何定义过滤器以及如何把过滤注册到web.xml容器中。
public class 类名 implements java.servlet.Filter{
doFilter(){}
}
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-paterrn></
</filter-mapping>
springboot中不存在web.xml文件。---使用@Configuration注解,等价于xml文件
创建一个过滤器类
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//校验是否登录,编码等等
System.out.println("经过了该过滤器");
filterChain.doFilter(servletRequest,servletResponse);//放行到下一个过滤器,或者到达请求的地址controller
}
}
配置类
@Bean
public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
filter.setName("myFilter");
filter.setFilter(new MyFilter());
filter.addUrlPatterns("/*");
return filter;
}
springboot自动装配原理
springboot自动包扫描
springboot默认扫描的包是哪些?
主类所在的包以及子包。---为什么是这样? 能不能人为改动?
一定在主类上的@SpringBootApplication上
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//注册扫描的包---getPackageNames得到要扫描的包名。--默认为主类所在的包
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
我们可以在主类上使用@ComponentScan来修改默认的包扫描
@ComponentScan(basePackages = {"扫描的路径"}) //使用这个注解之后,扫描的路径就会变成这个
自动装配原理
springboot 没有注册DispatcherServlet前端控制器. 为何能找到controller层。
<!--注册DispatchServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--如果没有指定参数默认解析WEB-INF/servlerName-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springboot帮你完成自动装配
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
当主函数运行时会加载一个使用@SpringBootApplication注释的类,@SpringbootApplication它是一个复合组件。其中@EnableAutoConfiguration它是开启自动配置的核心注解,该注解也是一个复合组件,其中@Import({AutoConfigurationImportSelector.class}) ,该注解需要导入一个AutoConfigurationImportSelector类,该类会加载你需要的自动装配类,而这些自动装配类会完成响应的自动装配功能。