这篇文章主要介绍spring的基础注解的使用,为springboot的学习打下基础
如果小伙伴们看springboot中大量的底层基础注解感觉懵懵的话,那么看这篇文章就对了,这篇文章是复习spring的一些注解,可以对学习springboot有帮助。
spring Bean的创建方式
在之前我们注册一个bean可能是这样的:
在spring的配置文件中写一下内容:
<bean id="school" class="com.xxx.school">
<property name="name" value="xxx"></property>
<property name="address" value="xxx"></property>
</bean>
那么没有了spring的配置文件,通过类来注册bean需要怎么样呢
//配置类 == 配置文件
//这个注解的作用就是告诉spring,这是一个配置类
@configuration
public class MyConfig{
//给容器中注册一个bean,类型是返回值的类型,id默认是方法名
@Bean
public School school(){
return new School("xxx","xxx");
}
}
在以前三大框架整合(ssm)的时候,小伙伴肯定会配置过一下内容
<context:component-scan base-package="com.xxx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
这段配置的意思就是:配置包扫描,除了@controller注解的。那么用java类怎么写呢:
//配置类==配置文件
@Configuration
@ComponentScan(value="com.xxx",excludeFilters={
@Filter(type = FilterType.ANNOTATION,classes={Controller.class})
})
@ComponentScan : 意思是进行包扫描
@Filter:过滤条件
这段代码小伙伴可以品位一下,代表的意思和上面的xml配置是一致的
通过以上根据和之前ssm框架的配置文件进行简单的对比,想必小伙伴可以知道通过注解进行配置这么一回事啦,接下来继续复习:
默认的Bean都是单例的
如果需要改变,则在bean上加个@scope
注解。
/**
* scope注解中可以写一个属性来标识bean的作用域
* 1.prototype:多例的,ioc启动并不会调用方法去创建对象放在容器中,而是在每次获取
* 的时候才会调用方法创建对象
* 2.singleton:单实例(默认值),ioc容器启动会调用方法创建对象放在容器中,以后每次获取都是直接从容器中拿出。
* 3.request:同一个请求创建一个实例
* 4.session:同一个session创建一个实例
*/
@scope
@Bean
public School school(){
return new School("xxx","xxx");
}
/**
*由于单实例的bean是在初始化ioc容器的时候就创建,所以可以设置懒加载:加上@Lazy注解
*/
@Lazy
@Bean
public School school(){
return new School("xxx","xxx");
}
根据条件创建一些bean
可以根据自定义条件判断是否要创建bean,参数需要一个实现condition的实现类,用来判断规则。
@Conditional({MyCondition.class})
@Bean
public School school(){
return new School("xxx","xxx");
}
/**
* 上面的MyCondition是一个Condition接口的实现类
*/
public class MyCondition implements Condition{
@Override
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata){
//根据返回值决定是否加载school这个bean是否加进ioc容器中
//true:加,false:不加,这里演示 所以直接返回true
return true;
}
}
**以上介绍了几种向容器中加载bean的方法,来引出spring的注解驱动,下面介绍一下给容器中创建组件的几种方式:
**
- 包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
- @Bean 导入组件
- @Import 快速给容器中导入一个组件
- @Import(要导入到容器中的组件),容器中就会自动注册这个组件,id默认是全类名
- ImportSelector:返回需要导入的组件的全类名数组
- ImportBeanDefinitionRegistrar:手动注册bean到容器中
- 使用Spring提供的FectoryBean(工厂Bean)
详细介绍上面的几种方式
1.import的方式(其中import中还可以填个实现了importSelector的类,进行批量导入,还可以填个实现了ImportBeanDefinitionRegisterar的类):
@Import({Color.class,Red.class})
//@Import方式的导入组件,id默认是全类名
@configuration
public class MyConfig{
//给容器中注册一个bean,类型是返回值的类型,id默认是方法名
@Bean
public School school(){
return new School("xxx","xxx");
}
}
2.实现了FactoryBean方式的:(这个就不再import注解中写了,需要像之前一样的加Bean注解):
public class MyColorBean implements FectoryBean<Color> {
//返回一个Color对象,这个对象会被添加到容器中
@Override
public Color getObject() throws Exception {
return new Color();
}
}
//需要写一个bean注解:
public MyColorBean myColorBean(){
return new MyColorBean();
}
题后话,由于作者水平有限,文章中难免会有歧义的地方,欢迎大家批评指正,作者定会及时改正