自动配置和自定义消息转化器

自动配置和自定义消息转化器

一:常见的注解

@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(
  // 整个下面的所有配置在application.properties文件中配置的时候给一个前缀
    prefix = "spring.redis"
)
// 这个类的意思就是 将这个框架所有能改的数据抽取成成员变量
public class RedisProperties {
    private int database = 0;
    private String url;
    private String host = "localhost";
    private String password;

2.3 编写自动配置

@Configuration   //这是一个配置文件
// 只有RedisOperations这个类存在的时候,下面的配置才生效
@ConditionalOnClass({RedisOperations.class})
// 引入框架能修改的这个参数的java类
@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();
//       添加fastjson的配置信息
       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 ) {
//        自定义json格式的消息转化器
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//        添加fastjson的配置信息
        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)
// 只有当 name = havingValue时 配置才生效
@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 //这是一个公共的api
@Target(ElementType.TYPE) //表示作用在类上
@Retention(RetentionPolicy.RUNTIME) //运行时注解
@Import(NetWorkAutoConfiguration.class) //使NetWorkAutoConfiguration配置生效
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";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值