1.@Configuration注解 这个相当于配置文件,即告诉spring这个一个配置类。

2.@Bean
给容器注册一个Bean;类型为返回值的类型,id默认是用方法名作为id.
@Configuration public class MainConfig { @Bean public Person per(){ return new
Person("李四",22 ); } }
这个基本就相当于以前采用的xml配置文件如下:
<bean id="per" class="com.learn.entity.Person"> <property name="name" value=
"李四" /> <property name="age" value="22"/> </bean>
3.@ComponentScan
自动包扫描注解
value:指定要扫描的包
excludeFilters=Filter[] 指定扫描的时候按照什么规则排除哪些组件。
includeFilters=Filter[]
指定扫描的时候只需要包含哪些组件。(注意的是包扫描默认的是扫描所有的,也就是use-default-filters=”true”,所以需要设置为false。
这个和配置文件一样)
FilterType.ANNOTATION :按照注解的方式
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.CUSTOM:使用自定义规则。 使用这个需要是TypeFilter的实现类
FilterType.CUSTOM使用 案例如下:
package com.learn.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 MyFilterCustom
implements TypeFilter { /** * metadataReader 读取到的当前正在扫描的类的信息 *
metadataReaderFactory 可以获取到其它任何类的信息 */ public boolean match(MetadataReader
metadataReader, MetadataReaderFactory metadataReaderFactory)throws IOException {
//获取当前类注解的信息 AnnotationMetadata annotationMetadata =
metadataReader.getAnnotationMetadata();//获取当前正在扫描的类的信息 ClassMetadata
classMetadata = metadataReader.getClassMetadata();//获取当前类资源(类路径) Resource
resource = metadataReader.getResource(); String className =
classMetadata.getClassName(); System.out.println("当前扫描的类的信息"+className); if
(className.contains("Controller")){ return true; } return false; } }
@Configuration @ComponentScans(value={ @ComponentScan(value="com.learn",
includeFilters={@Filter(type=FilterType.CUSTOM,classes={MyFilterCustom.class})
},useDefaultFilters=false) }) public class MainConfig { @Bean public Person per
(){return new Person("李四",22 ); } }

FilterType.ASPECTJ:使用ASPECTJ表达式(基本用不到)
FilterType.REGEX :使用正则表达式
@Configuration @ComponentScan(value="com.learn", includeFilters={ @Filter
(type=FilterType.ANNOTATION, classes={Controller.class} )},useDefaultFilters=
false) public class MainConfig { @Bean public Person per(){ return new Person(
"李四",22 ); } }
这个也基本相当于配置文件:
<context:component-scan base-package="com.learn" use-default-filters="false"> <
context:include-filter type="annotation" expression=
"org.springframework.stereotype.Controller"/> </context:component-scan> <bean
id="per" class="com.learn.entity.Person"> <property name="name" value="李四" /> <
property name="age" value="22"/> </bean>
4.@ComponentScans 这个就是多个scan的几个集合,也就是可以定义多个规则。 如果是jdk1.8以后的,本身也是可以多些几次scan。
不用scans也可以
@Configuration @ComponentScans(value={ @ComponentScan(value="com.learn",
includeFilters={@Filter(type=FilterType.ANNOTATION, classes={Controller.class}
)},useDefaultFilters=false) }) public class MainConfig { @Bean public Person per
(){return new Person("李四",22 ); } }
4.@Scope 作用范围

* prototype 多实例的
备注:IOC容器启动并不会去调用方法创建对象放在容器中,而是在每次获取的时候才会调用方法创建对象,且每次创建的都是一个新的,即多实例。
* singleton 单实例的(默认值) 备注:默认在单实例的情况下,IOC容器启动的时候会调用方法创建对象,放入iOC容器中。
以后每次获取就是从容器中拿,即对象都是一个。
* request 同一次请求创建一个实例(web环境中才能用到,且基本不用)
* session 同一个session创建一个实例(web环境中才能用到,且基本不用)
默认单列的情况:
@Configuration public class MainConfig2 { @Bean public Person person(){ return
new Person("张三", 28); } } ApplicationContext context = new
AnnotationConfigApplicationContext(MainConfig2.class); String[]
beanDefinitionNames = context.getBeanDefinitionNames(); for(String
beanName:beanDefinitionNames){ System.out.println("当前bean的名称:"+beanName); }
System.out.println("一共有"+context.getBeanDefinitionCount()+"个bean被定于了"); Object
obj1=context.getBean("person"); Object obj2=context.getBean("person"); System
.out.println("obj1,obj2:"+(obj1==obj2));

使用多例的情况:
@Configuration public class MainConfig2 { @Bean @Scope("prototype") //多例 public
Personperson(){ return new Person("张三", 28); } }

5.@Lazy 懒加载,针对单实例的bean
懒加载:容器启动不创建对象。第一次使用(获取bean)创建的对象,并初始化。
@Configuration public class MainConfig2 { @Bean @Lazy public Person person(){
System.out.println("调用了person方法"); return new Person("张三", 28); } }
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2
.class); String[] beanDefinitionNames = context.getBeanDefinitionNames();
for(String beanName:beanDefinitionNames){ System.out.println("当前bean的名称:"
+beanName); } System.out.println("一共有"+context.getBeanDefinitionCount()+
"个bean被定于了"); System.out.println("-------IOC容器初始化完成,开始调用bean----"); Object
obj1=context.getBean("person"); Object obj2=context.getBean("person"); System
.out.println("obj1,obj2:"+(obj1==obj2));

6.@Conditional 按照一定的条件进行判断,满足条件给容器中注册bean。
@Configuration public class MainConfig2 { @Bean("win") @Conditional
(WindowConditional.class)public Person person1(){ return new Person("Windows",
70); } @Bean("Lin") @Conditional(LinuxConditional.class) public Person person2
(){return new Person("Linux", 80); } } /*** * 是否是linux环境 * @author SpringLi * */
public class LinuxConditional implements Condition{ /** * ConditionContext
判断条件能使用的上下文 * AnnotatedTypeMetadata 注释信息 */ public boolean matches
(ConditionContext context, AnnotatedTypeMetadata metadata) {
//能获取到IOC使用的beanFactory ConfigurableListableBeanFactory beanFactory =
context.getBeanFactory();//获取类加载器 ResourceLoader resourceLoader =
context.getResourceLoader();//获取当前环境信息 Environment environment =
context.getEnvironment();//获取bean定义的注册类 BeanDefinitionRegistry registry =
context.getRegistry(); String property = environment.getProperty("os.name"); if
(property.contains("Linux")){ return true; } return false; } } public class
WindowConditional implements Condition{ /** * ConditionContext 判断条件能使用的上下文 *
AnnotatedTypeMetadata 注释信息 */ public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {//能获取到IOC使用的beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();//获取类加载器
ResourceLoader resourceLoader = context.getResourceLoader();//获取当前环境信息
Environment environment = context.getEnvironment();//获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry(); String property =
environment.getProperty("os.name"); if(property.contains("Window")){ return true
; }return false; } } ApplicationContext context = new
AnnotationConfigApplicationContext(MainConfig2.class); String[]
beanDefinitionNames = context.getBeanDefinitionNames(); for(String
beanName:beanDefinitionNames){ System.out.println("当前bean的名称:"+beanName); }
System.out.println("一共有"+context.getBeanDefinitionCount()+"个bean被定于了");

技术
©2019-2020 Toolsou All rights reserved,
Redis 计数器 高并发的应用pytorch之ResNet18(对cifar10数据进行分类准确度达到94%)在Vue中使用Web Worker函数基本定义和使用‘未完待续 如何建设数据安全体系?最优化方法总结:公式解、数值优化、求解思想c++内存 指针越界检测机制_CrtMemBlockHeadePython垃圾回收与内存泄露蚂蚁集团香港IPO获得中国证监会批准Keras保存与加载模型(JSON+HDF5)