@SpringBootApplication
定义一个类作为Spring Boot项目的入口,并在类上添加此注解,当项目启动时,程序由此入口进入,并做相应配置。其本质就是@Configuration,@EnableAutoConfiguration,@ComponentScan的组合。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration、@Bean
理解起来大致就是如下代码中xml配置所示,@Configuration如同下面的<beans></beans>,@Bean 就是定义一个bean 注入到Spring,若没有给name属性,则bean名称为方法名称,即下面例子中的test。
<beans>
<bean id="test" class="com.xxx.Test"></bean>
</beans>
等同于
@Configuration
public class TestConfig{
@Bean
public Test test(){
return new Test();
}
}
@EnableAutoConfiguration
自动配置Spring Boot 项目依赖的配置类,然后注入到spring 容器中。这些类可在spring-boot-autoconfigure包中的META-INF/spring.factories中找到。
也可以自定义做Spring 配置类的依赖注入,配置spring.boot.enableautoconfiguration=false禁用自动配置,然后自己注入Spring 所需配置类,具体此处就不展开了。
@ComponentScan
会自动扫描指定包下的全部标有@Component的类,并注册成bean,以及@Component下的子注解@Service,@Repository,@Controller。
@ConfigurationProperties、@PropertiesSource
可以将指定配置文件中的属性与配置类中的属性匹配,然后将该配置类注入到spring。
例如:test.properties 配置文件
test.name=yiyi
test.host=here
test.ip=127.0.0.1
@Configuration
@ConfigurationProperties(prefix="test",location="classpath:/config/test.properties", ignoreUnknownFields=false )
public class Test{
private String name;
private String host;
private String ip;
//...getter setter
}
spring boot1.5以上版本@ConfigurationProperties中的location属性被弃用,可以结合@PropertiesSource来指定配置文件地址,如下:
@Configuration
@ConfigurationProperties(prefix="test",ignoreUnknownFields=false )
@PropertiesSource("classpath:/config/test.properties")
public class Test{
private String name;
private String host;
private String ip;
//...getter setter
}
@Order
可以添加在需要注入到Spring中的配置类的加载顺序,数字越小越先加载
@Configuration
@Oder(2)
public class Test1{
@Bean
public Test test(){
return new Test();
}
}
@Configuration
@Oder(1)
public class Test2{
@Bean
public TestDemo testDemo(){
return new TestDemo ();
}
}
则Test2配置类中的TestDemo优先加载到Spring。
@WebServlet、@WebFilter、@WebListener、@ServletComponentScan
@SpringBootApplication
@ServletComponentScan(basePackage="com.xxx.xxx")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
添加了@WebServlet注解的类,容器会读取当中的信息,作为一个Servlet提供符合要求的服务。例如:在spring mvc常用配置的web.xml中
<web-app>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.xxx.xxx.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
利用注解定义这个servlet可写成如下所示:
@WebServlet(name="testServlet",urlParttens="/test",loadOnStartUp=1)
public class TestServlet extends HttpServlet{
/**
* 可以添加初始化Servlet需要做的
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException{
}
}
添加了@WebFilter注解的类,容器将以此类为一个过滤器注入,并做请求过滤等操作。使用方式如下:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.xxx.xxx.TestFilter</filter-class>
<init-param>
<param-name>isNeed</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
利用注解定义这个filter可写成如下所示:
@WebFilter(filterName="TestFilter",urlParttens="/*",
initParams={
@WebInitParam(name="isNeed",value="false")
})
public class TestFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException{
}
@Override
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException,ServletException {
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destory(){
}
}
添加了@WebListener注解的类,将对客户端对Servlet的请求进行监听。使用方式如下:
<listener>
<listenr-class>com.xxx.xxx.TestListener</listener-class>
</listener>
利用注解可以无需上述在web.xml中的配置,如下:
@WebListener
public class TestListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce){
}
@Override
public void contextDestroyed(ServletContextEvent sce){
}
}
补充:一个请求流转顺序为listener->filter->servlet
在Spring Boot中还有另一种定义以上三种配置类的方式:
FilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean,分别对应filter、servlet、listener。具体实现如下:
@Bean
public ServletRegistrationBean indexServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(new TestServlet());
registration.addUrlMappings("/test");
registration.setName("test");
registration.setLoadOnStartup(1);
// registration.setMultipartConfig();
return registration;
}
@Bean
public FilterRegistrationBean indexFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new TestFilter());
registration.addUrlPatterns("/*");
registration.setName("TestFilter");
Map map=new HashMap<String,Object>();
map.put("isNeed","false");
registration.setInitParameters(map);
return registration;
}
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
servletListenerRegistrationBean.setListener(new TestListener());
return servletListenerRegistrationBean;
}
@Profile
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。如下类只能在配置为dev开发环境下才能被加载。
@Configuration
@Profile("dev")
public class TestConfig{
//..
}
@ControllerAdvice @ExceptionHandler
@ControllerAdvice全局异常捕获,然后在@ExceptionHandler中进行异常的处理。@ExceptionHandler可以自定义异常类,然后对特定的业务异常做特定的处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
@ResponseBody
String handleException(Exception e){
return e.getMessage();
}
}
@Validated
@SpringBootTest
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {
/**
* 模拟mvc测试对象
*/
private MockMvc mockMvc;
/**
* web项目上下文
*/
@Autowired
private WebApplicationContext webApplicationContext;
/**
* 所有测试方法执行之前执行该方法
*/
@Before
public void before() {
//获取mockmvc对象实例
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}