做网站的视频,新媒体运营工资一般多少,网络推广怎么样,河南省做网站的公司整理一下之前Spring的学习笔记#xff0c;大致有一下几种Spring注入到容器中的方法:
1#xff09;、配置在xml的方式。
2#xff09;、开启包扫描ComponentScan使用Component#xff0c;Service#xff0c;Controller#xff0c;Repository#xff08;其实后三个都继承…整理一下之前Spring的学习笔记大致有一下几种Spring注入到容器中的方法:
1、配置在xml的方式。
2、开启包扫描ComponentScan使用ComponentServiceControllerRepository其实后三个都继承Component注册组件到spring容器里面
3、使用Bean注入
4、使用Import快速导入组件
Configuration
声明为配置类与bean.xml一致
XML方式注入
Sping最开始的用法先定义好xml文件使用ClassPathXmlApplicationContext加载指定xml文件就创建好容器了当Bean过多的时候使用xml配置就显得比较繁琐所以在现在的大环境下这种注入方法已经过时了就简单的提一下
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean iduser classcom.test.SpringCoreTest.test00.bean.Userproperty namename valueTom/propertyproperty nameage value12/property/bean/beans
ComponentScan
需和Configuration注解一起使用与xml当中的context:component-scan base-package /一致表示扫描指定包下的类将带有Component注解的类全部扫描到容器当中
有几个常用的参数需了解一下
basePackages 扫描指定包下的类并且注入到spring容器里面
useDefaultFilters是否使用默认过滤器和excludeFilters、includeFilters配置一起使用
includeFilters包含过滤器为过滤的内容当useDefaultFilters为false的时候才生效
excludeFilters去除指定过滤器过滤的内容当useDefaultFilters为true的时候才能生效
过滤器为ComponentScan的内部注解类Filter classes指定类与type搭配使用
type过滤器的类型org.springframework.context.annotation.FilterType.class枚举类中(共有五种仅记录三种经常使用的类型) ANNOTATION指定过滤哪些注解例如Controller ASSIGNABLE_TYPE指定过滤哪些类 CUSTOM自定义过滤器可继承TypeFilter接口实现match方法
示例
public class SpringTest01Filter implements TypeFilter {/*** param metadataReader 读取当前扫描类的信息* param metadataReaderFactory 可以获取其他任何类的信息*/public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)throws IOException {//获取当前注解信息ClassMetadata classMetadata metadataReader.getClassMetadata();//获取当前扫描类的信息String className classMetadata.getClassName();System.out.println(className);if(className.contains(er))//如果当前扫描类信息包含er的时候注入到Spring容器return true;elsereturn false;}}//配置类
ComponentScan(basePackagescom.test.SpringCoreTest.test01.config,includeFilters {Filter(type FilterType.CUSTOM,classes {SpringTest01Filter.class})
},useDefaultFilterstrue)
Configuration
这里会有个问题为什么在使用过滤器的时候对useDefaultFilters有要求源码中解析
ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(this.registry,componentScan.getBoolean(useDefaultFilters), this.environment, this.resourceLoader);
//该段代码中获取了useDefaultFilters的值
//进入该类中
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,Environment environment, Nullable ResourceLoader resourceLoader) {Assert.notNull(registry, BeanDefinitionRegistry must not be null);this.registry registry;if (useDefaultFilters) {registerDefaultFilters();//useDefaultFilters为true时该方法开启了注册默认过滤器的方法}setEnvironment(environment);setResourceLoader(resourceLoader);}//进入到registerDefaultFilters方法里面
protected void registerDefaultFilters() {//执行了当前方法重置了includeFilters包含的过滤器导致带有Component注解的类都会加载到容器里面所以在useDefaultFilters为true的情况下includeFilters失效的原因在此this.includeFilters.add(new AnnotationTypeFilter(Component.class));ClassLoader cl ClassPathScanningCandidateComponentProvider.class.getClassLoader();try {this.includeFilters.add(new AnnotationTypeFilter(((Class? extends Annotation) ClassUtils.forName(javax.annotation.ManagedBean, cl)), false));logger.trace(JSR-250 javax.annotation.ManagedBean found and supported for component scanning);}catch (ClassNotFoundException ex) {// JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.}try {this.includeFilters.add(new AnnotationTypeFilter(((Class? extends Annotation) ClassUtils.forName(javax.inject.Named, cl)), false));logger.trace(JSR-330 javax.inject.Named annotation found and supported for component scanning);}catch (ClassNotFoundException ex) {// JSR-330 API not available - simply skip.}}
Bean
需和Configuration一起使用容器中的key为方法名bean为返回的对象默认为单例。示例
Configuration
public class SpringConfig01 {Beanpublic User user() {return new User();}//....
}
以下三个注解可以和Bean一起使用
Scope
指定容器组件类型
prototype多例模式当容器创建时并不会创建对象而是在调用时创建一个新的对象
singleton单例模式容器创建时对象也会创建
request主要是针对web应用每提交一次请求都回去创建一个对象
session针对web应用创建一个session创建一个对象
Lazy
懒加载只有当前组件第一次被调用的时候才会去创建对象针对单例模式
Conditional
可指定在某些条件下才能将当前组件注入到容器
参数为继承org.springframework.context.annotation.Condition.class的实现类
/*** param context 可以使用ApplicationContext(上下文)* param metadata 可以获取到注解信息*/public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//获取到BeanFactoryConfigurableListableBeanFactory beanFactory context.getBeanFactory();//可获取环境参数如jvm环境spring环境等等Environment environment context.getEnvironment();String osName environment.getProperty(os.name);if(osName.contains(Windows))//如果当前环境为window则创建当前组件并加载到容器中return true;return false;}
Import
快速导入组件,共三种形式这个算是一个比较主要的注入方式吧在Spring中需要做一些扩展的时候都会需要用到这个比如mybatis-spring融合开启AOP功能等使用的就是这里的第三种方式
1、Import(value { Dog.class,Cat.class })//快速导入到容器中以类的全路径作为bean的ID
2、Import(value { SpringTest03ImportSelector.class })//实现ImportSelector接口
public class SpringTest03ImportSelector implements ImportSelector {public String[] selectImports(AnnotationMetadata importingClassMetadata) {//返回为类的全类名return new String [] {};//注意一下这边必须返回一个空的数组不然启动报错空指针异常}}//在源码org.springframework.context.annotation.ConfigurationClassParser.class类中
private CollectionSourceClass asSourceClasses(String... classNames) throws IOException {ListSourceClass annotatedClasses new ArrayList(classNames.length);//这里的classNames为之前ImportSelector返回的数组为null的话即报错for (String className : classNames) {annotatedClasses.add(asSourceClass(className));}return annotatedClasses;}
3、Import(value { SpringTest03ImportBeanDefinitionRegistrar.class })//实现ImportBeanDefinitionRegistrar接口所有的bean注册都会使用到该接口进行注册
/*** param importingClassMetadata 当前类的注解信息 * param registry BeanDefinition的注册类* 可做条件修改*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean b1 registry.containsBeanDefinition(user);if(b1) {registry.registerBeanDefinition(pig, new RootBeanDefinition(Pig.class));}