EJB:spring诞生前流行的框架,相对于Spring来说过于臃肿
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
注意:两种文件只能用一个
##修改tomcat的启动端口号
servier.port=8080
##设置项目访问根目录 默认值 /
server.servlet.context-path=/demo
#在yml语法中,空格非常非常敏感 冒号后边有空格隔开
name: Steven
##配置对象数据
User:
name: LiZhengKai
age: 18
addr: ZhuHai
#对象配置方式二
user1: {name: LiZhengKai,age: 18,addr: ZhuHai}
#配置集合
userList:
- LiZhengKai
- WuLiLI
#配置集合方式二
userList2: [LiZhengKai,WuLiLi]
#配置集合重点对象
userListObj:
- name: LiZhegnKai
age: 18
addr: ZhuHai
- name: WuLiLi
age: 18
addr: HeYuan
注意:冒号后边一定要手动加入空格
//这样子配置文件中的name属性就被赋予到name中
//user.name是springboot内置属性,读取到的是计算机的名字
@Value("${user.name}")
private String name;
//在实现类中添加@ConfigurationProperties注解 prefix属性表示配置文件中的哪个数据对象
@ConfigurationProperties(prefix="user1")
注意:要使用@Component进行托管,表示这是spring的一个bean对象
//注入Enviroment
@Autowired
private Environment env;
//获取 可以获取属性,也可以获取属性对象中的属性
env.getProperty("name");
env.getProperty("user.name")
spring.profiles.active=test
spring:
profiles:
active: test
可以在jvm中配置-Dspring.profiles.active=dev 它的级别高于在配置文件中的指定配置
@Servcie
注解@Mapper
注解spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.13.100/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#映射文件加载
mybatis.mapper-locations=classpath:/mapper/*.xml
#配置别名
mybatis.type-aliases-package=com.itheima.integration.domain
#配置日志输出 主要输出sql语句
logging.level.com.itheima.integration.dao=debug
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
<version>2.2.2.RELEASEversion>
dependency>
spring.redis.host=192.168.13.100
spring.redis.port=6379
@Autowired
private RedisTemplate redisTemplate;
@Override
public List<User> findAll() {
List<User> userList= (List<User>) redisTemplate.boundValueOps("users").get();
if (userList==null || userList.size()<1){
userList= userMapper.findAll();
redisTemplate.boundValueOps("users").set(userList);
System.out.println("将数据写入缓存");
}else {
System.out.println("从缓存中读取");
}
return userList;
}
注意:实现类一定要被序列化,不然会报出异常 java.NotSerializableException
由于redis的默认序列化机制导致key出现乱码,数据无法正常显示
默认情况下redisTemplate 使用JDK自带的序列化机制:jdkSerializationRedisSerializer
JDK自带的序列化机制中要求需要key和value都需要实现Serializable接口
RedusTemplate 支持默认以下几种序列化机制: 机制都实现了RedisSerializer接口
Ø OxmSerializer:xml格式存储
Ø GenericJackson2JsonRedisSerializer:跟JacksonJsonRedisSerializer实际上是一样的
Ø GenericToStringSerializer:可以将任何对象泛化为字符串并序列化
Ø StringRedisSerializer:简单的字符串序列化
Ø JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
Ø Jackson2JsonRedisSerializer:序列化object对象为json字符串
@SpringBootApplication
public class IntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(com.itheima.IntegrationApplication.class, args);
}
//自定义序列化机制
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//设置key的序列化机制
template.setKeySerializer(new StringRedisSerializer());
//设置值的序列化机制
template.setValueSerializer(new JdkSerializationRedisSerializer());
return template;
}
}
spring-boot-start-parent 里面有各种jar包的依赖锁定,在SpringBoot自动帮我们整理和jar包依赖,并且解决冲突
但是这里引入的依赖并不是真实的依赖,如果想要用在工程,必须要使用启动器
起步依赖可以获取到依赖的对象,放到容器中
核心意义: Condition 接口是spirng4.0之后提供的接口,增加条件判断,用于选择性创建ben到容器中
public class OnClassCondition implements Condition {
/**
*
* @param context 上下文信息对象,可以获取环境信息,和容器工程和加载器对象
* @param metadata 注解的元数据 获取注解的属性信息
* @return true:表示满足条件 false:表示不满足条件
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ConditionalOnMy.class.getName());
System.out.println(annotationAttributes);
String[] names=(String[])annotationAttributes.get("name");
for (String name:names){
Class.forName(name);
}
//如果允许不报错,则返回true
return true;
} catch (ClassNotFoundException e) {
e.printStackTrace();
//运行报错,返回false
}
return false;
}
}
@SpringBootApplication
注解该注解被以下几个注解修饰
时启动类上的注解中的一个注解,本质上时@configuration,意味着我们的启动类被注解修饰后,意味着它本身也是一个配置类,该配置类就可以当作spring中的applicationContext.xml的文件,用于加载配置使用
相当于包扫描 代表被这个修饰的注解类注解的类进行包扫描
**注意: 如果不指定扫描路径,那么它默认只扫描该注解修饰的启动类所在的包以及子包 指定包路径 **
例如 @ComponentScan("com")
Enable* 开头就是springboot中定义的一些动态启用某些功能的注解,他的底层实现原理实际上用的就是@import注解导入一些配置,自动进行配置,加载Bean
自动配置流程
@EnableAutoConfiguration 的作用启动自动配置, @EnableAutoConfiguration 注解的意思就是 SpringBoot 根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加webmvc和tomcat,该注解会自动帮你配置web项目中所需要的默认配置.简答点来说就是会根据定义在classpath下的类,自动给你生成一些Bean,并加载到spring和Context中
@AutoConfigurationPackage
自动配置被修饰的启动类所在的包下的所有带有@Component,@Service,@Controller…注解修改的对象,注册到Spring容器中@Import(AutoConfigurationImportSelector.class)
从META-INF/spring.factories中获取key: EnableAutoCofiguration…的全路径对应的所有类,进行判断条件成立,注册到Spring容器中方法一: 在启动器中加入@ComponentScan 注解 并指定扫描的包(扩大扫描范围)
方法二: 使用@Import 注解 指定实现类所对应的配置类的字节码对象 @Import(UserConfig.class)
/**
* 相当于spring中的applicationContext.xml文件,配置,加载bean
*/
@Configuration
public class UserConfig {
@Bean
public User user(){
return new User();
}
}
方法三: 使用自定义的Enable注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class) //将需要放到容器的实现类对应的配置类的字节码对象作为参数传入Import注解中
public @interface EnableUser {
}
方法四: 在配置类中自定义ImportSelector的实现类 并重写selectImports()方法 返回的是一个String数组
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//返回要注册到spring容器中的Bean的全路径
return new String[]{"com.itheima.pojo.User","com.itheima.pojo.Role"};
}
}
在启动器中使用getBean(实现类字节码对象) 得到容器中的实现类
@Import(MyImportSelector.class)
public class DemoEnable2Application {
public static void main(String[] args){
ConfigurableApplicationContext context = SpringApplication.run(DemoEnable2Application.class, args);
//获取加载第三方依赖中的bena
// Object user1 = context.getBean("user");
//MyImportSelector需要使用的配置类型
Object user = context.getBean(User.class);
System.out.println(user);
Object role = context.getBean(Role.class);
System.out.println(role);
方法五: 在配置类中自定义 ImportBeanDefinitionRegistrar 的实现类,并重写rgisterBeanDefinitions() 方法,再在启动器的Import注解中指定该实现类的字节码对象
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 注解的元数据 获取注解的属性信息
* @param beanDefinitionRegistry 注册器
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//创建BeanDefinition对象
AbstractBeanDefinition userDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
AbstractBeanDefinition roleDefinition = BeanDefinitionBuilder.rootBeanDefinition(Role.class).getBeanDefinition();
//注册Bean到容器中
beanDefinitionRegistry.registerBeanDefinition("user",userDefinition);
beanDefinitionRegistry.registerBeanDefinition("Role",roleDefinition);
}
}
Redis的实现类 (要加上@ConfigurationProperties(prefix=“redis”) 注解 因为要从配置文件中动态加载 )
RedisAutoConfiguration
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass(Jedis.class) //当前项目中有Jedis依赖项时,让配置生效
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(Jedis.class) //当当前容器没有jedis再使用Bean容器的逻辑
public Jedis jedis(RedisProperties redisProperties){
System.out.println("SprongBoot自动创建Jedis对象 host:"+redisProperties.getHost()+"| Port:"+redisProperties.getPort());
return new Jedis(redisProperties.getHost(),redisProperties.getPort());
}
}
在resources目录下创建META-INF/sprinig.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.*..RedisAutoConfiguration #这里是配置类的全路径
在另一个工程创建起步引导类
@SpringBootApplication
public class ItheimaRedisTestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ItheimaRedisTestApplication.class, args);
Jedis bean = context.getBean(Jedis.class);
System.out.println(bean);
}
@Bean
public Jedis jedis(){
System.out.println("执行的时Jedis容器");
return new Jedis("hostll",888);
}
}
创建application.yml文件
redis:
host: 192.168.13.100
port: 6379
是Springboot官方自带的组件,可以用来监控,Bean加载情况,环境变量,日志信息,线程信息等等
#配置健康信息的详情内容 aways表示显示所有健康信息
mamagement.endoint.health.show-details=aways
#配置info信息 http://localhost:8080/actuator/info 前缀必须是info
info.name-Lizhengkai
info.sex=1
info.age=22
#配置 暴露所有web相关的端点信息
management.endpoints.web.expsoure.include=*
admin server 用于收集统计所有相关Client 的注册过来的信息进行汇总展示
admin client 每一个spring boot 工程都是一个clent 相关的功能展示需要汇总到server
<dependencyManagement>
<dependencies>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-dependenciesartifactId>
<version>2.1.6version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-serverartifactId>
dependency>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-clientartifactId>
dependency>
#配置注册到server的ip端口地址
spring.boot.admin.client.url=http://localhost:9000
#配置健康信息的详情内容 aways表示显示所有健康信息
mamagement.endoint.health.show-details=aways
#启动健康检查,默认是true
management.endpoint.health.enabled=true
#配置info信息 http://localhost:8080/actuator/info 前缀必须是info
info.name-Lizhengkai
info.sex=1
info.age=22
#配置 暴露所有web相关的端点信息
management.endpoints.web.expsoure.include=*
SpringBoot提供了四个监听器