springboot给我们的自动配置
1.自动配置tomcat
2.自动配置好了springMVC全套组件
3.自动配置好了Web常见功能:如字符编码问题
4.默认的包结构
主程序所在的包和其下面的所有子包里面的所有组件都会被默认扫描进来,默认的包扫描路径是主程序所在的包
但是如果我们想放大包扫描的路径
指定包扫描 规则(默认是主程序所在的类)
@SpringBootApplication(scanBasePackages = "com.hui")
或者
@ComponentScan( "com.hui")
如果我们将我们写的controller请求放在主程序所在的包外面,我们必须要指定包扫描的扩大,否则不会成功
5.各种配置都有默认值
6.按需引入场景,自动配置才会开启
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.4.4</version>
<scope>compile</scope>
</dependency>
二:一些必要的注解
1.@Configuration注解 来标明配置类,同时配置类也是一个组件
@Configuration
public class MyConfig {
@Bean
public User user(){
return new User(13,"小明");
}
}
我们利用@Configuration来标明这是一个配置类
2.@Bean 传入参数时候 也就是我们id为传入的参数id为参数
@Bean(无参)注解到方法上 就是给容器添加了组件 同样的也是单例的对象
方法名为id 返回类型为 return的类型也就是返回值
@Bean("小明")
public User user(){
return new User(13,"小明");
}
测试;获取
package com.hui.springboot01hello;
import com.hui.springboot01hello.pojo.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Springboot01helloApplication {
public static void main(String[] args) {
//返回我们的IOC容器
ConfigurableApplicationContext run = SpringApplication.run(Springboot01helloApplication.class, args);
//产看容器中的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//User user = (User) run.getBean("user");
User user2 = (User) run.getBean("小明");
//System.out.println(user);
System.out.println(user2);
}
}
结果:
.....好多的bean
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
multipartConfigElement
multipartResolver
spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
org.springframework.aop.config.internalAutoProxyCreator
下面是我们的自定义的User类对象
com.hui.springboot01hello.pojo.User@12eedfee
3.proxyBeanMethods = false 代理bean的方法
告诉spring boot容器找组件的方法
//@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean("小明")
public User user(){
return new User(13,"小明");
}
}
为true我们在配置类中的方法在外随意调用最终都会转为到容器中获取单例的对象
为false的时候,我们容器中不会产生代理对象,每次调用都会产生一个新的对象
解决的组件依赖的场景(是否是容器中的实例)
@Configuration(proxyBeanMethods = true)
我们创造实例默认先从的spring容器中寻找 适合多复用这个组件
@Configuration(proxyBeanMethods = false)
跳过spring的容器的检查 直接创造实例对象 也就意味着spring的容器对象实例少 加载快 其他的组件都不依赖这个对象的组件的时候 建议使用proxybeanmethods = false
4.@Import导入组件
//@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean("小明")
public User user(){
return new User(13,"小明");
}
}
注解:
public @interface Import {
Class<?>[] value();
}
@Import({User.class})
@SpringBootApplication
public class Springboot01helloApplication {
public static void main(String[] args) {
//返回我们的IOC容器
ConfigurableApplicationContext run = SpringApplication.run(Springboot01helloApplication.class, args);
System.out.println(run.getBean("小明"));
System.out.println("================");
String[] names = run.getBeanNamesForType(User.class);
for (String name:names)
System.out.println(name);
System.out.println();
}
}
结果:
com.hui.springboot01hello.pojo.User@4dba773d
================
小明
com.hui.springboot01hello.pojo.User
我们通过@Bean注入的实例 id为指定的内容
我们通过@Import导入的组件默认名称为全类名
5.@Conditional注解 条件装配注解
满足某些条件的时候进行组件的注入
当有某个bean干什么
@ConditionalOnBean
当没有某个bean的时候干什么
@ConditionalOnMissingBean
当有某个Class的时候干什么
@ConditionalOnClass
当没有某个Class的时候干什么
@ConditionalOnMissingClass
…
@Controller
//当我们容器中有"小明"这个实例的时候我们才会让这个controller生效
@RequestMapping("/hello")
@ConditionalOnBean(name="小明")
public class hellocontroller {
@RequestMapping("/hello")
@ResponseBody
public String method(){
return "hello";
}
}
结果:可以访问
当我们没有这个实例对象的时候
@Controller
@RequestMapping("/hello"
//容器中没有”小红“这个对象实例
@ConditionalOnBean(name="小红")
public class hellocontroller {
@RequestMapping("/hello")
@ResponseBody
public String method(){
return "hello";
}
}
这个controller无法被加载 注册 所以不能用 于请求 因为我们的条件注解限定了这个bean注册的条件
反向修改就可以成功访问
@ConditionalOnMissingBean没有的时候生效
@Controller
@RequestMapping("/hello")
@ConditionalOnMissingBean(name="小红")
public class hellocontroller {
@RequestMapping("/hello")
@ResponseBody
public String method(){
return "hello";
}
}
6.@ImportSource允许我们用原始spring配置文件beans.xml的方式进行资源导入容器中
@ImprotResource("classpath:beans.xml")
解析指定路径下的资源,导入注册到容器中
7.@Configuration Properties
将properties文件中的配置进行导入 绑定
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private int age;
private String name;
}
properties文件
user.age=19
=zhanghua
进行访问:http://localhost:8081/hello/user
@Autowired
private User user;
@ResponseBody
@RequestMapping("/user")
public User userTest(){
return user;
}