目录
1.启动注解功能
- 启动注解扫描,加载类中配置的注解项
<context:component-scan base-package="packageName"/>
说明:
- 在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描
- 扫描过程是以文件夹递归迭代的形式进行的
- 扫描过程仅读取合法的java文件
- 扫描时仅读取spring可识别的注解
- 扫描结束后会将可识别的有效注解转化为spring对应的自愿加入IOC容器
注意:
- 无论是注解格式还是xml配置格式,最终都是将资源加载到IOC容器中,差别仅仅时数据读取方式不同
- 从加载效率上说注解优于xml配置文件
2.bean的定义
- 名称:@Component @Controller @Service @Repository
- 类型:类注解
- 位置:类定义上方
- 作用:设置该类为spring管理的bean
- 格式:
@Component public class ClassName(){ ... }
说明 :
- @Controller @Service @Repository是@Component的衍生注解,功能同@Component一样
相关属性:
- value(默认为类名的首字母小写):定义bean的访问id。
3.bean的作用域
- 名称:@Scope
- 类型:类注解
- 位置:类定义上方
- 作用:设置该类为bean对应的scope属性
- 格式
@Scope public class ClassName(){ ... }
相关属性:
- value(默认为singleton,单例对象):定义bean的作用域。
4.bean的生命周期
- 名称:@PostConstruct(初始化方法) @preDestroy(销毁方法)
- 类型:方法注解
- 位置:方法定义上方
- 作用:设置该方法为bean对应的声明周期方法
- 格式:
@PostConstruct public void init(){ System.out.println("init..."); }
5.加载第三方资源
- 名称:@Bean
- 类型:方法注解
- 位置:方法定义上方
- 作用:设置该方法的返回值为spring管理的bean
- 格式:
@Bean("dataSource") public DruidDataSource createDataSource(){ return ...; }
说明 :
- 因为第三方bean无法在其源码上进行修改,使用@bean解决第三方bean的引入问题
- 该注解用于替代xml配置中的静态工厂与实例工厂创建bean,不区分方法是静态或非静态
- @Bean所在的类必须被spring扫描加载,否则该注解无法生效
相关属性:
- value(默认 方法的名字作为组件的id):定义bean的访问id
6.bean的非引用类型属性注入
- 名称:@Value
- 类型:属性注解、方法注解
- 位置:属性定义上方、方法定义上方
- 作用:设置对应属性的值或对方法进行传参
- 格式:
@Value("${jdbc.username}") private Strign username;
说明:
- value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
- value值仅支持读取properties文件中的属性值,通过类属性将properties中数据传入类中
- value支持SqEL
- @Value注解如果添加到属性上方,可以省略set方法(set方法的目的是为属性赋值)
相关属性:
- value(默认):定义对应的属性值或参数值
7.bean的引用类型属性注入①
- 名称:@Autowired ,@Qualifier
- 类型:属性注解、方法注解
- 位置:属性定义上方、方法定义上方
- 作用:设置对应属性的对象或对方法进行引用类型传参
- 格式
@Autowired(required = false) @Qualifier("userDao") private UserDao userDao;
说明
-
@Autowired默认按照类型装配,当找到多个相同类型的对象,默认优先获取id相同的对象。指定@Qualifier后可以指定自动装配的bean的id
-
@Autowired注解属性required:定义该属性是否允许为null,默认required为true,其意义是当某个属性被@Autowired注解后,其属性必须要被赋值。
-
8.bean的引用类型属性注入②
- 名称:@Primary
- 类型:类注解
- 位置:类定义上方
- 作用:设置类对应的bean按类型装配时优先装配
- 格式
@Primary public class ClassName(){ ... }
注意:@Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级设置无效
9.加载properties文件
- 名称:@PropertySource
- 类型:类注解
- 位置:类定义上方
- 作用:加载properties文件中的属性值
- 格式
@PropertySource("classpath:filename.properties") public class ClassName{ @Value("${userName}") private String userName; }
说明:
-
不支持*通配格式,一旦加载,所有的spring控制的bean中均可使用对应属性值
-
value:设置加载的properties文件名
-
ignoreResourceNotFound:如果资源未找到,是否忽略,默认是false。
-
10.纯注解格式
- 名称:@Configuration,@ComponentScan
- 类型:类注解
- 位置:类定义上方
- 作用:设置当前类为spring核心配置加载类,用于代替xml文件
- 格式
@Configuration @ComponentScan("scanPackageName") public class SpringConfig{ }
说明:
@Lazy
public class ClassName{
...
}
核心配置类用于替换spring核心配置文件,此类可以设置空的,不设置变量与属性
bean扫描工作使用注解@ComponentScan替代,其中括号里边需要标明需要扫描包的路径
注意:
当使用纯注解格式加载对象时,我们需要使用AnnotationConfigApplicationContext.
ApplicationContext ioc=new AnntationConfigApplicationContext(SpringConfig.Class);
11.bean加载控制
- 名称:@Lazy
- 类型:类注解,方法注解
- 位置:bean定义的位置(类上或方法上)
- 作用:控制bean的加载时机,使其延迟加载
- 格式
@Lazy
public class ClassName{
...
}
说明:正常单例对象是在容器创建的时候就创建了该对象,但是如果我们假如暂时并不使用这个对象,大量的创建对象会占用电脑的内存,拖延程序运行的速度,所以我们可以使用@Lazy这个注解标注该单例对象,效果就是在容器创建的时候不在创建该对象,减少无用内存的占用,可以使其在获取该对象的时候才创建该对象,达到了一个多例对象的效果,但是其本质还是单例对象。
12.自定义组件过滤器
- 名称:TypeFilter
- 类型:接口
- 作用:自定义类型过滤器
- 格式
public class MyTypeFilter implements TypeFilter { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { ClassMetadata cm=metadataReader.getClassMetadata(); String name=cm.getClassName(); if(name.equals("com.bukaedu.StudentDao")){ return false; } return false; } }
13.自定义导入器
- 名称:ImportSelector
- 类型:接口
- 作用:自定义bean导入器
- 格式
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.bukadeu.dao.StudentDao"};
}
}
14.自定义注册器
- 名称:ImprotBeanDefinitionRegistrar
- 类型:接口
- 作用:自定义bean定义注册器
- 格式
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata icm, BeanDefinitionRegistry r) { ClassPathBeanDefinitionScanner sc=new ClassPathBeanDefinitionScanner(r,false); TypeFilter tf=new TypeFilter() { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { return true; } }; sc.addIncludeFilter(tf); sc.scan("com.bukaedu"); }