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

2022-12-08 17:40:56 浏览数 (1)

Spring核心

Spring核心是 IOC 和 AOP 。

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

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

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

包扫描 组件注解

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

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

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

​编辑

那我们这个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;

}

}

复制代码

​编辑

就像这样。

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

@Configuration

public class ConfigBean {

}

复制代码

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

<?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;

}

复制代码

value和name是一样的,设置的时候,这2个参数只能选一个,原因是@AliasFor导致的

value:字符串数组,第一个值作为bean的名称,其他值作为bean的别名

autowire:这个参数上面标注了@Deprecated,表示已经过期了,不建议使用了

autowireCandidate:是否作为其他对象注入时候的候选bean。

initMethod:bean初始化的方法,这个和生命周期有关,以后详解

destroyMethod:bean销毁的方法,也是和生命周期相关的,以后详解

0 人点赞