概念
IOC:控制反轉。從前需要在程序中創建對象實例;現在則通過一個外部的容器統一動態創建
spring IOC 容器中的實例如何動態加載
Condition:只有在特定條件滿足時才加載
舉例
@ConditionalOnBean
當存在某個實例時才加載
@ConditionalOnClass
當存在某個字節碼文件時才加載
@ConditionalOnProperty
當在配置文件中存在某項配置信息時才加載
將這些注解寫在類或者方法上,就可以在程序運行時動態加載
自定義動態加載
- 實現Condition接口自定義篩選條件
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import JAVA.util.Map;
public class ClassCondition implements Condition {
/**
Condition接口只有一個matches方法
context:上下文對象:環境對象、IOC容器對象,ClassLoader對象
metadata:注解元對象:注解定義的屬性值
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
//獲取注解定義的屬性值 “org.springframework.data.redis.core.RedisTemplate”
Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
//加載字節碼文件,如果可以加載則返回true,否則返回false
String[] value = (String[]) map.get("value");
for (String v : value) {
Class<?> cls = Class.forName(v);
}
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
- 自定義注解
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
//該可以使用在類、方法上
@Target({ElementType.TYPE, ElementType.METHOD})
//程序運行時執行
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
//接收字符串數組
String[] value();
}
- 創建User類用于測試
public class User {
}
- 創建加載User實例對象配置類
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//說明這是一個配置類,在啟動時會被加載
@Configuration
public class UserConfig {
@Bean
//該注解表示當“org.springframework.data.redis.core.RedisTemplate”存在時創建User實例對象
@ConditionOnClass("org.springframework.data.redis.core.RedisTemplate")
public User user(){
return new User();
}
}
- 測試
@SpringBootApplication
public class SpingbootConditionApplication {
public static void main(String[] args) {
//接收到加載的配置內容
ConfigurableApplicationContext context = SpringApplication.run(SpingbootConditionApplication.class, args);
Object user = context.getBean("user");
//輸出“com.study.boot.User@64469d8”表示已將user這個bean加載到容器
System.out.println(user);
}
}