Spring Boot的自动装配实际上是从META-INF/spring.factories
文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给Spring容器进行管理.
springboot默认扫描的包是哪些? 主类所在的包以及子包。---为什么是这样? 能不能认为改动?一定在主类上的@SpringBootApplication上.
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//注册扫描的包---getPackageNames得到要扫描的包名。--默认为主类所在的包
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
我们可以在主类上使用@ComponentScan来修改默认的包扫描
@ComponentScan(basePackages = {"com.ykq.aaa"}) //那么就不会使用默认的包扫描路径了
springboot 有没有注册DispatcherServlet. 为何能找到controller层。
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring.xml
springmvc
/
springboot帮你完成自动装配
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
当主函数运行时会加载一个使用@SpringBootApplication注释的类,@SpringbootApplication它是一个复合组件。其中@EnableAutoConfiguration它是开启自动配置的核心注解,该注解也是一个复合组件,其中@Import({AutoConfigurationImportSelector.class}) ,该注解需要导入一个AutoConfigurationImportSelector类,该类会加载你需要的自动装配类,而这些自动装配类会完成响应的自动装配功能。
mysql
mysql-connector-java
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.2
#数据源信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# characterEncoding防止您添加到数据的数据出现乱码。
spring.datasource.url=jdbc:mysql://localhost:3306/qy165?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
spring.datasource.username=root
spring.datasource.password=root
#指定mybatis映射文件的路径 classpath编译后的路径
mybatis.mapper-locations=classpath:mapper/*.xml
#控制台打印sql日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@Data
public class Dept {
private Integer id;
private String name;
private String loc;
}
public interface DeptDao {
public List findAll();
}
@SpringBootTest(classes = Qy165Springboot02Application.class)
//springboot提供了单元测试
class Qy165Springboot02ApplicationTests {
@Autowired
private DeptDao deptDao; //无法注入DeptDao的对象。为什么无法注入?[spring容器中没有dao接口的代理实现类]
@Test
void contextLoads() {
deptDao.findAll().stream().forEach(System.out::println);
}
}
com.github.pagehelper
pagehelper-spring-boot-starter
1.4.6
代码:
@Test
void contextLoads() {
PageHelper.startPage(2,3);
List all = deptDao.findAll();
//把查询的结果封装到PageInfo中
PageInfo pageInfo=new PageInfo<>(all);
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("当前页的记录:");
List list = pageInfo.getList();
list.stream().forEach(System.out::println);
}