Spring注解学习笔记

    科技2026-01-29  7

    一、组件注册

    1.@Configuration & @bean 给容器中注入组件

    配置文件config.java

    @Configuration public class MainConfig { @Bean public Person person(){ return new Person("zhangsan",17); } }

    2.@ComponentScan-自动扫描组件

    只要标注了== @Controller、@Service、@Repository、@Component ==的类都会被自动添加进容器中

    @Configuration @ComponentScan(value = "com.wangwang", excludeFilters = {@ComponentScan.Filter( type = FilterType.ANNOTATION, classes = {Controller.class, Service.class})} ) //value-指定要扫描的包 //excludeFilters-指定排除规则 //includeFilters-扫描时只包含的类型,此时useDefaultFilters = false public class MainConfig { @Bean("person") public Person person(){ return new Person("zhangsan",17); } }

    FilterType.ANNOTATION:按照注解 FilterType.ASSIGNABLE_TYPE:按照类型 FilterType.REGEX:按照正则

    FilterType.CUSTOM:自定义 a.首先要实现一个TypeFilter接口

    /** * metadataReader:包含当前类的信息 */ public class myFilterType implements TypeFilter { public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //扫描得到当前注解信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //扫描得到当前类的信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //扫描得到当前类路径信息 Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("------>" + className); if(className.contains("er")){ return true; } return false; } }

    b.设置扫面的注解

    @ComponentScan(value = "com.wangwang", includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {myFilterType.class})}, useDefaultFilters = false )

    3.@Scope设置作用域

    prototype 多实例,获取的时候创建一个对象,每次获取都会调用 singleton 单实例,默认容器创建时,对象创建完成,每一次获取都是调用map.get() 懒加载(@Lazy):第一次获取时创建

    public class MainConfig { @Scope("prototype") @Bean public Person person(){ return new Person("zhangsan",17); } }

    4. @Conditional 按条件给容器中注入组件

    a.实现一个Condition接口

    public class linuxCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name"); if(property.contains("Linux")){ return true; } return false; } } public class windowsCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); BeanDefinitionRegistry registry = context.getRegistry(); ClassLoader classLoader = context.getClassLoader(); String property = environment.getProperty("os.name"); if(property.contains("Windows")){ return true; } return false; } }

    b.在方法上加@Conditional

    @Configuration public class MainConfig { @Bean("bill") @Conditional({windowsCondition.class}) public Person person01(){ return new Person("Bill Gates",62); } @Bean("linus") @Conditional({linuxCondition.class}) public Person person02(){ return new Person("linus",56); } }
    Processed: 0.039, SQL: 9