Spring IOC注解大全(完全注解版)

@Bean
  • 相当于一个bean标签,生成Bean的id默认为方法名
  • 可在属性中自定id、name等

bean的生命周期:创建—初始化—销毁,又容器管理

定义初始化和销毁方法
方法一
@Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
public class Car {
    public Car() {
        System.out.println("创建了一个小汽车");
    }

    public void init(){
        System.out.println("汽车初始化已完成");
    }

    public void destroy(){
        System.out.println("汽车已销毁");
    }
}
方法二
public class Cat implements InitializingBean, DisposableBean {
    @Override
    public void destroy() throws Exception {
        
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }
}
方法三

使用JSR250:

@PostConstruct:初始化

@PreDestroy: 销毁

public class Car {
    public Car() {
        System.out.println("创建了一个小汽车");
    }

    @PostConstruct
    public void init(){
        System.out.println("汽车初始化已完成");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("汽车已销毁");
    }
}
方法四

继承BeanPostProcessor bean的后置处理器:

postProcessBeforeInitialization 初始化之前

postProcessAfterInitialization 初始化之后

@ComponentScan()
@ComponentScan(value = "com.sjh",excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class})
})
//扫描com.sjh下的包,排除注解为Controller、Service
//excludeFilters改为inclueFilters,将useDefaultFilters改为false即可只扫描该注解
//@ComponentScans可指定多个@ComponentScan规则,也可用于jdk7之前@ComponentScan的使用

指定要扫描的包

过滤类型(enum FilterType):

  • ANNOTATION 按照声明类型

  • ASSIGNABLE_TYPE 按照给定的类,例如:book.class

  • ASPECTJ 按照ASPECTJ表达式

  • REGEX 按照正则表达式

  • CUSTOM 使用自定义规则

    //继承TypeFilter
    /**
         *
         * @param metadataReader 当前扫描到的类的信息
         * @param metadataReaderFactory 可以获取到其他任何类的信息
         * @return 是否过滤
         * @throws IOException
         */
    
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException{
        //return
        }
    
@Scope
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

作用范围(interface ConfigurableBeanFactory):

SCOPE_SINGLETON: 单例模式,默认方法启动时就会创建对象放入ioc容器

SCOPE_PROTOTYPE:原型模式,容器启动不创建对象,第一次获取时才初始化

request:同request

session:同session

@Lazy-bean

懒加载,容器启动不创建对象,第一次获取时才初始化,主要针对单例

@Conditional

可以标注在方法上,也可以标注在类上。按照一定条件,满足条件为容器中注册bean,在springboot中大量使用

@Conditional({LinuxCondition.class})
public class LinuxCondition implements Condition {
    /**
     * 
     * @param conditionContext 判断条件能使用的上下文环境
     * @param annotatedTypeMetadata 注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //return
    }
        
@Import

快速导入组件,默认id为全类名

用法一:

@Import({Color.class})

用法二:选择器

@Import({Color.class, MyImportSelector.class})
public class MyImportSelector implements ImportSelector {
    /**
     *
     * @param annotationMetadata 当前标注的@Import注解类的所有注解信息
     * @return 要导入组件中类的全类名
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {}

用法三:手动注册

@Import({MyImportBeanDefinitionRegistrar.class})
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     *
     * @param annotationMetadata
     * @param beanDefinitionRegistry bean定义的注册类,把所有需要添加到bean,
     *                               调用beanDefinitionRegistry.registerBeanDefinition()手动注册
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        BeanDefinition beanDefinition = new RootBeanDefinition(Person.class);
        //手动注册
        beanDefinitionRegistry.registerBeanDefinition("lisi",beanDefinition);
    }
}
@Value
@Value("zhangsan")
private String name;
@Value("#{20-2}") //=>18
private Integer age;
//需加载外部配置文件
@Value("${person.address}")
private String address;

可以写:

  • 数值
  • SpEL:#{}
  • 配置文件中的值:${}
    外部配置文件加载方法:
    @PropertySource(value=“classpath:/person.properties”)将加载配置文件的值保存在环境变量中,加载完成就能获取了
@Autowired
@Qualifier("zhangsan")
@Autowired(required=false)
private Person person;

自动注入。利用依赖注入,在容器中寻找对应的bean并注入

注入规则:
  1. @Qualifier(“zhangsan”) :使用Qualifier手动指定需要装配的id
  2. @Pimary 首选装配,在定义bean处使用
  3. 默认按照类型去容器中寻找对应的组件
  4. 如果找到多个,那么再将属性的名称作为id去容器中查找(例如 private Person lisi )
@Resource

可以和@AutoWired一样实现自动装配,默认按照组件名称进行装配;不支持 @Qualifier & @Pimary (java规范)

@Inject

需要另外导入依赖,可以和@AutoWired一样实现自动装配。只是属性有所不同 (java规范)

标注在构造器、参数、方法、属性上

方法:spring将会自动调用该方法完成属性赋值

@Profile

spring为我们提供可以根据当前环境,动态激活和切换一系列组件的功能

@Profile("dev") //将在开发环境激活

加了环境标识的,只有在环境被激活的时候的会起作用

切换环境的方式:

  • 命令行参数的方式
    -Dspring.profiles.active=dev

  • 使用代码

    AnnotationConfigApplicationContext applicationContext1 = new AnnotationConfigApplicationContext();
    //其实以下步骤将在IOC容器的有参构造函数中 执行,这里手写代替
    applicationContext1.getEnvironment().setActiveProfiles("dev");
    applicationContext1.register(MainConfig.class);
    applicationContext1.refresh();        
    

也可写在类上,使批量生效/失效

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值