1、@Configuration&@Bean给容器中注册组件
@Configuration及@Bean的使用参考如下代码:
package com.atguigu.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.ComponentScans;
import com.atguigu.bean.Person;
//配置类==配置文件
@Configuration //告诉Spring这是一个配置类
@ComponentScans(
value = {
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false)
}
)
//@ComponentScan value:指定要扫描的包
//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则
public class MainConfig {
//给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
@Bean("person")
public Person person01(){
return new Person("lisi", 20);
}
}
2、@ComponentScan-自动扫描组件&指定扫描规则
@CompoentScan的使用,参考1中以上代码即可。
3、自定义TypeFilter指定过滤规则
参考如下代码:
package com.atguigu.config;
import java.io.IOException;
import org.springframework.core.io.Resource;
import org.springframework.core.type.Annotationmetadata;
import org.springframework.core.type.Classmetadata;
import org.springframework.core.type.classreading.metadataReader;
import org.springframework.core.type.classreading.metadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(metadataReader metadataReader, metadataReaderFactory metadataReaderFactory)
throws IOException {
// TODO Auto-generated method stub
//获取当前类注解的信息
Annotationmetadata annotationmetadata = metadataReader.getAnnotationmetadata();
//获取当前正在扫描的类的类信息
Classmetadata classmetadata = metadataReader.getClassmetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
String className = classmetadata.getClassName();
System.out.println("--->"+className);
if(className.contains("er")){
return true;
}
return false;
}
}
4、@Scope-设置组件作用域
参考如下代码:
5、@Lazy懒加载
6、@Conditional-按照条件注册bean
package com.atguigu.condition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypemetadata;
//判断是否linux系统
public class LinuxCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypemetadata metadata) {
// TODO是否linux系统
//1、能获取到ioc使用的beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2、获取类加载器
ClassLoader classLoader = context.getClassLoader();
//3、获取当前环境信息
Environment environment = context.getEnvironment();
//4、获取到bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
//可以判断容器中的bean注册情况,也可以给容器中注册bean
boolean definition = registry.containsBeanDefinition("person");
if(property.contains("linux")){
return true;
}
return false;
}
}
7、@import-给容器中快速导入一个组件
源代码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface import {
Class>[] value();
}
package com.atguigu.config;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import com.atguigu.bean.Blue;
import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.condition.MyimportBeanDefinitionRegistrar;
import com.atguigu.condition.MyimportSelector;
import com.atguigu.condition.WindowsCondition;
import com.atguigu.test.IOCTest;
//类中组件统一设置。满足当前条件,这个类中配置的所有bean注册才能生效;
@Conditional({ WindowsCondition.class })
@Configuration
@import({ Color.class, Red.class, MyimportSelector.class, MyimportBeanDefinitionRegistrar.class })
// @import导入组件,id默认是组件的全类名
public class MainConfig2 {
// 默认是单实例的
// @Scope("prototype")
@Lazy
@Bean("person")
public Person person() {
System.out.println("给容器中添加Person....");
return new Person("张三", 25);
}
@Bean("bill")
public Person person01() {
return new Person("Bill Gates", 62);
}
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person person02() {
return new Person("linus", 48);
}
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
}
8、@import-使用importSelect
8.1 配置如下:
8.2对应的类需实现importSelector接口
package com.atguigu.condition;
import org.springframework.context.annotation.importSelector;
import org.springframework.core.type.Annotationmetadata;
//自定义逻辑返回需要导入的组件
public class MyimportSelector implements importSelector {
//返回值,就是到导入到容器中的组件全类名
//Annotationmetadata:当前标注@import注解的类的所有注解信息
public String[] selectimports(Annotationmetadata importingClassmetadata) {
// TODO Auto-generated method stub
//importingClassmetadata
//方法不要返回null值
return new String[]{"com.atguigu.bean.Blue","com.atguigu.bean.Yellow"};
}
}
9、@import-使用importBeanDefinitionRegistrar
9.1配置如下:
9.2对应的类需实现importBeanDefinitionRegistrar接口
package com.atguigu.condition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.importBeanDefinitionRegistrar;
import org.springframework.core.type.Annotationmetadata;
import com.atguigu.bean.RainBow;
public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
if(definition && definition2){
//指定Bean定义信息;(Bean的类型,Bean。。。)
RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
//注册一个Bean,指定bean名
registry.registerBeanDefinition("rainBow", beanDefinition);
}
}
}
10、使用FactoryBean注册组件
10.1 配置如下:
10.2对应的类需实现org.springframework.beans.factory.FactoryBean
package com.atguigu.bean; import org.springframework.beans.factory.FactoryBean; //创建一个Spring定义的FactoryBean public class ColorFactoryBean implements FactoryBean{ //返回一个Color对象,这个对象会添加到容器中 public Color getObject() throws Exception { // TODO Auto-generated method stub System.out.println("ColorFactoryBean...getObject..."); return new Color(); } public Class> getObjectType() { // TODO Auto-generated method stub return Color.class; } //是单例? //true:这个bean是单实例,在容器中保存一份 //false:多实例,每次获取都会创建一个新的bean; public boolean isSingleton() { // TODO Auto-generated method stub return false; } }
11、给容器中注册组件-总结
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



