目录
第一种 :直接在pom.xml中引入相关依赖时直接指定版本号
4.导入ImportBeanDefinitionRegistrar实现类
修改SpringBoot项目中依赖的版本号
在SpringBoot项目中导入数据库驱动的默认版本号为8.0.23
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- <scope>runtime</scope>-->
</dependency>
为什么默认是8.0.23版本
因为在parent中定义了这些导入依赖坐标的版本号,避免坐标冲突。
我们可以进入源码查看
修改方法
第一种 :直接在pom.xml中引入相关依赖时直接指定版本号
第二种:在pom.xml中的<properties>属性中进行修改
<properties>
<java.version>1.8</java.version>
<mysql.version>8.0.13</mysql.version>
</properties>
SpringBoot自动化配置web项目
1.依赖版本和依赖坐标自动导入
2.自动化配置
自动配好SpringMVC
- 引入SpringMVC全套组件
- 自动配好SpringMVC常用组件(三大组件,文件上传等)
自动配好web常见功能,如:字符编码问题,静态资源管理
3.自动配好tomcat
@Configuration注解
让当前类变成配置类,代替配置文件
@Configration注解中的proxyBeanMethods属性功能
proxyBeanMethods=true:Full模式,保证每个@Bean方法(配置类对象.getXxx()方法)被调用多少次返回的bean对象都是单例的,即 和直接从容器中获取的bean对象是同一个
proxyBeanMethods=false:Lite模式,每个@Bean方法 (getXxx())被调用时返回的bean对象都是重新new出来的
@Import注解
1.导入Bean
如:@Import(普通类.class)
会执行当前类的构造方法创建对象,并存到IoC容器,生成的bean名称类为:该普通类的全路径
2.导入外部配置类
如:@Inport(xxxConfig.class)
会创建xxxConfig类的bean,并且改配置类中带有@Bean注解的方法,都会创建@Bean方法返回对象的bean,生成bean的名称为:@Bean方法名
3.导入ImportSelect实现类,批量生成bean
public class MyImportSelect implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.hhh.pojo.Person"};//定义需要生成bean类的全路径
}
}
@Configuration
@Import(MyImportSelect.class)
public class BookConfig {
}
结果就会生成Person类的bean,并加入到IoC容器
注意:MyImportSelect类不会生成bean
4.导入ImportBeanDefinitionRegistrar实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Book.class).getBeanDefinition();
registry.registerBeanDefinition("book1",beanDefinition);//给这个bean起名字为book1
}
}
@Configuration
@Import({MyImportSelect.class, MyImportBeanDefinitionRegistrar.class})
public class BookConfig {
}
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
Person bean = ctx.getBean(Person.class);
Book book1 = (Book) ctx.getBean("book1");
System.out.println(book1);//com.hhh.pojo.Book@7748410a
// System.out.println(bean);
}
}
@ConditionalOnBean
@ConditionalOnBean(Person.class)//IoC容器中有这个Person类的bean才会让这个配置类生成bean
@Configuration
@ConditionalOnBean(Person.class)//IoC容器中有这个Person类的bean才会让这个配置类生成bean
public class MyConfig {
}
@ConfigurationProperties
根据prefix属性值进行赋值
获取yml文件中的属性信息,并把yml文件中的属性值与对象类进行映射,并生成这个类的bean
@SpringBootApplication注解
@SpringBootApplication注解由三个注解组成
@SpringBootConfiguration
作用跟@Configuration差不多
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
这个注解的意思就是会扫描与SpringBoot引导类处于同一路径下的所有包
SpringBoot健康监控
服务端配置
导入依赖
<!--Spring Boot Admin Server监控服务端-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.1</version>
</dependency>
在引导类中添加注解@EnableAdminServer
@SpringBootApplication
@EnableAdminServer
public class SpringDay8ServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDay8ServerApplication.class, args);
}
}
修改服务端端口号
客户端配置,即自己写的程序
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
编写yml文件配置信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mysql_day2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
boot:
admin:
client: # spring-boot-admin 客户端配置
url: http://localhost:9999 #服务端连接地址
username: admin # 服务端账号
password: admin # 服务端密码
instance:
prefer-ip: true # 使用ip注册
application:
name: boot_client #项目名称
# 服务端点详细监控信息
management:
endpoints:
web:
exposure:
include: "*" #以web形式暴露
enabled-by-default: true #暴露所有端点信息
endpoint:
health:
show-details: always
enabled: true #开启健康检查详细信息
启动服务端和客户端,并访问服务端
进入
lombok使用
导入依赖
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用lombok我们就不需要自己写set,get,toString等方法,可以分别使用@Getter@Setter@ToString这三个注解,
然后@Data注解可以替换这三个注解
//@Getter
//@Setter
//@ToString
@Data
public class User {
private String name;
private Integer age;
private String address;
}
@Data
@Accessors(chain = true)//允许链式编程
public class User {
private String name;
private Integer age;
private String address;
}
使用@Accessors让这个类可以链式编程
结果:
public class UserTest {
@Test
public void testUser(){
User user=new User();
user.setName("hhh").setAge(18).setAddress("北京");
System.out.println(user);
//User(name=hhh, age=18, address=北京)
}
}
使用@Builder,不使用链式编程
@Data
//@Accessors(chain = true)//允许链式编程
@Builder
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
public class User {
private String name;
private Integer age;
private String address;
}
public class UserTest {
@Test
public void testUser(){
/* User user=new User();
user.setName("hhh").setAge(18).setAddress("北京");
System.out.println(user);*/
User user = User.builder().name("hhh").age(18).address("北京").build();
System.out.println(user);//User(name=hhh, age=18, address=北京)
}
}
使用@Slf4j注解打日志
@Slf4j
@Service
public class UserServiceImpl implements UserService {
@Override
public void save() {
log.info("BookService save");
// System.out.println("service");
}
}