烟台当地网站,有限公司简介,wordpress文章标题字体,wordpress文章行距很大核心接口#xff1a; 组件扫描器#xff1a;
开发过程中#xff0c;需要根据需求加载必要的bean#xff0c;排除指定bean 设定组件扫描加载过滤器#xff1a; 名称#xff1a;ComponentScan 类型#xff1a;类注解 位置#xff1a;类定义上方 作用#xff1a;设置…核心接口 组件扫描器
开发过程中需要根据需求加载必要的bean排除指定bean 设定组件扫描加载过滤器 名称ComponentScan 类型类注解 位置类定义上方 作用设置spring配置加载类扫描规则 范例
ComponentScan(valuecom.itzhuzhu, //设置基础扫描路径excludeFilters //设置过滤规则当前为排除过滤ComponentScan.Filter( //设置过滤器type FilterType.ANNOTATION, //设置过滤方式为按照注解进行过滤classesRepository.class) //设置具体的过滤项过滤所有Repository修饰的bean)
public class SpringConfig(){}includeFilters设置包含性过滤器 excludeFilters设置排除性过滤器 type设置过滤器类型
自定义组件过滤器 名称TypeFilter 类型接口 作用自定义类型过滤器 范例
ComponentScan(valuecom.itzhuzhu,excludeFilters ComponentScan.Filter(type FilterType.CUSTOMclassesMyTypeFilter.class) )
public class SpringConfig{}public class MyTypeFilter implements TypeFilter {Override//加载的类满足要求匹配成功public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//通过参数获取加载的类的元数据ClassMetadata classMetadata metadataReader.getClassMetadata();//通过类的元数据获取类的名称String className classMetadata.getClassName();//如果加载的类名满足过滤器要求返回匹配成功if(className.equals(com.itheima.service.impl.UserServiceImpl)){//返回true表示匹配成功返回false表示匹配失败。此处仅确认匹配结果不会确认是排除还是加入排除/加入由配置项决定与此处无关return true;}return false;}
}自定义导入器
bean只有通过配置才可以进入spring容器被spring加载并控制导入器可以不通过bean的方式加载
配置bean的方式如下
XML文件中使用标签配置使用Component及衍生注解配置企业开发过程中通常需要配置大量的bean需要一种快速高效配置大量bean的方式
ImportSelector 名称 ImportSelector 类型接口 作用自定义bean导入器 范例
配置文件
ClassNamecom.itzhuzhu.dao.impl.AccountDaoImp,com.itzhuzhu.dao.impl.BookDaoImpl
pathcom.itzhuzhu.dao.impl.*public class CustomerImportSelector implements ImportSelector {private String expression;public CustomerImportSelector(){try {//初始化时指定加载的properties文件名Properties loadAllProperties PropertiesLoaderUtils.loadAllProperties(import.properties);//设定加载的属性名expression loadAllProperties.getProperty(path);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//1.定义扫描包的名称String[] basePackages null;//2.判断有Import注解的类上是否有ComponentScan注解if (importingClassMetadata.hasAnnotation(ComponentScan.class.getName())) {//3.取出ComponentScan注解的属性MapString, Object annotationAttributes importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());//4.取出属性名称为basePackages属性的值basePackages (String[]) annotationAttributes.get(basePackages);}//5.判断是否有此属性如果没有ComponentScan注解则属性值为null如果有ComponentScan注解则basePackages默认为空数组if (basePackages null || basePackages.length 0) {String basePackage null;try {//6.取出包含Import注解类的包名basePackage Class.forName(importingClassMetadata.getClassName()).getPackage().getName();} catch (ClassNotFoundException e) {e.printStackTrace();}//7.存入数组中basePackages new String[] {basePackage};}//8.创建类路径扫描器ClassPathScanningCandidateComponentProvider scanner new ClassPathScanningCandidateComponentProvider(false);//9.创建类型过滤器(此处使用切入点表达式类型过滤器)TypeFilter typeFilter new AspectJTypeFilter(expression,this.getClass().getClassLoader());//10.给扫描器加入类型过滤器scanner.addIncludeFilter(typeFilter);//11.创建存放全限定类名的集合SetString classes new HashSet();//12.填充集合数据for (String basePackage : basePackages) {scanner.findCandidateComponents(basePackage).forEach(beanDefinition - classes.add(beanDefinition.getBeanClassName()));}//13.按照规则返回return classes.toArray(new String[classes.size()]);}
}Configuration
ComponentScan(com.itzhuzhu)
Import(CustomeImportBeanDefinitionRegistrar.class) // 加载导入器
public class SpringConfig {}自定义注册器 名称ImportBeanDefinitionRegistrar 类型接口 作用自定义bean定义注册器 范例
public class CustomeImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {private String expression;public CustomeImportBeanDefinitionRegistrar(){try {//初始化时指定加载的properties文件名Properties loadAllProperties PropertiesLoaderUtils.loadAllProperties(import.properties);//设定加载的属性名expression loadAllProperties.getProperty(path);} catch (IOException e) {e.printStackTrace();}}Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {//1.定义扫描包的名称String[] basePackages null;//2.判断有Import注解的类上是否有ComponentScan注解if (importingClassMetadata.hasAnnotation(ComponentScan.class.getName())) {//3.取出ComponentScan注解的属性MapString, Object annotationAttributes importingClassMetadata.getAnnotationAttributes(ComponentScan.class.getName());//4.取出属性名称为basePackages属性的值basePackages (String[]) annotationAttributes.get(basePackages);}//5.判断是否有此属性如果没有ComponentScan注解则属性值为null如果有ComponentScan注解则basePackages默认为空数组if (basePackages null || basePackages.length 0) {String basePackage null;try {//6.取出包含Import注解类的包名basePackage Class.forName(importingClassMetadata.getClassName()).getPackage().getName();} catch (ClassNotFoundException e) {e.printStackTrace();}//7.存入数组中basePackages new String[] {basePackage};}//8.创建类路径扫描器ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry, false);//9.创建类型过滤器(此处使用切入点表达式类型过滤器)TypeFilter typeFilter new AspectJTypeFilter(expression,this.getClass().getClassLoader());//10.给扫描器加入类型过滤器scanner.addIncludeFilter(typeFilter);//11.扫描指定包scanner.scan(basePackages);}
}bean初始化过程解析 bean初始化过程解析
BeanFactoryPostProcessor 作用定义了在bean工厂对象创建后bean对象创建前执行的动作用于对工厂进行创建后业务处理 运行时机当前操作用于对工厂进行处理仅运行一次
BeanPostProcessor 作用定义了所有bean初始化前后进行的统一动作用于对bean进行创建前业务处理与创建后业务处理 运行时机当前操作伴随着每个bean的创建过程每次创建bean均运行该操作
InitializingBean 作用定义了每个bean的初始化前进行的动作属于非统一性动作用于对bean进行创建前业务处理 运行时机当前操作伴随着任意一个bean的创建过程保障其个性化业务处理
注意上述操作均需要被spring容器加载才可以运行
bean初始化过程解析
package config.postprocessor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class MyBeanFactory implements BeanFactoryPostProcessor {Override//工厂后处理bean接口核心操作public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println(bean工厂制作好了还有什么事情需要处理);}
}
package config.postprocessor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBean implements BeanPostProcessor {Override//所有bean初始化前置操作public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(bean之前巴拉巴拉);System.out.println(beanName);return bean;}Override//所有bean初始化后置操作public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(bean之后巴拉巴拉);return bean;}
}import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.InitializingBean;public class EquipmentDaoImpl implements EquipmentDao,InitializingBean {public void save() {System.out.println(equipment dao running...);}Override//定义当前bean初始化操作功效等同于init-method属性配置public void afterPropertiesSet() throws Exception {SqlSessionFactoryBean fb;System.out.println(EquipmentDaoImpl......bean ...init......);}
}繁琐的bean初始化过程处理
FactoryBean
对单一的bean的初始化过程进行封装达到简化配置的目的
FactoryBean与BeanFactory区别 FactoryBean封装单个bean的创建过程 BeanFactorySpring容器顶层接口定义了bean相关的获取操作