1. 注解
- 24.1.6 19:38 开始
- 24.1.6 21:13 更新
1.1. @Configuration
告诉SpringBoot这是一个配置类,相当于配置文件。
@Configuration
public class MyConfig {}
1.2. proxyBeanMethods属性
- Full(proxyBeanMethods=true):保证每个@Bean方法被调用多少次返回的组件都是单实例的。
- Lite(proxyBeanMethods=false):每个@Bean方法被调用多少次返回的组件都是新创建的。
- 组件依赖必须使用Full模式,默认就是这个模式。
@Configuration(proxyBeanMethods = false)
public class MyConfig {}
不需要组件依赖时使用Lite模式,也就是说不需要创建新组件时使用Lite,使用Full模式来保证取得的组件为ioc中的同一组件,而这两个模式在getBean时都是从ioc容器中拿的同一个组件。
1.3. @Bean
- 给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型;
- 返回的值,就是组件在容器中的实例,默认单实例。
@Configuration
public class MyConfig {
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
return zhangsan;
}
}
1.4. 注册依赖
@Configuration
public class MyConfig {
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
1.5. SpringMVC注解
@Component、@Controller、@Service、@Repository
- 根据它们的源码可以看到,Controller、Service、Repository其本质就是Component。
- 它存在的本质只是给开发者看的,对Spring而言它们就都是Component。
- @Controller 控制层类,@Service 业务层类,@Repository 持久层类。
- @Component 无法归类到前3种时就称为组件。
原文:https://blog.csdn.net/nutony/article/details/118670662
1.6. @Import
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名。
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false)
public class MyConfig {}
@Import 高级用法: https://www.bilibili.com/video/BV1gW411W7wy?p=8
1.7. @Conditional
- 该注解及其扩展来的注解的关键是实现Condition接口重写其matches方法。
- @Conditional,中派生了很多的子注解,它们可以添加在@Bean注解的方法上也可以放在配置类上,在方法上满足所需条件时则执行方法中内容并注册到IOC。
- 容器中如果不满足条件则不注册,在配置类中满足需求时则执行配置类中所有的@Bean方法并注册到 IOC。
- 容器中如果不满足条件则不注册,以@ConditionalOnBean(name="tom")为例,当 IOC 容器中拥有id为tom的组件时才会满足条件,否则不满足条件。
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
@ConditionalOnBean(name = "tom")
//@ConditionalOnMissingBean(name = "tom")
public User user01(){
User zhangsan = new User("zhangsan", 18);
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
1.8. @ImportResource
配置文件:
======================beans.xml=========================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="haha" class="com.atguigu.boot.bean.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="18"></property>
</bean>
<bean id="hehe" class="com.atguigu.boot.bean.Pet">
<property name="name" value="tomcat"></property>
</bean>
</beans>
加载配置文件:
@ImportResource("classpath:beans.xml")
public class MyConfig {}
测试:
boolean haha = run.containsBean("haha");
boolean hehe = run.containsBean("hehe");
System.out.println("haha:"+haha);//true
System.out.println("hehe:"+hehe);//true
1.9. 配置绑定
1.9.1. 原始方式
public class getProperties {
public static void main(String[] args) throws FileNotFoundException, IOException {
Properties pps = new Properties();
pps.load(new FileInputStream("a.properties"));
Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
while(enum1.hasMoreElements()) {
String strKey = (String) enum1.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
//封装到JavaBean。
}
}
}
1.9.2. 第一种方式
@Component + @ConfigurationProperties:@Component@ConfigurationProperties(prefix = "mycar")声明在要绑定的类的上方。
/**
* 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
*/
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
1.9.3. 第二种方式
@EnableConfigurationProperties + @ConfigurationProperties:
- @ConfigurationProperties(prefix = "mycar")声明在要绑定的类的上方;
- 在配置类的上方声明@EnableConfigurationProperties(Car.class),开启对应类的配置绑定功能,把Car这个组件自动注入到容器中。
@EnableConfigurationProperties(Car.class)
// 1、开启Car配置绑定功能
// 2、把这个Car这个组件自动注册到容器中
// 说明一下为什么需要第二种方法:
// 如果@ConfigurationProperties是在第三方包中,
// 那么@component是不能注入到容器的,
// 只有@EnableConfigurationProperties才可以注入到容器。
public class MyConfig {}