​将Bean交给Spring容器管理有几种方式?

宅哥聊构架 后端 2022-12-08

Spring核心

Spring核心是 IOC 和 AOP

所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

至于更详细的说明,或者去深入理解Spring这两大核心,不是此篇文章的目的,暂不细说了。

我们在Spring项目中,我们需要将Bean交给Spring容器,也就是IOC管理,这样你才可以使用注解来进行依赖注入。

包扫描+组件注解

针对类是我们自己编写的情况

这种方式是我们日常开发中最常用到的spring将扫描路径下带有@Component@Controller@Service@Repository注解的类添加到spring IOC容器中。

如果你使用过MybatisPlus,那这个就和他的包扫描注入一样。

​将Bean交给Spring容器管理有几种方式?​编辑

 

那我们这个ComponentScan注解,又有三个配置。

配置项一

basePackages用于定义扫描的包的路径。

@ComponentScan(basePackages = "com.timemail.bootmp")
复制代码

比如这样,就是扫描com.timemail.bootmp整个包下的,带有以上指定注解的类,并放入IOC

我在别的文章上找了一个完整的示例:

@Component
public class Person {
    private String name;
 
    public String getName() {
 
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                '}';
    }
}
 
@ComponentScan(basePackages = "com.springboot.initbean.*")
public class Demo1 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);
        Person bean = applicationContext.getBean(Person.class);
        System.out.println(bean);
    }
}
复制代码

//结果
Person{name='null'}
复制代码

这就说明上面代码的Person类已经被IOC容器所管理了。

配置项二

includeFilters包含规则

Filter注解 用 FilterType.CUSTOM 可以自定义扫描规则 需要实现TypeFilter接口实现match方法 其中参数 MetadataReader 当前类的信息(注解,类路径,类原信息…) MetadataReaderFactory MetadataReader的工厂类。

配置项三

excludeFilters移除规则

同包含规则。

这后两个配置项我没怎么用过,也不太熟悉,所以详细使用请自行查阅相关资料。

@Configuration + @Bean

@Configuration + @Bean也是我们常用的一种放入容器的方式。

@Configuration用于声明配置类

@Bean用于声明一个Bean

@Configuration
public class Demo {
    @Bean
    public Person person() {
        Person person = new Person();
        person.setAge(10);
        return person;
    }
}
复制代码

​将Bean交给Spring容器管理有几种方式?​编辑

 

就像这样。

那我们指知道,在SSM里面,通常我们会在xml里面去配置bean

@Configuration
public class ConfigBean {
​
}
复制代码

那我们这个@Configuration注解,就相当于一个Beanxml配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
​
</beans>
复制代码

Bean注解中的属性

我们@Bean注解还有许多属性可以配置。

我们可以查看其源码:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) //@1
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
​
    @AliasFor("name")
    String[] value() default {};
​
    @AliasFor("value")
    String[] name() default {};
​
    @Deprecated
    Autowire autowire() default Autowire.NO;
​
    boolean autowireCandidate() default true;
​
    String initMethod() default "";
​
    String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}
复制代码

  1. value和name是一样的,设置的时候,这2个参数只能选一个,原因是@AliasFor导致的
  2. value:字符串数组,第一个值作为bean的名称,其他值作为bean的别名
  3. autowire:这个参数上面标注了@Deprecated,表示已经过期了,不建议使用了
  4. autowireCandidate:是否作为其他对象注入时候的候选bean。
  5. initMethod:bean初始化的方法,这个和生命周期有关,以后详解
  6. destroyMethod:bean销毁的方法,也是和生命周期相关的,以后详解

Apipost 私有化火热进行中

评论