@Configuration
アノテーションでマークされたクラスはjavaconfigであり、クラスはiocのコンテナーに配置され
ます。これは、以前の構成ファイルと同等の、アノテーションでマークされたクラスです。
@豆
コンポーネントをiocコンテナに導入する場合は、通常、構成クラスで記述されます。デフォルトは単一インスタンスです。
コンポーネントのIDはメソッド名であり、コンポーネントのタイプは戻り値のタイプです。
@Lazy:遅延読み込みに設定します。@ Beanで使用します。このクラスは、オブジェクトが使用されている場合にのみ読み込まれます。
@Scope( "prototype"):クラスのスコープを設定します。デフォルトでは、単一のインスタンスを作成しません。
スコープパラメータ値:
singleton:// single instance;
protocol:// multi-instance;
request:// a request to create instance;
session:// a session to create instance;
@Configurationおよび@Beanテスト:
/**
* proxyBeanMethods参数:
* 是否代理bean的方法
* Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件依赖必须使用Full模式默认。其他默认是否Lite模式
*/
@Configuration(proxyBeanMethods = true) //--标注这个类就是一个配置类,相当于我们以前编写的xml文件
public class MyConfig {
@Bean //向ioc工厂注入一个bean,默认单实例,id为方法名:person/ 类型为返回值类型:Person
public Person person(){
return new Person("张三",18);
}
@Bean //作用同上
public Pet pet(){
return new Pet("大黄",3);
}
}
結果:
@ Component、@ Controller、@ Service、@ Repository
以前と同じように機能します
@ComponentScan
スキャンパスにスプリングインジェクションアノテーションがある限り、以前にxmlでスキャンパスを構成したのと同じです。その後、インジェクションできます。
このアノテーションには他にもいくつかの属性があります。これらのクラスを除外し、それらのクラスをスキャンしてロードせず、条件が満たされている限りそれらをロードします。
テスト:
@Configuration
@ComponentScan(
includeFilters ={
@ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {
Controller.class})
},
useDefaultFilters = false
//excludeFilters用法同上,不演示
)
public class MyConfig01 {
}
- includeFilters:iocコンテナーにロードされたものを許可します。これを使用する場合は、以下にuseDefaultFilters = falseを追加して有効にする必要があります。
- excludeFilters:それらをiocコンテナにロードさせないでください
- タイプの値:
タイプ値の汎用クラスFilterTypeの値は次のとおりです
。ANNOTATION:アノテーションフィルタリングを使用;
ASSIGNABLE_TYPE:指定されたタイプを
使用; ASPECTJ:ASPECTJ式を使用;
REGEX:正規表現を使用;
CUSTOM:カスタムルールを使用、TypeFilter実装を提供する必要があるクラス;
カスタムフィルター:
//要实现TypeFilter接口,重写match方法
public class MyFilter implements TypeFilter {
/**
* metadataReader:读取当前正在扫描的类的信元数据;
* metadataReaderFactory:可以获取其他任何类的元数据。
* @return 是否加载进ioc的容器中
* @throws IOException
*/
@Override
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
//===================metadataReader的常用方法==============================
// 获取当前类的注解元数据
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
// 获取当前正在扫描的类的元数据
ClassMetadata classMetadata = metadataReader.getClassMetadata();
// 获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
//=====================================================
//测试:只要包含er的类,就不加在进ioc容器
// 获取当前正在扫描的类的元数据
ClassMetadata classMetadata1 = metadataReader.getClassMetadata();
//获取名称
String className = classMetadata1.getClassName();
//判断并返回
return className.contains("er");
}
}
@Conditional():コンポーネントが条件を満たしているか、作成を満たしているか、作成を満たしていないかを判別します
public @interface Conditional { Class <?extends Condition> [] value(); }このアノテーションパラメータは、多くのカスタムジャッジを配置できます。Conditionクラスを統合してメソッドを実装するためのクラスを作成するだけで済みます。
public class aaa implements Condition {
/**
*
* @param conditionContext 当前应用的上下文环境。
* @param annotatedTypeMetadata 标注了该注解的类的信息
* @return true:符合条件。false:不符合条件
*/
@Override
public boolean matches(ConditionContext conditionContext,
AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
//======================================
@Conditional({
xxx.class})
public class MyConfig01 {
}
この注釈は、多くのサブ注釈も導き出します。
@ConditionalOnBean:コンテナに指定されたBeanがある場合@ConditionalOnClass:
クラスパスに指定されたクラスがある
場合
@ConditionalOnExpression:判断条件としてSpEL式に基づく@ConditionalOnJava:判断条件としてJVMバージョンに基づく
@ ConditionalOnJndi:既存の場所で指定された条件でのJNDIルックアップ
@ConditionalOnMissingBean:Beanでコンテナが指定されていない場合
@ConditionalOnMissingClass:クラスパスが指定されていない条件で
@ConditionalOnNotWebApplicationのクラス:現在のプロジェクトはWebプロジェクトの条件
@ConditionalOnProperty:属性値が指定されているかどうかを指定
@ConditionalOnResource:指定されたリソースクラスパスがあるか
@ConditionalOnSingleCandidate:コンテナで指定されている場合のみ、または複数のBeanが優先を指定する場合豆
これらのアノテーションに基づいて、どのクラスを注入できるか、どのクラスを注入できないかを判断できます。
@Import:コンポーネントをコンテナにすばやくインポートします
@Import:コンポーネントはコンテナに自動的に登録され、idはデフォルトで完全なクラス名です。
アノテーションパラメータ:
クラス配列:すべてのクラスをiocコンテナにインポートします。
ImportSelector:インポートするコンポーネントの完全なクラス名の配列を返します。コンポーネント名は完全なクラス名です
。ImportBeanDefinitionRegistrar:Beanをコンテナに手動で登録し、コンポーネント名をカスタマイズできます。
ImportSelector:ImportSelectorインターフェースを実装し、メソッドを実装するためのクラスを作成する必要があります
public class MyImportSelector implements ImportSelector {
/**
*AnnotationMetadata :可以获取到标注了 @Import 注解类的所有注解信息;
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[0];
}
}
ImportBeanDefinitionRegistrar:iocコンテナに登録されているコンポーネントの名前をカスタマイズできます
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* @param importingClassMetadata 获取到标注了@Import注解的所有信息
* @param registry BeanDefinition 注册类: 调用它的 registerBeanDefinition 方法将需要添加到容器中的 Bean 手工注册进来;
* RootBeanDefinition:跟容器
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("id", new RootBeanDefinition(xxx.class));
}
}
}
@ImportResource
このアノテーションを使用して、作成したSpring xmlファイルをjavaconfigにインポートし、javaconfig形式に従って解析できます。
xmlプロジェクトが注釈プロジェクトに変換されるときに使用するのに適しています
@ConfigurationProperties(profix =“ xxx”)
構成ファイルを使用してJavaBeansに値を割り当てることができます。構成ファイルにxxxで始まる構成がある限り、このJavaBeanで同じ名前の属性名が自動的にバインドされて割り当てられます。
バインディング構成ファイルは、application.propertiesファイルのみにすることができます
。割り当てられるjavabeanは、iocコンテナーに存在する必要があります。
プロパティファイル:
person.name=张三
person.age=19
javaBeanクラス:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
//...省略getset等方法
}
結果:
これにより、構成ファイルが自動的にバインドされます。バインドするには、このjavabeanがiocコンテナーに存在する必要があることに注意してください。@EnableConfigurationProperties()+ @ ConfigurationPropertiesアノテーション
とともに使用することもでき
ます。
@EnableConfigurationProperties(xxx.class):関数:
1。xxx.classをiocコンテナーにロードします。2。xxx
のデータバインディング関数をオンにします。