1.@Conditional 按照一定的条件进行判断,当满足条件的时候,bean才注册到ioc 容器中;
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {Environment environment = conditionContext.getEnvironment();
String property = environment.getProperty("os.name");
if(property.contains("window")){
return true;
}
return false;
}
在bean中使用的时候
@Condinal({WindowsCondition.class}) 其中是一个数组
2.@Configurable 配置类,类似老版本的app-bean.xml
@Configurable // 告诉spring 这是一个配置类,启动的时候需要根据这个类的配置加载相关的文件
public class MainConfig{
main(String[] args){
}
}
3.@Bean //给容器注册一个bean,类型为返回值类,@Bean id 默认为方法名字,也可以自己定义@Bean("beanName");
举例:Person.class
@Bean // 表示下面的Bean 会注册到ioc 的容器中 id= "person"
public Person person(){
return new Person();
}
4.@ComponentScan("package") // 指定spring 启动的时候需要扫描的包,一般情况下 和@Configurable 一起使用;
@ComponentScan("com.zhou.spring") // 表示需要扫描的包, 有注解描述的文件 会扫描添加到ioc 容器中;
@Configurablepublic class MainConfig{
main(String[] args){
}
}
5.@lazy 懒加载:单实例bean默认是在ioc容器启动的时候就会创建对象;懒加载就是延迟创建对象,在ioc启动的时候还不加载对象,当第一次使用(获取)bean 的时候才开始创建对象,以后再次调用也不会在进行创建对象;
@Lazy
public Person peron01(){
return new Person();
}
6.@Scope // 表示在ioc 容器中是单实例还是多实例,默认是单实例
@Scope == @Scope("singleton") //表示单实例:容器启动的时候就创建对象 并加入到容器中;之后调用不会再创建bean;
@Scope("protoType") // 表示多实例:容器创建的时候并不会创建对象,再调用的时候才开始创建对象,并且每次调用都会创建一次;
public Person Person02(){
return new Person();
}
7,@import
给容器中注册组件
1、包扫描(component-scan、@Configurable) + 组件标注注解(@Controller、@Service/@Reposity/@Componet)
2 、@Bean 导入第三方bean中的组件
3 、 @Import[快速给容器中导入一个组件]
1.@import(要导入容器中的组件) 组件就会自动的导入到容器中
public class Red{}@import({Red.class}) // 快速的导入Red 文件,导入的类可以很多,所以后面的值是个shuz
@Configuration
public class MainConfig01(){
main(String args[]){
}
}
8.@Filter 过滤器
includeFilters 表示只包含标示的组件 excludeFilters:表示排除标示的组件
@ComponentScan(value="com.spring",excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,classes = {Service.class})})
Filter.annotation 按照注解进行扫描
Filter.type 按照指定类进行扫描
Filter.custom 自定义过滤器
@ComponentScan(value = "com.spring",includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilters.class})})
public class MyTypeFilters implements TypeFilter {
/**
* metaDataReader ,读取到当前正在扫描的类型信息
* metadataReaderFactory :可以获取其他任何信息类
* @param metadataReader
* @param metadataReaderFactory
* @return
* @throws IOException
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解的信息
ClassMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类的资源信息(类型路劲)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("当前类型信息:"+ className );
//过滤掉义类名以er结尾的class
if(className.contains("er"))
return true;
return false;
}
}
9.@Qualifier
和@Autowired 类似,自动装配字段,但是遇见多个 生成相同的bean实例,可能编译器就不知道选哪个,所以就使用qualifier进行修饰
@Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); }
@Bean(name="primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource){ return new JdbcTemplate(dataSource); } @Bean("secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource){ return new JdbcTemplate(dataSource); }