springboot中的继承和功能的开启
springboot中的继承
一 1,配置类继承
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport ////////////类似自定义的复写配置-----一般是一整套的更换---覆盖框架默认的缓存
虽然是自动装配,但是有多套一样的功能是,智能不到选择哪一个:框架有默认的缓存,start加入了redis此时会自动装配redis,这样就有两套了,框架不会
智能到选择哪一个,所以要继承覆盖
重载继承类中的方法,set进去自定义的bean就复写框架了默认逻辑
2,普通bean的继承////////////////////类似自定义的复写配置-----一般是一个类的更换
一般bean类不继承都是自己写的,所以都是自定义的
二 有些功能的开启1,在主类--自动装配的 @springbootallpication start中有spring.factories
这个注解主要是扫描configuration类,所以可以排除一些由于jar
依赖自动引入的功能,如果不排除就会自动配置,例如数据源,权限框架的jar,此时可以用exclude
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
2,在主类 通过importsselector,或register 进来的 @Enable.... :@Enabletransaction,@mapperscan 只需打开但是不在spring.factories中,无需自己写定义配置
3,在配置类configuration @Enable... 自己配置的功能 可以在当前配置类也可放在主类
开启之后,仍可以写这个功能的配置类定义,进行默认配置的修改(或者在属性文件中修改属性)
@EnableCaching开启扫描注解,只要bean中有方法有缓存的注解就会扫描每一个bean有缓存注解@Cacheable,@CacheEvict等的时候就发起拦截,缓存
示例:
1、通过继承CachingConfigurerSupport,将Spring-Cache的缓存换为Redis
2、使用适合项目的key生成策略cacheKeyGenerator
package com.example.demo.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import java.lang.reflect.Method;
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
@Bean
public KeyGenerator cacheKeyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
通过Jackson2JsonRedisSerializer对 需要缓存的对象进行序列化操作