自动配置和自定义消息转化器
一:常见的注解
@ConditionalOnBean :表示的当前的IOC容器里面有指定bean的条件下
@ConditionalOnClass:表示的是当前的项目类路径下存在某个类的条件下
@ConditionalOnJava():根据java虚拟机的版本
@ConditionalOnMissingBean:在IOC容器中,没有这个类的实例的时候
@ConditionalOnMissingClass:在当前的类路径下,没有这个类存在的时候,这个条件才生效
@ConditionalOnProperty: 表示判断 必须要拥有某一个配置的时候,下面的配置才生效
@ConditionalOnResource:表示在项目的resources目录下必须拥有某一个资源文件的时候,才生效
@ConfigurationProperties:主要是用来把properties文件或者yml文件转化为bean来使用的
@EnableConfigurationProperties:这个注解的作用是使@ConfigurationProperties注解生效,如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化成的bean,当然,在@ConfigurationProperties加入的注解类上加@Conmponent也可以交由Springboot管理
二:自动配置举例
2.1 要有业务(任何业务都可以)
2.2 编写属性配置(框架里面哪些参数是需要指定的)
@ConfigurationProperties (
prefix = "spring.redis"
)
public class RedisProperties {
private int database = 0 ;
private String url;
private String host = "localhost" ;
private String password;
2.3 编写自动配置
@Configuration
@ConditionalOnClass ( { RedisOperations. class } )
@EnableConfigurationProperties ( { RedisProperties. class } )
@Import ( { LettuceConnectionConfiguration. class , JedisConnectionConfiguration. class } )
public class RedisAutoConfiguration {
public RedisAutoConfiguration ( ) {
}
2.4 将编写的自动配置的类写到spring.factories文件中
当我们使用SpringApplication.run()的时候,就会自动去读取这个spring.factories文件,实现整个自动配置
三: 自定义消息转化器
3.1 String类型的消息转化器
@Configuration
@ComponentScan ( basePackages = { "com.wcc.springboot" } )
public class AppConfig {
@Bean
public StringHttpMessageConverter stringHttpMessageConverter ( ) {
return new StringHttpMessageConverter ( Charset. forName ( "UTF-8" ) ) ;
}
}
3.2 json格式的消息转化器
3.1 首先导包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
3.2 编写自定义json格式的消息转换器
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter ( ) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter ( ) ;
FastJsonConfig fastJsonConfig = new FastJsonConfig ( ) ;
fastJsonConfig. setSerializerFeatures ( SerializerFeature. PrettyFormat) ;
List< MediaType> mediaTypes = new ArrayList < > ( ) ;
mediaTypes. add ( MediaType. APPLICATION_PROBLEM_JSON_UTF8) ;
fastJsonHttpMessageConverter. setFastJsonConfig ( fastJsonConfig) ;
fastJsonHttpMessageConverter. setSupportedMediaTypes ( mediaTypes) ;
return fastJsonHttpMessageConverter;
}
}
四:自定义SpringMVC的配置
4.1 fastjson消息转化器
@SpringBootConfiguration
public class SpringMvc implements WebMvcConfigurer {
@Override
public void configureMessageConverters ( List< HttpMessageConverter< ? >> converters ) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter ( ) ;
FastJsonConfig fastJsonConfig = new FastJsonConfig ( ) ;
fastJsonConfig. setSerializerFeatures ( SerializerFeature. PrettyFormat) ;
List< MediaType> mediaTypes = new ArrayList < > ( ) ;
mediaTypes. add ( MediaType. APPLICATION_JSON_UTF8) ;
converter. setSupportedMediaTypes ( mediaTypes) ;
converter. setFastJsonConfig ( fastJsonConfig) ;
converters. add ( converter) ;
}
}
4.2 自定义拦截器
@SpringBootConfiguration
public class MyIntercepter implements WebMvcConfigurer {
@Override
public void addInterceptors ( InterceptorRegistry registry ) {
registry. addInterceptor ( new HandlerInterceptor ( ) {
@Override
public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {
if ( handler instanceof HandlerMethod ) {
HandlerMethod handlerMethod = ( HandlerMethod) handler;
Object bean = handlerMethod. getBean ( ) ;
if ( bean instanceof UserController ) {
return false ;
}
}
return true ;
}
} ) ;
}
}
五: 编写一个自动配置的starter
5.1 编写一个自动配置
5.1.1 编写一个业务类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NetWorkService {
private int ip;
private int port;
public void print(){
System.out.println("ip="+ip+","+"port"+port);
}
}
5.1.2 编写自动配置的属性集合类
@ConfigurationProperties ( prefix = "xiaochaochao" )
@Data
public class NetWorkProperties {
private int ip;
private int port;
}
5.1.3 编写自动配置
@Configuration
@ConditionalOnClass ( NetWorkService. class )
@ConditionalOnProperty ( name = "xiaobaobao" , havingValue = "wangzi" )
@EnableConfigurationProperties ( NetWorkProperties. class )
public class NetWorkAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public NetWorkService netWorkService ( NetWorkProperties netWorkProperties) {
NetWorkService netWorkService = new
NetWorkService ( netWorkProperties. getIp ( ) , netWorkProperties. getPort ( ) ) ;
return netWorkService;
}
}
5.1.4 将自动配置交给spring.factories管理
5.1.4.1 导包
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- configuration- processor< / artifactId>
< optional> true < / optional>
< / dependency>
5.1.4.2 编写注解
@Inherited
@Documented
@Target ( ElementType. TYPE)
@Retention ( RetentionPolicy. RUNTIME)
@Import ( NetWorkAutoConfiguration. class )
public @interface EnableNetWorkAutoConfiguration {
}
5.2 编写测试文件
5.2.1 导包依赖
< dependency>
< groupId> com.wcc.springbbot</ groupId>
< artifactId> springbootstarter</ artifactId>
< version> 0.0.1-SNAPSHOT</ version>
</ dependency>
5.2.2 编写启动类,加入自定义注解
@SpringBootApplication
@EnableNetWorkAutoConfiguration
public class SpringbootstartertestApplication {
public static void main ( String[ ] args) {
SpringApplication. run ( SpringbootstartertestApplication. class , args) ;
}
}
5.2.3 测试
@RestController
public class StarterController {
@Autowired
private NetWorkService netWorkService;
@RequestMapping ( "start" )
public Object function ( ) {
netWorkService. print ( ) ;
return "sucess" ;
}
}