Spring-注解简述

配置组件


@Configuration

概述:

把一个类作为一个loC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean

栗子

@Configuration
public class MyConfig {

    @Bean(value = "student2")
    public Student xiaoQiang() {
        System.out.println("xiaoQiang add ...");
        return new Student();
    }

}

@ComponentScan

在配置类上添加@ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,ComponentScan相当于之前的<context:component-scan>

栗子

@Configuration
@ComponentScan(
//        value = "com.xxq.spring.one.componentScan.rest",
        // 根据注解
//        includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class})}
        // 根据注解了的类
//            includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = UserController.class)}
        includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,value = {MyTypeFilter.class})}
)
public class MyConfig2 {


}
public class MyTypeFilter implements TypeFilter {


    /**
     * @param metadataReader        获取当前正在操作类的信息
     * @param metadataReaderFactory 获取上下文中所有的信息
     * @return
     * @throws IOException
     */
    @Override
    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;
        } else {
            return false;
        }
    }
}

@scope

  • 用于指定scope作用域的(用在类上)
  • prototype际里,多例singleton单例
  • request主要应用于web模块,同一次请求只创建一个实例
  • session主要应用于web模块,同一个session只创建一个对象

栗子

@Configuration
public class MyConfig {
    @Scope("prototype")
    @Bean(value = "student2")
    public Student student() {
        return new Student();
    }
}

@Lazy

 表示延迟初始化

@Configuration
public class MyConfig {

    // 默认非延迟加载,懒加载只针对单例bean起作用;
    @Lazy
    @Bean(value = "student2")
    public Student student() {
        System.out.println("lazy load");
        return new Student();
    }
}

@Conditional

Spring4开始提供,它的作用是按照一定的条件进行判断,满足条件给容器注册Bean
 

public class WindosCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        Environment environment = context.getEnvironment();
        String osName = environment.getProperty("os");
        System.out.println(osName);
        if (osName.contains("Windows")) {
            return true;
        }
        return false;
    }
}

@Configuration
public class MyConfig {

    @Conditional(WindosCondition.class)
    @Bean(value = "student2")
    public Student daQiang() {
        System.out.println("daqiang add ...");
        return new Student();
    }

}

@Import

导入外部资源

  • 给IOC容器注册Bean的方式
    • 1、@Bean直接导入单个类
    • 2、@ComponentScan 默认扫描(@Controller.@Service、@Repostory
      @component)
    • 3、@Import快速给容器导入Bean的方式
      • a.@Import直接参数导入
      • b.实现importSelector自定义规则实
      • c.实现ImportBeanDefinitionRegistrar
    • 4、FactoryBean 把需要注入的对象封装为FactoryBean

栗子




// 实现ImportSelector  导入bean
public class MyImportsSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.xxq.spring.one.componentScan.rest.Dog",
                "com.xxq.spring.one.componentScan.rest.Book"};
    }

    @Override
    public Predicate<String> getExclusionFilter() {
        return null;
    }
}


// 实现ImportBeanDefinitionRegistrar  导入bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean company = registry.containsBeanDefinition("com.xxq.spring.one.componentScan.rest.Dog");
        boolean member = registry.containsBeanDefinition("com.xxq.spring.one.componentScan.rest.Book");

        if (company && member) {
            BeanDefinition beanDefinition = new RootBeanDefinition(JavaNote.class);
            registry.registerBeanDefinition("user", beanDefinition);
        }
    }
}

// 导入工厂bean
public class MyFactoryBean implements FactoryBean<JavaVideo> {

    @Override
    public JavaVideo getObject() throws Exception {
        return new JavaVideo();
    }

    @Override
    public Class<?> getObjectType() {
        return JavaVideo.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

@Import({Jianke.class, MyImportsSelector.class,MyImportBeanDefinitionRegistrar.class})
@Configuration
public class MyConfig {

    @Bean(value = "student2")
    public Student student() {
        return new Student();
    }

    @Bean
    public MyTest myTest() {
        return new MyTest();
    }

    @Bean
    public MyFactoryBean javaVideo(){
        return new MyFactoryBean();
    }

}

生命周期控制

4种方式
 1.添加initMethod 和 destroyMethod
 2.实现InitializingBean和DisposableBean接口
 3.使用@PostConstruct和@PreDestroy注解
 4.implements BeanPostProcessor

栗子

// 实现BeanPostProcessor 
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization" + beanName + "," + bean);
        return bean;
    }



    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization" + beanName + "," + bean);
        return bean;
    }
}

// 基于注解 
@Component
public class AirPlane {

    public AirPlane() {
        System.out.println("调用AirPlane的构造方法");
    }

    @PostConstruct
    public void addOil(){
        System.out.println("飞机飞行前加油");
    }

    public void run(){
        System.out.println("正在空中巡航");
    }

    @PreDestroy
    public void close(){
        System.out.println("飞机落地熄火");
    }
}

// 基于初始化bean,InitializingBean,DisposableBean 等接口
@Component
public class Train implements InitializingBean,DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("火车对象销毁");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("火车对象初始化");
    }
}

// 基于@bean注解
@Configuration
public class MyConfig {

    @Lazy
    @Bean(initMethod = "addOil",destroyMethod = "close")
    public Car car(){
        return new Car();
    }

}

赋值组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service用于标注业务层组件
@Controller用于标注控制层组件
@Repository用于标注数据访问组件,即DAO组件。
@Value普通数据类型赋值
@Autowired默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
@PropertySource读取配置文件赋值
@Qualifier存在多个实例配合使用
@Primary自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配

织入组件

ApplicationContextAware可以通过这个上下文环境对象得到Spring容器中的Bean
BeanDefinitionRegistryPostProcessorBeanDefinitionRegistryPostProcesso
BeanFactoryPostProcessor接口,是Spring框架的BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition

修改于公元2021年7月10日下午15点30分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值