Spring注解
@Configuration:告诉spring这是一个配置类,配置类=配置文件
@ComponentScan (value:指定要扫描的包)
- excludeFilters=Filter[]:指定扫描的时候按照什么规则排除那些组件
- includeFilters=Filter[]:指定扫描包的时候只需要包含那些组件
@Bean:给容器中注册一个Bean,类型为返回值的类型,id默认是用方法名作为id。
@Scope:设置组件作用域
- singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是从容器(map.get())直接拿,
- prototype:多实例的:ioc容器启动时并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象。
- request:同一次请求创建一个实例
- session:同一个session创建一个实例
@Lazy:懒加载:单实例bean,默认在容器启动的时候创建对象;懒加载就是容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化。
@Conditional:按照一定的条件进行判断,满足条件给容器注册bean,标注在类上满足条件,这个类中配置的所以bean注册才能生效。
给容器中注册组件:
-
包扫描+组件标注注解(@Controller/@Service/@Repositroy/@Component)[自己写的类]
-
@Bean[导入的第三方包里面的组件]
-
@Import[快速给容器中导入一个组件]:
1). @Import(要导入到容器中的组件)导入组件,id默认是组件的全类名。
2). ImportSelector:返回需要导入的组件的全类名数组。
3). ImportBeanDefinitionRegistrar:手动注册bean到容器中。 -
使用Spring提供的接口FactoryBean(实现工厂Bean)
1).默认获取到的是工厂bean调用getObject创建的对象
2).要获取工厂Bean本身,我们需要给id前面加一个&标识
@Value:使用@Value赋值
- 基本数值:@Value(“张三”)
- 可以写SpEl:@Value("#{20-2}")
- 可以写${}:取出配置文件中的值(在运行环境变量里卖弄的值)
- 使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中;加载完外部的配置文件以后使用${}取出配置文件中的值
自动装配:
Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值
1.@Autowired:自动注入
- 默认优先按照类型去容器中找对应的组件: applicationContext.getBean(BookDao.class);
- 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean(“bookDao”);
- @Qualifiler(“bookDao”):使用@Qualifiler指定需要装配的组件的id,而不是使用属性名
- 自动装配默认一定要将属性赋值好,没有就会报错
可以使用@Autowired(required=false); - @Primary:让Spring进行自动装配的时候,默认使用首选的bean
也可以继续使用@Qualifier指定需要装配的bean的名字
BookService{
@Qualifiler("bookDao")
@Autowired(required=false);
BookDao bookDao;
}
2.Spring还支持是用@Resource(JSR250)和@Inject(JSP330)【java规范的注解】
- @Resource:可以和@Autowired一样实现自动装配功能:默认是按照组件名称进行装配的;
- @Inject:需要导入javax.inject的包,和Autowired的功能一样,没有required=false的功能
- @Autowired:Spring定义的;@Resource、@Inject都是java规范
3.@Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
- 【标注在方法位置】:@Bean+方法参数;参数从容器中获取
- 【标注在构造器上】:如果组件只有一个有参构造器,这个有参构造器的@Aotowired可以省略,参数位置的组件还是可以从容器中获取
- 放在参数位置
4.自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
- 自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件