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">
复制代码
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销毁的方法,也是和生命周期相关的,以后详解