Spring中的常用注解详情
一:组件添加
-
@Configuration:标注正在一个类上,表示告诉Spring这是一个配置类(配置类==配置文件)
-
@Bean:标注在方法上,给容器注册一个Bean,类型默认方法名作为id,也可以使用Value属性指定id
-
@ComponentScan:在配置类上面添加该注解,Value属性值为需要扫描的包名
-
@Scope设置组件作用域
/*
ConfigurableBeanFactory#SCOPE_PROTOTYPE:多实例的,IOC容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象
ConfigurableBeanFactory#SCOPE_SINGLETON:单实例的(默认值),IOC容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST:同一次请求创建一个实例
org.springframework.web.context.WebApplicationContext#SCOPE_SESSION:同一个session创建一个实例
*/ -
@Lazy-bean懒加载:
/*
* 单实例bean:默认在容器启动的时候创建对象
* 懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化
*/ -
@Import给容器中快速导入一个组件
@Configuration
//@Import导入组件,id默认是组件的全类名
@Import(value = {Color.class, Red.class}) -
给容器中添加Bean的几种方式
给容器中注册组件:
1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
2)、@Bean[导入的第三方包里面的组件]
3)、@Import[快速给容器中导入一个组件]
1)@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
2)ImportSelector:返回需要导入的组件的全类名数组;
3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
4)、使用Spring提供的 FactoryBean(工厂Bean)
1)默认获取到的是工厂bean调用getObject创建的对象
2)要获取工厂Bean本身,我们需要给id前面加一个&
二:Bean的生命周期 : Bean的生命周期:bean创建–>初始化–>销毁的过程
三:组件赋值:
-
@Value:基本类型+string:
public class Person {
//使用@Value赋值
//1、基本数值
//2、可以写SpEL:#{}
@Value(“张三”)
private String name;
@Value("#{20-2}")
private Integer age; -
@PropertySource加载外部配置文件
@Configuration
//使用@PropertySource读取外部配置文件中的属性
@PropertySource(value = {“classpath:/person.properties”})
public class MainConfigOfPropertyValues {
@Bean
public Person person(){
return new Person();
}
}- 自动装配:Spring利用依赖注入(DI)完成对IOC容器中各个组件的依赖关系赋值
@Autowired:自动注入
1)默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
2)如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean(“bookDao”)
3)@Qualifier(“bookDao”):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
4)自动装配默认一定要将属性赋值好,没有就会报错
可以使用@Autowired(required=false) -
读取配置类,配置文件
@RunWith(SpringJUnit4ClassRunner.class) //开启spring的junit单元测试的注解支持 @ContextConfiguration(classes = SpringConfiguration.class)//加载,读取注解的主配置文件 @ContextConfiguration(locations = {"classpath*:/*.xml" )//读取xml文件 classpath:只会到你的class路径中查找找文件。 classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。