搜索
您的当前位置:首页正文

Spring Boot 中常用到注解

来源:知库网

@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();
    }
Top