一、Spring和SpringBoot简介
Spring简介【总】
概念:是一个java技术框架,简化了企业开发的难度和开发周期。
作用:1、分层解耦。2、简化框架的使用难度。
SpringBoot简介【总】
概念:基于Spring的框架。
作用:简化了Spring框架开发的难度(省去了Spring的很多配置)
二、控制反转(Ioc)
IoC概念【总】
控制反转:将创建Bean对象的权利交给Spring,Spring创建Bean对象之后保存到Spring容器中,我们程序从Spring容器中获取需要的Bean对象就行了。
注解作用:告诉Spring创建Bean对象
1、加载Bean
@Component:写类上,将普通类交给Spring管理,这个类非三层架构中的类。
@Controller:写类上,把controller层类交给Spring管理(学习SpringMVC会用到)
//控制层注解,
@Controller
public class UserController {
//@Qualifier("userServiceImplA")
@Autowired
//通过spring容器给变量赋予对应的值
private UserService userService;
public void add() {
System.out.println("UserController");
userService.off();
}
}
@Service:写类上,把service层类交给Spring管理。
@Service("userServiceImplA")
public class UserServiceImplA implements UserService {
@Override
public void off() {
System.out.println("A实现类执行了");
}
}
@Repository:写类上,把dao层类交给Spring管理。(但是现在很少用,因为dao层使用的是mybatis技术,没有类只有接口)
注意:Spring默认加载引导类所在包及其子包下面的类上的注解,如果我们的类不在这个包范围内,无法被加载。可以在引导类上使用@ComponentScan(“…”)注解指定要扫描的包。
2、获取bean
//PersonServiceImpl是PersonService的实现类,要获取spring容器中哪个类的对象,就再类名后加。calss,如果是接口,并且有多个实现类,那么就需要具体的实现类的类名
PersonService personService = run.getBean("PersonServiceImpl", PersonService.class);
3、Bean的范围
@Scope(“”):
使用位置:写在类上
作用:指定Bean的作用范围。singleton表示单例bean,默认值。prototype表示多例bean。
4、管理第三方bean
@Configuration
//获取配置文件中前缀为druid的数据,给成员变量一次性全部赋值
@ConfigurationProperties(prefix = "druid")
@Setter
public class DruidData {
private String driverClassName;
private String url;
private String username;
private String password;
//value给每个成员逐个赋值
//@Value("${druid.driverClassName}")
//private String driverClassName;
//@Value("${druid.url}")
//private String url;
//@Value("${druid.username}")
//private String username;
//@Value("${druid.password}")
//private String password;
@Bean
//产生一个bean对象然后,将bean对象储存到spring容器中
public DruidDataSource druidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
依赖注入(DI)
给对象类型的属性赋值
@Autowired:按照类型自动注入,如果Spring容器中同类型的对象有多个,可能注入失败,需要使用@Qualifier注解指定要注入的Bean的名称。
@Qualifier:结合@Autowired注解一起使用,指定要注入的Bean的名称。
@Controller
public class UserController {
@Qualifier("userServiceImplA")
//@Qualifier用于UserService 有多个实现类时指定获取某个实现类
@Autowired
private UserService userService;
public void add() {
System.out.println("UserController");
userService.off();
}
}
给普通类型的属性赋值【总】
@Value:常写在成员变量上,给成员变量注入普通类型的数据
@ConfigurationProperties:写在类上,给Bean的属性批量注入普通类型数据。
应用场景:常用来读取配置文件中的信息
拔高知识
SpringBoot整合Junit
lombok工具包
@NoArgsConstructor//生成空参构造【了解】
@AllArgsConstructor//生成全参构造【了解】
@Getter//生成getter方法【了解】
@Setter//生成setter方法【了解】
@EqualsAndHashCode//生成hashCode和equals方法【了解】
@ToString//生成toString方法【了解】
@Data//生成以上所有方法(除了全参构造方法),贼牛批【掌握】
@Slf4j//类中会生成一个log对象,用于输出日志【掌握】
Spring循环依赖【总】
现象:A对象内部注入了B对象,B对象内部注入了A对象,此现象就成为循环依赖。
set方式循环依赖
springboot2.6.0之前:不需要解决,Spring自动解决了。
springboot2.6.0及以后版本:需要在application.properties开启运行set方法循环依赖:
允许set方式循环依赖
spring.main.allow-circular-references=true
构造方式循环依赖【总】
必须人为解决:在任意一方构造方法中使用@Lazy注解标注注入的对象,含义是注入代理对象而非真实对象。